Ustawienie domeny dla zmiennego adresu IP (OpenWRT i DDNS)

Zawartość

Dzisiaj zamierzam poruszyć temat, który dla osób posiadających łącze internetowe bez stałego zewnętrznego adresu IP powoduje problemy, jeżeli na naszym łączu chcemy uruchomić serwer VPN (tak jak opisałem tutaj).

Liczba adresów IP w 4-tej wersji tego protokołu jest praktycznie wyczerpana, w związku z tym oczekiwanie od naszego operatora stałego adresu IP będzie coraz trudniejsze, szczególnie dla użytkowników domowych.

W związku z tym chciałbym rozwiązać ten problem, uruchamiając DDNS na naszym routerze. Dzięki czemu przypiszemy mu (naszemu zewnętrznemu adresowi IP) domenę, która będzie kierowała na nasz router. W momencie, gdy nasz adres IP ulegnie zmianie, zostanie ona automatycznie odświeżona, aby wskazywać na aktualny, nowy adres IP.

W tym celu chciałbym wykorzystać posiadaną przeze mnie domenę, którą obsługuję za pośrednictwem CloudFlare.

Osobiście nie sądziłem, że CloudFlare posiada taką opcję, szczególnie dla użytkowników darmowej wersji usługi. Poszukałem, poczytałem i stwierdziłem, że spróbuje. Oczywiście, jeżeli nie posiadasz domeny obsługiwanej (DNS) przez CloudFlare, dostępne są również inne strony, które oferują tego typu usługę, chociażby NoIP.com.

Nim zaczniemy, warto zaznaczyć, że jeżeli posiadamy łącze internetowe przez 4G/LTE i tego typu podobne, nasz router z reguły nie otrzymuje zewnętrznego adresu IP. W tym przypadku jesteśmy za tak zwanym NAT’em operatora lub też podwójnym NAT’em, co uniemożliwia nam prawidłowe przekierowanie połączeń przychodzących na nasz router. Mimo że będziemy mogli ustawić domenę, to i tak nie będziemy mogli się połączyć z naszym VPN’em. 

Nie każdy operator stosuje tego typu rozwiązania (w UK prawie każdy), więc warto sprawdzić. W tym celu możemy użyć rozwiązania online tj. Port Forwarding Tester. Na naszym routerze musimy w regułach zapory sieciowej (Firewall) otworzyć dowolny port i sprawdzić, czy ta strona widzi go jako otwarty. Jeżeli tak, to istnieje duża szansa, że wszystko będzie działać. 

Zaczynamy…


Instalacja niezbędnych pakietów

W tym celu możemy to zrobić z poziomu przeglądarki (System > Software), odświeżając listę pakietów (Update lists) i instalując luci-app-ddns.

Z poziomu terminala SSH możemy to zrobić w następujący sposób:

opkg update
opkg install luci-app-ddns

Instalując pakiet lubi-app-ddns automatycznie zainstalowany zostanie pakiet podstawowy do obsługi DDNS, czyli ddns-scripts.

Następnie musimy zainstalować pakiet do obsługi DDNS przez CloudFlare ddns-scripts_cloudflare.com-v4. Dokonujemy tego z poziomu przeglądarki w analogiczny sposób lub terminala:

opkg install ddns-scripts\_cloudflare.com-v4

Oprócz CloudFlare dostępne są pakiety dla różnych usług. Listę tych dostępnych znajdziecie tutaj.

Po pomyślnej instalacji i odświeżeniu naszego panelu administracyjnego w przeglądarce internetowej, w sekcji Usług (Services) zobaczymy opcję dynamicznego DNS (Dynamic DNS), do której przechodzimy.

OpenWrt DDNS - 1

Jako że obecnie cała komunikacja, w tym odświeżanie adresu IP odbywa się przez bezpieczne połączenie HTTPS (SSL), a domyślnie wbudowane opcje w naszym routerze nie wspierają tego w pełni, w związku z tym należy zainstalować również zewnętrzny pakiet wget lub curl. Może okazać się, że curl posiadacie już w systemie (pakiet ddns-scripts_cloudflare.com-v4 instaluje go domyślnie), w związku z tym nie ma potrzeby instalacji wget.


