Konfiguracja dnscrypt-proxy w OpenWRT

Spis treści

Realizowanie zapytań DNS jest kluczowe do poprawnego działania min. stron internetowych. Router z OpenWRT na pokładzie bez problemu potrafi rozwiązywać domeny na adresy IP. Jest to realizowane przez oprogramowanie dnsmasq . Problem w tym, że zwykle resolver, który będzie uwzględniany w konfiguracji routera, wskazuje na serwery DNS naszego ISP, czy też jakiejś większej korporacji. W ten sposób, wszystkie dane z przeglądania stron internetowych podajemy tym organizacjom za free. Przy pomocy narzędzia dnscrypt-proxy jesteśmy w stanie zabezpieczyć naszą sieć przed tego typu zabiegami zbierania danych. Po części też możemy uchronić się przed cenzurą, którą może nam zafundować lokalny provider internetowy. W tym artykule zaimplementujemy obsługę szyfrowanego resolver'a DNS na naszym domowym routerze.

Instalacja dnscrypt-proxy w OpenWRT

We wcześniejszych wersjach OpenWRT, pakiet dnscrypt-proxy nie był dostępny w oficjalnych repozytoriach. W przypadku Chaos Calmer, ten pakiet jest już obecny i jego instalacja sprowadza się do wydania tych poniższych poleceń:

# opkg update
# opkg install dnscrypt-proxy

Usługa standardowo nasłuchuje zapytań na adresie 127.0.0.1 i porcie 5353 . Jeśli komuś nie odpowiadają te parametry, to może je zwyczajnie zmienić w pliku /etc/config/dnscrypt-proxy :

config dnscrypt-proxy
    option address '127.0.0.1'
    option port '5353'
    # option resolver 'opendns'
    # option resolvers_list '/usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv'

Wyżej mamy także wykomentowane dwie inne opcje: resolvers_list wskazuje plik z serwerami, które obsługują szyfrowanie zapytań, oraz resolver określający wybór jednego z tych resolver'ów. W pliku /usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv mamy sporo informacji na temat konfiguracji danego resolver'a, min. dane dotyczące tego, czy są przechowywane logi. Warto zaznajomić się z tym listingiem i wybrać dla siebie odpowiedni serwer DNS.

Przekierowanie zapytań DNS

Teraz musimy przekierować zapytania DNS. W tym celu musimy poinstruować dnsmasq by korzystał z dnscrypt-proxy , a nie z domyślnych serwerów DNS pobranych z serwera DHCP od naszego ISP. Na początek, w pliku /etc/config/dhcp komentujemy poniższy wpis:

# option resolvfile '/tmp/resolv.conf.auto'

Następnie dodajemy ten poniższy blok kodu:

option noresolv '1'
list server '127.0.0.1#5353'
list server '/pool.ntp.org/208.67.222.222'

Opcja noresolv sprawi, że dnsmasq nie będzie używał DNS'ów pobranych z lease DHCP. Druga linijka określa, gdzie przesyłać zapytania DNS. Ostatni wpis sprawi, że wszelkie zapytania do serwerów czasu będą rozwiązywane przez OpenDNS w formie niezaszyfrowanej. Chodzi generalnie o precyzję pobranego czasu tak, by był możliwie dokładny. Szyfrowanie, jakby nie patrzeć, spowalnia nieco synchronizację czasu. Można tutaj wpisać dowolne DNS'y.

Resetujemy teraz demona dnsmasq za pomocą poniższego polecenia:

# /etc/init.d/dnsmasq restart

W logu, który możemy odczytać za pomocą logread powinniśmy ujrzeć min. te poniższe komunikaty:

dnsmasq[2118]: using nameserver 208.67.222.222#53 for domain pool.ntp.org
dnsmasq[2118]: using nameserver 127.0.0.1#5353

Testy szyfrowania zapytań DNS

Sprawdźmy zatem czy faktycznie te zapytania są szyfrowane. Z dowolnego hosta w sieci, który otrzymuje konfigurację za sprawą protokołu DHCP, wydajemy poniższe polecenie:

$ dig debug.opendns.com txt
...
debug.opendns.com.      0       IN      TXT     "dnscrypt enabled (717744506545635A)"
...

Powyższa informacja jednoznacznie stwierdza, że zapytania DNS są szyfrowane.

OpenWRT nie rozwiązuje domen

Może się zdarzyć tak, że po zaimplementowaniu szyfrowanych zapytań utracimy połączenie ze światem. Niekoniecznie musi się to nam przytrafić od razu po instalacji i konfiguracji dnscrypt-proxy . Niemniej jednak, warto pamiętać, by przeprowadzić test, który może nam wskazać czy winny jest resolver DNS. Sam test sprowadza się do odpytania przy pomocy ping dwóch hostów. Jednego po adresie IP, drugiego po domenie. Poniżej przykład:

# ping wp.pl
ping: bad address 'wp.pl'

# ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8): 56 data bytes
64 bytes from 8.8.8.8: seq=0 ttl=44 time=58.543 ms
64 bytes from 8.8.8.8: seq=1 ttl=44 time=59.077 ms
64 bytes from 8.8.8.8: seq=2 ttl=44 time=59.445 ms
^C
--- 8.8.8.8 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 58.543/59.021/59.445 ms

Tutaj mamy ewidentnie problemy z resolver'em DNS. Trzeba zatem przejrzeć konfigurację, a jeśli wszystko się zgadza, to zresetować usługę. Być może nie została automatycznie dodana do autostartu i trzeba ją dodać ręcznie w poniższy sposób:

# /etc/init.d/dnscrypt-proxy enable
# /etc/init.d/dnscrypt-proxy start

Może się także zdarzyć tak, że po restarcie routera domeny nie będą rozwiązywane. W takim przypadku możemy edytować skrypt startowy, który znajduje się w pliku /etc/init.d/dnscrypt-proxy i przepisać w nim numerek odpowiedzialny za sekwencję startową. Robimy to w poniższy sposób:

START=55

Można także dopisać do pliku /etc/rc.local linijkę restartującą usługę resolver'a chwilę po zakończeniu procedury startowej routera:

/etc/init.d/dnscrypt-proxy restart

Komunikaty w logu

W przypadku, gdy drażnią nas nieco zasyfione logi, możemy zmniejszyć poziom logowania przez dopisanie w /etc/init.d/dnscrypt-proxy parametru --loglevel :

...
service_start /usr/sbin/dnscrypt-proxy -d \
    -a ${address}:${port} \
    -u nobody \
    -L ${resolvers_list:-'/usr/share/dnscrypt-proxy/dnscrypt-resolvers.csv'} \
    -R ${resolver:-'opendns'}
    --loglevel=5
...
Mikhail Morfikov avatar
Mikhail Morfikov
Po ponad 10 latach spędzonych z różnej maści linux'ami (Debian/Ubuntu, OpenWRT, Android) mogę śmiało powiedzieć, że nie ma rzeczy niemożliwych i problemów, których nie da się rozwiązać. Jedną umiejętność, którą ludzki umysł musi posiąść, by wybrnąć nawet z tej najbardziej nieprzyjemniej sytuacji, to zdolność logicznego rozumowania.