Kategorie
Sprzęt

Bezpieczny DNS

Ostatnio zaktualizowany

Jeżeli doszedłeś do tego punktu, możliwe, że zaświeciła ci się żaróweczka nad głową, która przerodziła się w znak zapytania.

Jeżeli ustawiliśmy bezpieczny DNS w przeglądarce, co się dzieje, jeżeli inne programy nawiązują połączenia z wykorzystaniem serwera nazw. Otóż te niestety nie są zabezpieczone (z wyjątkiem aplikacji mobilnych z wykorzystaniem aplikacji 1.1.1.1).

Zapytasz więc, jak zabezpieczyć całą sieć i wszystkie programy w sieci wykorzystujące DNS przed wścibskimi osobami postronnymi, lub też osobami z naszej sieci domowej, które nie do końca używają nasz internet do celów do których powinny (szpiegują nas samych).

Otóż ta sprawa nie jest już taka prosta, ale możliwa.

Najlepszym rozwiązaniem byłoby włączenie DoH po stronie naszego routera. I nie mówię tutaj tylko o ustawieniu adresów DNS CloudFlare na routerze dla całej sieci (co i tak powinieneś włączyć), gdyż zapytania do serwerów nazw nadal będą wysyłane w postaci czystego, niezabezpieczonego tekstu.

Niestety, routery standardowo otrzymywane od operatorów i usługodawców internetowych nie mają możliwości włączenia DNS over HTTPS w standardzie i nic na to (z reguły) nie możemy poradzić.

Jeżeli natomiast mamy własny router, który do tego wybraliśmy, nie tylko żeby robił swoje, ale również, żeby oferował dodatkowe, zaawansowane opcje, z pomocą może nam przyjść OpenWRT.

OpenWRT to alternatywne oprogramowanie dla naszego routera, które zmienia go bardziej w box oparty na systemie Linux. Otwiera nam ono opcje na zaawansowane konfiguracje.

Aby sprawdzić, czy nas sprzęt obsługuje OpenWRT, wystarczy przejść na stronę: https://openwrt.org/toh/views/toh_fwdownload i poszukać.


Nie obejmę w tym wpisie metody instalacji OpenWRT. To pozostawiam wam, gdyż i tak ten wpis jest dość długi.