Ustawienie domeny na CloudFlare

Na tym etapie ustawimy naszą domenę dla naszego routera. Zakładając, że posiadamy domenę mojadomena.cosik, nasz router będzie używać pod-domeny (sub-domeny) vpn.mojadomena.cosik.

Logujemy się na nasze konto CloudFlare i wybieramy naszą domenę.

W zakładce DNS dodajemy nowy rekord (+ Add Record).

OpenWrt DDNS - 2

Wybieramy rekord typu A, wprowadzamy nazwę naszej subdomeny vpn oraz wstawiamy adres IP. Tutaj możemy stawić, co chcemy. Zalecam NIE-wstawianie naszego aktualnego adresu IP, gdyż musimy się upewnić, że nasza aplikacja działa i po zakończeniu ustawiania, adres IP zostanie podany przez nasz router. Wówczas będzie on taki jak trzeba.

Klikamy również na ikonę chmurki CloudFlare i z Proxied ustawiamy na DNS only.

OpenWrt DDNS - 3

W momencie, gdy wykonamy ping na naszą domenę będziemy widzieli odpowiedź z przypisanego adresu IP, a nie adresu z usługi CloudFlare. W przypadku VPN polecam pozostawienie tego w trybie DNS only

To jeszcze nie wszystko…

Nim przejdziemy do konfiguracji naszego routera potrzebujemy dane do komunikacji i uwierzytelnienia pomiędzy routerem a CloudFlare. W tym przypadku nie używamy nazwy użytkownika i hasła tylko API. W tym celu potrzebować będziemy nasz klucz API (API keys), które znajdziemy w ustawieniach naszego profilu (My Profile), w sekcji tokeny API (API Tokens).

OpenWrt DDNS - 4

OpenWrt DDNS - 5

Następnie klikamy na przycisk View (zobacz) przy Global API key (będziemy potrzebowali ponownie wprowadzić hasło do CloudFlare). W następnym oknie otrzymamy klucz, który kopiujemy i zapisujemy na boku, gdyż będzie nam potrzebny na dalszym etapie.

Wracamy do naszego routera…


Konfiguracja

Przechodzimy do konfiguracji. Dla wygody odbywać się będzie przez przeglądarkę internetową (Services > Dynamic DNS).

OpenWrt DDNS - 6

Na tym etapie skupimy się na ustawieniu naszego adresu IPv4, więc edycję rozpoczniemy od myddns_ipv4.

Oczywiście, CloudFlare obsługuje również DNS po IPv6 i jeżeli nasz usługodawca dostarcza nam również tą pulę adresową, warto dodać odpowiednią domenę z rekordem typu AAAA.

Klikamy na przycisk edytuj (Edit), przy myddns_ipv4 lub tworzymy nową konfigurację, wprowadzając jej nazwę i klikając przycisk dodaj (Add). W moim przypadku utworzyłem cloudflare_ipv4.

W pierwszym kroku przechodzimy do sekcji DDNS Service provider i wybieramy cloudflare.com-v4. Możemy zostać poproszeni o potwierdzenie zmiany (Really change DDNS provider?), co potwierdzamy klikając w przycisk Change provider.

OpenWrt DDNS - 7

Następnie zaznaczmy naszą usługę jako włączoną (Enabled).

W Lookup Hostname wprowadzamy naszą domenę vpn.mojadomena.cosik

W sekcji domena (Domain), wprowadzamy to, co powyżej, z tym wyjątkiem zamiast kropki oddzielającej domenę główną od sub-domeny wprowadzamy symbol @ jak w adresie e-mail tj. vpn@mojadomena.cosik

W polu nazwy użytkownika (Username) prowadzamy nasz email, który używamy do logowania się w usłudze CloudFlare. W polu hasła (Password) wklejamy nasz klucz API (Global API key).

Ustawienie bezpiecznego połączenia HTTPS (Use HTTP Secure), na chwilę obecną pozostawiamy NIE-włączoną.

OpenWrt DDNS - 8.1

OpenWrt DDNS - 8.2

Przechodząc do ustawień zaawansowanych naszej konfiguracji (Advanced Settings), musimy ustawić, jak program będzie sprawdzać nasz zewnętrzny adres IP oraz jak zewnętrzny adres IP będzie określany.

