DNScrypt-proxy, czyli szyfrowanie zapytań DNS

Spis treści

Do protokołów SSL/TLS w serwisach www chyba wszyscy już przywykli. Obecnie praktycznie na każdej stronie, gdzie jest okienko logowania, mamy do czynienia z szyfrowaniem danych przesyłanych w różnego rodzaju formularzach. Co prawda, klucze nie są zbyt długie (512-2048 bitów) ale zawsze to lepsze niż nic. O ile dane służące do logowania czy też wszelkie operacje dokonywane w panelach administracyjnych da radę ukryć bez większego problemu, o tyle zapytania DNS są przesyłane otwartym tekstem i każdy może je sobie podejrzeć. Pytanie tylko, po co szyfrować ruch DNS? Czy są tam przesyłane jakieś ważne informacje? Jeśli przyjrzymy się jak działa system DNS, możemy dojść do wniosku, że szyfrowanie zapytań jest pozbawione sensu, bo z reguły nazwa domeny oznacza konkretny adres IP. Znając adres IP, możemy ustalić kto na jakie strony wchodzi. Nie do końca jest to prawdą, poza tym istnieją jeszcze inne czynniki, które sprawiają, że ukrycie zapytań DNS ma jak najbardziej sens. W tym wpisie zaimplementujemy sobie na naszych linux'ach szyfrowanie zapytań DNS przy wykorzystaniu narzędzia dnscrypt-proxy.

Bardziej aktualna wersja tego wpisu znajduje się tutaj.

Wiele domen i cenzura

Czy naprawdę możemy ustalić kto jakie serwisy odwiedza na podstawie adresu IP? W sporej części przypadków zapewne tak ale tylko pod warunkiem, że dany adres IP jest wykorzystywany tylko przez jeden serwis. A co w przypadku, gdy jeden adres IP hostuje kilka czy kilkaset stron? Znając tylko adres IP, nie będziemy mieć pewności, która strona została tak naprawdę odwiedzona. Co prawda, będziemy mieli zawężony krąg podejrzanych ale nie ustalimy czy dana osoba odwiedziła ten konkretny adres. Znając zapytania DNS, wiemy dokładnie kto gdzie wchodzi.

Każdy słyszał o blokadach domen dokonywanych przez rząd USA. Jak to ma się do zapytań DNS? Podobnie jak rząd USA, rząd Polski może narzucić lokalnym ISP filtry stron zakazanych. O ile w przypadku rządu USA, który jest właścicielem root serwerów DNS, nie możemy nic zrobić, bo blokady są globalne, o tyle w sytuacji, gdy nasz ISP zapragnie nam blokować serwisy internetowe filtrując DNS, możemy się bronić zmieniając serwery DNS. Niemniej jednak, cały ruch dalej przechodzi przez naszego ISP i zmiana samych adresów DNS nic nie da. Frazy domen mogą zostać odfiltrowane ale tylko w przypadku, gdy będą widoczne i tu właśnie znajduje zastosowanie szyfrowanie ruchu DNS.

Zmiana serwerów DNS

Usługa OpenDNS oferuje dość zaawansowaną konfigurację DNS wliczając w to rozmaite filtry, w tym też blokowanie pojedynczych stron www. Można nawet włączyć log odwiedzanych adresów i generować ciekawe statystyki. Bardzo przydatne jeżeli mamy dzieci i chcemy wiedzieć na jakie strony wchodzą i czy są wśród nich strony porno. Wtedy bez problemu można zablokować odpowiednie domeny. Inną użyteczną opcją jaką dysponuje OpenDNS, to szyfrowanie zapytań DNS.