W moim przypadku, gdy używam nisko budżetowego routera ASUS RT-AC57U (https://openwrt.org/toh/hwdata/asus/asus_rt-ac57u), wystarczyło włączyć SSH, pobrać oprogramowanie, wysłać je do routera za pomocą SFTP i z wykorzystaniem pojedynczej komendy wgrać. Po ponownym uruchomieniu router wystartował z OpenWRT.


W 2018 na oficjalnym blogu CloudFlare Juande Ali poruszył sposób włączenia szyfrowania zapytań DNS z wykorzystaniem protokołu TLS – DNS over TLS (DoT). 

Sprawdziłem i potwierdziłem, że ta metoda działa. Wszelkie zapytania w sieci lokalnej do serwera nazw w internecie są szyfrowane z wykorzystaniem TLS i nie da się odczytać jaki adres odwiedzamy. To, jak użyć DoT zamiast DoH napiszę w dalszej części tego wpisu.

Zacznijmy najpierw od DNS over HTTPS.


DNS over HTTPS (OpenWRT)

A więc, jeżeli zdecydowaliśmy się uruchomić DoH na naszym routerze z OpenWRT, zaczynamy następująco.

W pierwszej kolejności zaczynamy od aktualizacji naszego routera i oprogramowania.

Logujemy się za pomocą SSH i wykonujemy komendę:

opkg update

Która zaktualizuje nam informację o dostępnych pakietach.

Następnie:

opkg list-upgradable | cut -f 1 -d ' ' | xargs opkg upgrade

Która zaktualizuje nam pakiety używane w routerze do najnowszych wersji.

Poprzez przeglądarkę internetową logujemy się do naszego routera i przechodzimy do Sieć (Network) > DHCP i DNS (DHCP and DNS).

W zakładce Ustawienia Ogólne (General Settings) przechodzimy do DNS forwardings i wprowadzamy następujące serwery CloudFlare DNS:

1.1.1.1
1.0.0.1
2606:4700:4700::1111
2606:4700:4700::1001

Po czym wybieramy Zapisz i Zastosuj (Save & Apply).

Następnie przechodzimy do Sieć (Network) > Interfejsy (Interfaces) gdzie edytujemy (Edit) nasz LAN. Podobnie jak powyżej, w sekcji Używaj niestandardowych serwerów DNS (Use custom DNS servers) wprowadzamy serwery CloudFlare DNS.

Ponownie wybieramy Zapisz i Zastosuj (Save & Apply).

Wracamy do SSH i sprawdzamy, czy aby napewno mamy zainstalowany pakiet dnsmasq oraz dodatkowo instalujemy https-dns-proxy

opkg install dnsmasq https-dns-proxy

Warto również doinstalować graficzny interfejs do naszego panelu sterowania przez przeglądarkę internetową.

Możemy to zrobić wykonując komendę

opkg install luci-app-https-dns-proxy

Aby włączyć szyfrowanie DNS przez HTTPS wykonujemy następującą komendę:

uci -q delete [email protected][0].server
DOHPROXY_ADDR="$(uci get [email protected][0].listen_addr)"
DOHPROXY_PORT="$(uci get [email protected][0].listen_port)"
DOHPROXY_SERV="${DOHPROXY_ADDR//[][]/}#${DOHPROXY_PORT}"
uci add_list [email protected][0].server="${DOHPROXY_SERV}"

Ostatnim krokiem pozostaje wymuszenie na wszystkich użytkownikach sieci lokalnej (LAN) używanie szyfrowanego — bezpiecznego DNS. Dokonujemy tego za pomocą komendy:

uci set [email protected][0].noresolv="1"
uci commit dhcp

Po czym restartujemy dnsmasq komendą:

/etc/init.d/dnsmasq restart

Aby sprawdzić, czy nasz router działa jako pośrednik szyfrujący, wykonujemy następującą komendę:

nslookup openwrt.org localhost

Po czym powinniśmy otrzymać odpowiedź.


Po tych czynnościach w DHCP & DNS zauważymy, że nasze serwery DNS, które wprowadziliśmy wcześniej uległy zmienieniu na 127.0.0.1#5053 oraz strona https://1.1.1.1/help zwraca serwer Google jako domyślny DNS. Jest to dlatego, gdyż powyższa metoda domyślnie używa Google w połączeniu z Cloudflare DNS.

Aby to zmienić, poprzez przeglądarkę internetową przechodzimy do panelu sterowania naszego routera, po czym do Usługi (Services) > DNS Over HTTPS Proxy Settings.

Tam usuwamy Google pozostawiając tylko Cloudflare.

Wybieramy Zapisz i Zastosuj (Save & Apply).

Jeżeli nie chcemy usuwać Google, możemy zmienić w DHCP & DNS domyślny serwer DNS tylko na 127.0.0.1#5054, zakładając, że pod portem 5054 mamy ustawiony CloudFlare.

W tym momencie, jak przejdziemy na stronę https://1.1.1.1/help zobaczymy, że używamy Cloudflare jako domyślny serwer nazw (DNS) oraz, że nasze zapytania DNS są szyfrowane przez HTTPS (DoH).

Szybko i w miarę bezboleśnie zabezpieczyliśmy całą naszą sieć lokalną i zmusiliśmy do używania DNS przez HTTPS (DNS over HTTPS) przy każdym zapytaniu do serwera DNS.

Dodatkowo

Według oficjalnego wpisu na stronie OpenWRT odnośnie DNS przez HTTPS widnieje informacja, że lokalny system (nasz router), domyślnie nie używa dnsmasq jako domyślnego systemu DNS gdy szyfrowanie jest włączone. Dodatkowo istnieje znany problem związany z synchronizacją czasu (przez protokół NTP) na przeróżnych urządzeniach, gdy szyfrowanie DNS jest włączone.

Aby zmienić/naprawić powyższe, pozostało kilka dodatkowych komend do wykonania.

Wymuszenie szyfrowania DNS dla lokalnego systemu (routera)

uci set [email protected][0].localuse="1"

Pobranie informacji o usługodawcy DNS

. /lib/functions/network.sh
network_flush_cache
network_find_wan NET_IF
network_find_wan6 NET_IF6
network_get_dnsserver NET_DNS "${NET_IF}"
network_get_dnsserver NET_DNS6 "${NET_IF6}"

Ominięcie szyfrowania DNS dla szyfrowania czasu poprzez NTP

uci get system.ntp.server \
| sed -e "s/\s/\n/g" \
| sed -e "s/^[0-9]*\.//" \
| sort -u \
| while read -r NTP_DOMAIN
do
uci add_list [email protected][0].server="/${NTP_DOMAIN}/${NET_DNS%% *}"
uci add_list [email protected][0].server="/${NTP_DOMAIN}/${NET_DNS6%% *}"
done
uci commit dhcp

Na koniec restartujemy dnsmasq

/etc/init.d/dnsmasq restart

Idąc dalej…