DNS over HTTPS czyli szyfrowany DNS w RouterOS

W niedawno wydanej wersji systemu RouterOS o numerze 6.47 pojawiła się długo wyczekiwana i bardzo przydatna funkcjonalność. Jest nią możliwości szyfrowanej komunikacji z zewnętrznym serwerem DNS. W tym artykule postaram się przedstawić jak krok po kroku ją skonfigurować.


Artykuł został przygotowany przy użyciu systemu RouterOS w wersji 6.47 (stable).

Kilka słów o funkcjonalności DNS over HTTPS

Domyślnie system DNS wykorzystuje w gruncie rzeczy prostą komunikację opartą na porcie 53 protokołu UDP. Tak to działa praktycznie od zawsze i wszystko było by super gdyby nie jeden szczegół. Taka komunikacja nie jest w żaden sposób szyfrowana. Co za tym idzie nie mamy pewności że dostajemy odpowiedź rzeczywiście z tego serwera z którego byśmy tego oczekiwali. Umożliwia to np. modyfikację pakietów „w locie” lub przekierowywanie ich do innego serwera.

Standard DoH (DNS over HTTPS) zmienia podejście do komunikacji klient<->serwer doprowadzając do tego że jest to ruch praktycznie identyczny do tego jaki generujemy wchodząc na jakąś stronę protokołem HTTPS. Szyfrowanie danych zmniejsza prawdopodobieństwo ingerencji w nie praktycznie do zera. A sama komunikacja odbywa się na porcie TCP 443 czyli takim jaki używany jest do szyfrowanego ruchu WWW (HTTPS).

W tym poradniku przedstawię konfigurację na przykładzie usługi Cloudflare czyli popularnego 1.1.1.1.


Konfiguracja

Konfigurację DoH wykonujemy w dotychczasowym menu IP->DNS gdzie znajdziemy nowe pole „Use DOH Server”.

Wpisujemy tam adres do którego będzie się komunikował RouterOS w celu rozwiązania nazw domenowych. Od razu powiem że nie jest to po prostu adres IP jak w przypadku klasycznego DNS’a.

Jeśli chodzi o adresy usługi DoH wyglądają one następująco:

Cloudflare:
https://1.1.1.1/dns-query
https://1.0.0.1/dns-query

Google:
https://dns.google/dns-query

Taki adres wpisujemy w polu „Use DoH Server”:

Jeśli korzystamy z serwera DoH podając jego nazwę domenową (a nie adres IP) wówczas powinniśmy dodać statyczny wpis DNS dla tej domeny w konfiguracji RouterOS. Jest to poniekąd konieczne po pierwsze z punktu widzenia bezpieczeństwa (jesteśmy pewni do jakiego adresu IP będzie komunikował się RouterOS). Po drugie ponieważ RouterOS nie mając podanych klasycznych serwerów DNS nie będzie potrafił rozwikłać adresu serwera DoH z jakim ma się skomunikować.

Korzystając z DoH możemy podać tylko 1 adres serwera zewnętrznego. Co ważne ten parametr nie jest przekazywany przez DHCP do klientów (w przypadku pustej wartości DNS w konfiguracji sieci serwera DHCP).

Co warte podkreślenia szyfrowana komunikacja odbywa się tylko na odcisku RouterOS<->Server gdy RouterOS jest klientem i pyta się zewnętrznego serwera. Komunikacja stacji klienckich do RouterOS gdy to RouterOS jest lokalnym serwerem DNS odbywa się po staremu i tutaj nie ma żadnych nowości.

Tak więc chcąc korzystać z szyfrowanego DNS musimy:

  • usunąć ewentualne wpisy z pola Servers w konfiguracji DNS
  • zezwolić na zapytania DNS do naszego MikroTik’a zaznaczając „Allow Remote Requests” (wymaga stosownego zabezpieczenia w firewall)
  • wprowadzić stosowne adresy IP serwerów DNS w konfiguracji DHCP (będą to zapewne adresy interfejsów LAN)

Więcej informacji o tych czynnościach znajdziesz TUTAJ.

Po wykonaniu powyższych kroków nasz MikroTik korzysta już z szyfrowanej komunikacji z zewnętrznym serwerem DNS.

Niby wszystko jest super ale…


Weryfikacja certyfikatu serwera

No właśnie RouterOS pyta się już zewnętrznego serwera w sposób szyfrowany. Natomiast nadal nie mamy pewności czy ktoś nie podszył się pod serwer. Czysto teoretycznie potencjalny atakujący generując swój certyfikat SSL (self-signed) przy braku jego weryfikacji przez klienta może podszyć się pod serwer. Z punktu widzenia klienta będzie to nadal komunikacja szyfrowana nie budząca żadnych zastrzeżeń.

Rozwiązaniem tego problemu jest weryfikacja certyfikatu którym przedstawia się serwer z jego certyfikatem CA. W ten sposób sprawdzamy czy certyfikat serwera został podpisany przez odpowiedni (wynikający z łańcucha certyfikatów) certyfikat CA.

Włączenie weryfikacji certyfikatu serwera w usłudze DNS sprowadza się do zaznaczenia pola „Verify DoH Certificate”. Natomiast taka konfiguracja nie będzie działać bo RouterOS nie wie z czym ma porównać certyfikat serwera. Pozostawienie takiej konfiguracji będzie skutkować nie działaniem usługi DNS co zostanie zarejestrowane w logu komunikatem:

DoH server connection error: SSL: handshake failed: unable to get local issuer certificate (6)

Ze względu że RouterOS nie ma wbudowanego magazynu certyfikatów (tak jak mają to systemy operacyjne lub przeglądarki). Musimy pobrać plik z publicznym certyfikatem CA i wrzucić go do RouterOS. W dokumentacji usługodawców DoH znajdują się linki do pobrania tych plików. Ja natomiast przedstawię inny (nie wymagający nadmiernego szukania) sposób.

Używając przeglądarki internetowej (u mnie jest to Google Chrome) wpisujemy adres serwera DoH (wyłączenie domenę bez dalszej części czyli np. https://1.1.1.1/ lub https://dns.google/) i w pasku adresu wchodzimy w informację o połączeniu. Następnie klikamy w przycisk z napisem Certyfikat.

UWAGA Przykładowy serwer Cloudflare jest dostępny pod wieloma adresami URL (np. 1.1.1.1 lub one.one.one.one). Każdy z tych adresów może należeć do innego certyfikatu CA.

W nowo otwartym oknie przechodzimy do zakładki „Ścieżka certyfikacji” następnie zaznaczamy certyfikat najwyższego poziomu i klikamy „Wyświetl certyfikat”.

Następnie w kolejnym oknie w zakładce Szczegóły klikamy „Kopiuj do pliku”.

W przypadku systemów Windows otworzy nam się kreator exportu certyfikatów. Jego obsługa sprowadza się do klikania Dalej podając w pewnym miejscu nazwę pliku do jakiego ma zostać wyeksportowany certyfikat oraz jego lokalizację zapisu.


Powstały plik wrzucamy do systemu RouterOS. Następnie wchodzimy w menu System->Certificates klikamy w Import i wybieramy nasz plik z certyfikatem.

Publiczny certyfikat CA został zaimportowany do systemu.

Od tej chwili możemy już korzystać z usługi DNS over HTTPS z weryfikacją certyfikatu serwera.