Obecnie każdy system operacyjny na starcie pobiera konfigurację sieci przez serwer DHCP od swojego ISP. Jest tam też konfiguracja serwerów DNS, z tym, że jest ona opcjonalna. Możemy albo na sztywno zdefiniować adresy DNS przy konfiguracji sieci, albo wpisać odpowiednie dane w pliku /etc/resolv.conf . Ręczna edycja pliku resolv.conf może się wydawać bezzasadna ale nie w przypadku, gdy chcemy zablokować możliwość przypadkowej zmiany tego pliku, np. przez zewnętrzne oprogramowanie. Chodzi o nadanie atrybutu chattr +i . Teraz mamy pewność, że w tym pliku znajduje się dokładnie taka zawartość jakiej oczekujemy i nie musimy sprawdzać co chwila, czy czasem adresy serwerów DNS nie uległy zmianie.

Gdy chcemy korzystać z serwerów OpenDNS, dodajemy w pliku /etc/resolv.conf poniższe wpisy:

nameserver 208.67.222.222
nameserver 208.67.220.220

W przypadku korzystania z systemd, plik resolv.conf jest dowiązaniem do /run/systemd/resolve/resolv.conf i jako że ten plik znajduje się w katalogu /run/ , jest on tworzony na nowo przy starcie systemu. Zatem manualna edycja tego pliku nie jest zalecana. Lepszym wyjściem jest konfiguracja resolver'a bezpośrednio przez pliki .network.

DNScrypt-proxy na straży prywatności

My jednak będziemy korzystać z opcji szyfrowania zapytań i nie możemy bezpośrednio użyć powyższych adresów. Musimy pierw utworzyć lokalny serwer, który będzie zapytania szyfrował i przesyłał je do jednego z resolver'ów, które mają zaimplementowaną obsługę szyfrowania. W tym przypadku posłużymy się OpenDNS.

Oprogramowanie, które posłuży nam do zaszyfrowania ruchu DNS to dnscrypt-proxy . W repozytorium Debiana mamy dostępny pakiet o takiej nazwie, zatem z jego instalacją nie powinno być problemów. Przejdźmy od razu do konfiguracji tego narzędzia.

Po wystartowaniu demona, wszystkie zapytania są gotowe do puszczenia w kanał TLS. Problem w tym, że wpisy w /etc/resolv.conf wskazują na zły adres resolver'a. Całą zawartość tego pliku musimy usunąć i na jej miejscu dodać tę poniższą linijkę:

nameserver 127.0.2.1

Dla pewności, że plik nie zostanie przepisany przez jakieś automaty systemowe, możemy nadać atrybut +i na ten plik:

# chattr +i /etc/resolv.conf

Testowanie konfiguracji resolver'a

By sprawdzić czy zapytania DNS są szyfrowane za sprawą dnscrypt-proxy , możemy odwiedzić stronę testową OpenDNS, gdzie powinniśmy zobaczyć ten poniższy komunikat:

test-konfiguracji-dnscrypt-proxy

Nie mamy tam żadnych informacji dotyczących szyfrowania ruchu ale skoro przekierowaliśmy ruch na lokalny resolver i jesteśmy w stanie odwiedzić stronę OpenDNS, to znaczy, że ruch musi być przesłany w formie szyfrowanej. Jeśli jednak chcemy zobaczyć odpowiednie komunikaty na własne oczy, to możemy skorzystać z narzędzia dig odpytując nim adres debug.opendns.com . Jeśli wszystko działa jak należy, to powinniśmy uzyskać mniej więcej taki log:

$ dig debug.opendns.com txt
...
debug.opendns.com.      0       IN      TXT     "dnscrypt enabled (71447764594D3377)"

;; Query time: 31 msec
;; SERVER: 127.0.2.1#53(127.0.2.1)
;; WHEN: Thu Jun 18 19:43:08 CEST 2015
;; MSG SIZE  rcvd: 282

Linijka z dnscrypt enabled jasno nas informuje, że ruch jest szyfrowany. Dodatkowo, niżej mamy adres resolver'a, który wskazuje na nasz adres lokalny 127.0.2.1#53 .

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.