W przykładzie posłużymy się stroną checkip.dyndns.com

W sekcji IP address source wybieramy URL oraz w URL to detect wprowadzamy: http://checkip.dyndns.com (o ile nie jest już domyślnie wprowadzony).

Możemy również wybrać, aby adres IP odczytywany był z odpowiedniego interfejsu sieciowego, wówczas wystarczy zostawić IP address source jako Network, oraz w sekcji Network wybieramy interfejs (domyślnie wan).

W części Event Network wybieramy, przez który interfejs sieciowy będzie odbywać się komunikacja w celu wykrycia zewnętrznego adresu IP. W moim przypadku, gdy posiadam dwa połączenia (wan oraz awaryjne 4g), wybrałem wan.

OpenWrt DDNS - 9

Resztę zostawiamy bez zmian i klikamy Zapisz i Zastosuj (Save & Apply).

Teraz wystarczy włączyć naszą usługę używając przycisku Start.

OpenWrt DDNS - 10

W momencie, gdy nasza usługa działa, otrzymamy informację w pozycji Last update, kiedy adres został odświeżony. Częstotliwość odświeżania ustawiamy w sekcji Timer Settings w ustawieniach naszej konfiguracji (dostosowujemy w miarę naszych potrzeb).

OpenWrt DDNS - 11

Aby sprawdzić, czy aby na pewno wszystko działa, możemy wykonać komendę ping

ping vpn.mojadomena.cosik

Lub zalogować się w panelu administracyjnym CloudFlare i sprawdzić, jaki adres IP widnieje przy naszym rekordzie.

Teraz, w momencie, gdy nasz adres ulegnie zmianie, nasz skrypt automatycznie sprawdzi nasz zewnętrzny adres IP. W momencie, gdy jest taki sam, jak widniejący w ustawieniach CloudFlare, będzie czekał na następną próbę. Gdy adres IP będzie inny, niż ten w CloudFlare zostanie on automatycznie odświeżony.

Ale to jeszcze nie wszystko…


Komunikacja przez bezpieczne połączenie HTTP (SSL)

W momencie ustawienia naszej konfiguracji pominąłem sekcję Use HTTP Secure. W momencie, gdy chcemy, aby nasze odświeżenie adresu IP i cała konfiguracja pomiędzy naszym routerem a CloudFlare odbywała się w sposób bezpieczny/szyfrowany (wysoce zalecane!), musimy jeszcze ustawić kilka rzeczy.

W pierwszej kolejności zatrzymujemy naszą usługę, którą włączyliśmy powyżej, klikając na przycisk PID: xxxx.

W momencie, gdy usługa jest zatrzymana, zalecam przejść na CloudFlare i w ustawieniach DNS zmienić adres IP  naszego aktualnego, jeszcze raz na jakiś wymyślony tj. 123.123.123.123. Wówczas, po poprawnych zastosowaniu poniższych kroków będziemy w łatwy sposób zweryfikować, czy wszystko działa a adres IP się odświeża.

Na następnym etapie możemy zainstalować pakiet ca-certificates z poziomu panelu sterowania lub terminala, jednakże nie zawsze to działa tak, jak należy w związku z tym użyjemy zalecaną metodę.

Z poziomu terminala wykonujemy następującą komendę:

mkdir -p -m0./etc/ssl/certs
curl -o /etc/ssl/certs/ca-certificates.crt https://curl.haxx.se/ca/cacert.pem

W przypadku gdy na początku zdecydowaliśmy się na wykorzystanie wget zamiast curl, powyższa komenda powinna zostać zastąpiona następującą:

mkdir -p -m0./etc/ssl/certs
wget  --no-check-certificate -O /etc/ssl/certs/ca-certificates.crt http://curl.haxx.se/ca/cacert.pem

Następnie sprawdzamy, czy wszystko działa i nie mamy żadnych błędów przy pomocy komendy:

curl -I -v https://google.com

Jeżeli mamy błąd typu:

\* Error reading ca cert file /etc/ssl/certs/ca-certificates.crt - mbedTLS: (-0x2180) X509 - The CRT/CRL/CSR format is invalid, e.g. different type expected
curl: (77) Error reading ca cert file /etc/ssl/certs/ca-certificates.crt - mbedTLS: (-0x2180) X509 - The CRT/CRL/CSR format is invalid, e.g. different type expected

Prawdopodobnie certyfikaty zostały poprane niepoprawnie przez curl. W tym wypadku zalecam pobranie ich przy pomocy metody z wget.


Przechodzimy do konfiguracji naszego wcześniej ustawionej konfiguracji cloudflare_ipv4 w Dynamic DNS. Klikamy przycisk edytuj (Edit). W zakładce podstawowej (Basic Settings) zaznaczamy Use HTTP Secure i klikamy Zapisz i Zastosuj (Save & Apply).

Włączamy naszą konfigurację używając przycisku Start (tak jak poprzednio)**. **

Sprawdzamy, czy nasz adres IP się odświeżył podobnie jak w poprzednim kroku. Jeżeli wszystko wykonaliśmy prawidłowo, wszystko powinno działać.

Na tym etapie można skończyć.


Jeżeli ustawiałeś dodatkowe połączenie internetowe zgodnie z moim wpisem, przeczytaj dalej, jak poprawnie ustawić reguły, aby odświeżenie IP odbywało się tylko przez połączenie, które mamy do tego przeznaczone.


Obsługa wielu połączeń internetowych z DDNS

Jeżeli konfigurowałeś twój router do obsługi dwóch (lub więcej) połączeń internetowych, szczególnie w trybie, gdy podstawowe zawiedzie awaryjne (4G w moim przypadku), automatycznie jest uruchamiane, możesz nie chcieć, aby domena DDNS przypisana była do adresu IP z drugiego połączenia, szczególnie gdy to drugie nie ma bezpośredniego, zewnętrznego adresu IP.

W tym przypadku musimy nieco zmodyfikować nasze Policies oraz Rules w mwan3.

Najpierw dodajemy polisę Policy, która używać będzie tylko głównego połączenia. W moim przypadku nazwałem je wan_only i ustawiłem Members used tylko wan_m1_w1.

OpenWrt DDNS - supplement - 1

Dalej w Rules dodałem regułę nazwaną ddnd. W jej ustawieniach sprecyzowałem tylko Destination address na checkip.dyndns.com oraz przypisałem Policy (Policy assigned) na wan_only.

Pozostało tylko przesunięcie reguły ddns na samą górę listy, aby była w pierwszej kolejności używana.

OpenWrt DDNS - supplement - 2



Automatyczna aktualizacja certyfikatów

Tak jak oprogramowanie w OpenWRT, również certyfikaty wymagają co jakiś czas odświeżenia. W zawiązku z tym warto dodać do harmonogramu (Scheduled Tasks) komendę, która co jakiś czas (raz w miesiącu) zrobi to za nas.

Przechodząc do System > Scheduled Tasks dodajemy następującą linię:

Dla curl

00 3 1 \* \* /usr/bin/curl --silent --remote-name --time-cond /etc/ssl/certs/ca-certificates.crt -o /etc/ssl/certs/ca-certificates.crt https://curl.haxx.se/ca/cacert.pem >/dev/null 2>&1

Dla wget

00 3 1 \* \* /usr/bin/wget -q --timestamping --no-check-certificate -O /etc/ssl/certs/ca-certificates.crt http://curl.haxx.se/ca/cacert.pem >/dev/null 2>&1

Spowoduje to, że curl/wget porówna porównany plik z plikiem pobieranym i jeżeli pobierany plik jest nowszy, zostanie pobrany i zaktualizowany. W przypadku gdy plik jest taki sam, pobieranie zostanie zignorowane do następnego razu.

Wbudowany w OpenWRT wget nie posiada opcji sprawdzania czasu (--timestamping) dla plików, w tym celu należy zainstalować jego najnowszą wersję:

opkg update
opkg install wget

Całość uruchomi się każdego pierwszego dnia miesiąca o godzinie 3 w nocy.


Mam nadzieję, że powyższy wpis okazał się przydatny. Zachęcam do dodania komentarza, jeżeli masz jakiś problem.

Pozdrawiam.


Credits

Dołącz do dyskusji