Dynamiczny DNS z CloudFlare

Ze względu na zmianę umowy internetowej, UPC wymieniło mi router, tym samym pozbywając mnie dzierżawy IPv4, a zamiast tego dostarczając dzierżawę IPv6, które potencjalnie będzie się co tydzień zmieniać. W obec tego nadszedł czas zabezpieczyć mój domowy serwer przed brakiem dostępu spowodowanym zmianą IP.

Cała historia zaczęła się kiedy UPC zapowiedziało podniesienie opłaty abonamentowej o 8 złotych z początkiem lutego. Kiedy wreszcie udało mi się dodzwonić na infolinię to dowiedziałem się że jeśli zobowiążę się na 2 lata, to mi ceny nie podniosą, ale za to dostanę nowy router, który “jest nowszy, więc na pewno nie będzie gorszy”.

Skracając opowieść, spędziłem piątek i sobotę, analizując opcje, hackując nowy modem, przy czym hackowanie okazało się zbyteczne.

Modem to Connect Box (CBN ch7465lg) z nałożonymi ograniczeniami, żeby człowiek sobie nie mógł skonfigurować.

Zacząłem od próby przekierowania portów. Tylko że interfejs tę opcję ma ukrytę. Nawet udało mi się zrobić reverse engineering tego jak to mniej więcej działa i ustawić przekierowanie portów, ale bez sensu, bo wychodzi na to, że i tak nie jest obsługiwane.

Potem próbowałem użyć UPnP, gdzie można ustawić przekierowanie portów przez specjalny protokół. Również bez rezultatu.

Dlaczego?

Ponieważ przekierowanie portów ma sens tylko w przypadku IPv4 i NAT. Natomiast tu mamy doczynienia z siecią IPv6 i ewentualnym tunelowaniem DS-Lite.

Dobra, więc okazuje się, że mam publicznie widoczne adresy IPv6 - tak jak powinno to działać.

Przy czym miałem problemy trochę z DHCPv6, bo zamknąłem sobie za dużo portów na firewallu. A, bo firewall routera wyłączyłem.

Tak wygląda moje /etc/iptables/rules.v6 (paczka iptables-persistent)

*filter
:INPUT DROP
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p ipv6-icmp -j ACCEPT
-A INPUT -p tcp --dport 22 -j ACCEPT
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT
-A INPUT -p udp --dport 546 -j ACCEPT
COMMIT

Przy użyciu polecenia

dhclient -6 wlp3s0  # -v (verbose)

można odnowić/uzyskać dzierżawę DHCPv6.

Ok, dostałem IP, które mogę sprawdzić przy pomocy ifconfig.

Ale kolejnym krokiem było przygotowanie sprytnego skryptu, który wypisuje wyłącznie globalne IPv6 (zakładamy że jest jedno)

#!/bin/bash
ip -6 addr show wlp3s0 scope global | grep inet6 \
	| sed "s/.*inet6 //g" | sed "s%/.*%%g"

który umieściłem w folderze domowym w pliku ip6 i dodałem uprawnienia wykonywania (chmod +x).

Teraz do gry wchodzi CloudFlare.

Moje domeny są podpięte pod CloudFlare, ponieważ

  1. Część zapytań jest cache’owanych
  2. Mam darmowe HTTPS na stronach statycznych (np. z gh-pages)
  3. Mają dobre serwery DNS

No i kolejny plus, mają programowalne API. Wobec tego poświęciłem chwilę i nastukałem skrypt w Pythonie, który sprawdza, czy zmieniło mi się IP, a jeśli tak, to aktualizuje wpis DNS w CloudFlare.

Taki skrypt zapisałem sobie jako ddns.py i następnie dodałem wpis do crontab -e

*/15 * * * * /home/manio/ddns.py

Czyli skrypt uruchamia się co 15minut. Jak jest zmiana IP to aktualizuje DNS, a jak nie to nic nie robi.