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 we wpisie Instalacja serwera VPN na routerze z OpenWrt (WireGuard).

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órej wpisy DNS 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 zarządzanej (wpisy 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…

Sprawdzone w wersji OpenWrt 21.02 oraz OpenWrt 22.03


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. Dokonujemy tego z poziomu przeglądarki w analogiczny sposób lub terminala:

opkg install ddns-scripts-cloudflare

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 na 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 instaluje go domyślnie), w związku z tym nie ma potrzeby instalacji wget (który z reguły też jest dostępny w systemie).


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 sub-domeny vpn oraz wstawiamy adres IP. Tutaj możemy ustawić, 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 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) wprowadzamy nasz email do usługi 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.

Tutaj istnieje kilka opcji.

Jeżeli nasz router widzi zewnętrzny adres IP z poziomu interfejsu (Network > Interfaces) to wystarczy wybrać opcję interfejs (Interface). W przypadku gdy w interfejs ma przypisany prywatny adres IP, na przykład 192.168.8.2, wówczas musimy użyć innych opcji do określenia adresu IP. Poniżej opiszę metodę z opcją URL.

Dla osób, które używają DDNS wraz z mwan3 (zobacz wpis: Dodanie drugiego połączenia internetowego do routera z OpenWrt), odsyłam do innego punktu tego artukułu, w którym opiszę inną metodę pobrania zewnętrznego adresu IP z wykorzystaniem skryptu (Script).

W przykładzie z opcją URL 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).

Upewnij się, że adres jest http a nie https.

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 inną metodę.

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

mkdir -p /etc/ssl/certs
curl -k -o /etc/ssl/certs/ca-certificates.crt https://curl.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 /etc/ssl/certs
wget  --no-check-certificate -O /etc/ssl/certs/ca-certificates.crt http://curl.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ł tak, jak w poprzednim kroku. Jeżeli wszystko wykonaliśmy prawidłowo, wszystko powinno działać i powinniśmy zobaczyć nasz adres IP.

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 politykę 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ą ddns.

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


Obsługa wielu połączeń internetowych z DDNS (gdy powyższe rozwiązanie nie działa) #

Sprawdzone z mwan3 w wersji 2.11.1-1 na OpenWrt 22.03.0

W wersji mwan3 na OpenWrt 22.03.0, w regule (Rule) nie ma możliwości ustawienia adresu domeny (tutaj checkip.dyndns.com).

W tym przypadku konfiguracja zwraca problem (Expecting: valid IP address or prefix).

W związku z tym nie możemy wykorzystać powyższej metody, ale jest na to rozwiązanie.

Zakładając, że nasze połączenie posiada stały prywatny adres IP (w moim przypadku 192.168.8.2), ustawiając odpowiednią regułę (Rule) w mwan3 oraz przygotowując prosty skrypt, który będzie odczytywał nam zewnętrzny adres IP poprzez dany interfejs (w moim przypadku 4G), konfigurujemy stosownie ddns aby te restrykcje ominąć.

W przykładzie z opcją Script posłużymy się stroną icanhazip.com.

Najpierw sprawdźmy, czy możemy poprawnie odczytać adres IP z poziomu terminala następującą komendą:

curl --interface 192.168.8.2 'http://icanhazip.com'

W odpowiedzi powinniśmy odczytać nasz adres IP, tak samo, jak byśmy odwiedzili tą stronę bezpośrednio z poziomu przeglądarki, korzystając z powyższego odnośnika.

Jeżeli wszystko działa, pora na przygotowanie naszego skryptu, który nazwiemy getIP_4G i zapiszemy bezpośrednio w folderze /root.

printf "curl --interface 192.168.8.2 'http://icanhazip.com'" > getIP_4G

Aby można było go uruchomić, dodajemy prawa uruchamiania oraz uruchamiamy go w celu weryfikacji.

chmod +x getIP_4G
./getIP_4G

Teraz gotowi jesteśmy, aby skonfigurować resztę po stronie routera z poziomu przeglądarki internetowej.

W pierwszej kolejności, w ustawieniach mwan3 (Network > MultiWAN Manager) dodajemy regułę (Rule), w której jako adres, z którego będziemy się komunikować to adres prywatny naszego interfejsu (w moim przypadku 192.168.8.2). Resztę pozostawiamy domyślnie niewypełnioną, a jako politykę wybieramy komunikację tylko przez nasz docelowy interfejs (w moim przypadku 4Gbackup_only).

MultiWan mwan3 Rule 4G interface

Teraz przechodzimy do konfiguracji naszej domeny (Services > Dynamic DNS).

Edytując (Edit) naszą konfigurację przechodzimy do zakładki ustawień zaawansowanych (Advances Settings) i zmieniamy źródło naszego adresu IP (IP address source) z wcześniej wybranego URL na skrypt (Script).

W poniższym polu Script wprowadzamy lokalizację naszego skryptu, który utworzyliśmy wcześniej.

/root/getIP_4G

DDNS > Advances Settings > Script > getIP_4G

Zapisujemy zmiany (Save) oraz potwierdzamy wszystko przyciskiem zapisz i zastosuj (Save & Apply).

Jeżeli nasza konfiguracja była już uruchomiona, wówczas klikamy przycisk Reload aby ją przeładować, lub przycisk Start aby ją uruchomić.

I tak powinniśmy otrzymać nasz zewnętrzny adres IP metodą Script.

Aby to sprawdzić, klikając przycisk Edit, przechodząc do zakładki Log File Viewer i odczytując zapis (klikając Read / Reread log file) powinniśmy zobaczyć coś takiego:

 104831       : #> /root/getIP_4G >/var/run/ddns/cf_dynamic.dat 2>/var/run/ddns/cf_dynamic.err
 104832       : Local IP '188.30.29.121' detected via script '/root/getIP_4G'
 104832       : Update needed - L: '188.30.29.121' <> R: '123.123.123.123'
 104832       : parsing script '/usr/lib/ddns/update_cloudflare_com_v4.sh'
...
 104835  info : Update successful - IP '188.30.29.121' send
 104835       : Waiting 600 seconds (Check Interval)

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 -k --silent --remote-name --time-cond /etc/ssl/certs/ca-certificates.crt -o /etc/ssl/certs/ca-certificates.crt https://curl.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.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

Komentarze