Serwer nazw i filtrowanie ruchu z wykorzystaniem DNS
Ostatnia zmiana: 2022-11-22 20:26

W dużym uproszczeniu można powiedzieć że internet to zbiór różnych urządzeń połączonych razem w jedną wielką sieć. Maszyny jak to maszyny znają tylko zera i jedynki, więc komunikują się ze sobą wykorzystując liczby jako swoje adresy. Dla człowieka zapamiętanie już kilkunastu numerów stanowi problem, więc na samym początku wymyślono usługę DNS która pozwala na zamianę nazwy przyjaznej dla użytkownika na adres IP które znają komputery. Wpisując w przeglądarkę adres http://eko.one.pl to w pierwszej kolejności wysyłanie jest zapytanie do jakiegoś serwera DNS o adres IP tej witryny, a dopiero później przeglądarka będzie próbowała komunikować się z serwerem który jest pod tym adresem. Cały system DNS na świecie składa się z kilku podstawowych serwerów DNS (tzw. root serwerów) więc wystarczyło by tylko ich używać. W praktyce nikt tego nie robi, bo zwykle odwołujemy się do innych, lokalnych serwerów które też potrafią rozwiązywać zapytania DNS, a w razie potrzeby przekażą je do znanych sobie serwerów nadrzędnych. W normalnym "użytkowaniu" internetu zależy nam więc aby:
- DNS był bardzo szybki i szybko odpowiadał na zapytania
- DNS był dostępny cały czas, bo najmniejsza przerwa w jego działaniu spowoduje brak możliwości normalnego korzystania z internetu
- DNS był wiarygodny i dostarczał aktualnych adresów IP

Serwer cache

Domyślna konfiguracja OpenWrt zawiera własny demon do obsługi zapytań DNS o nazwie dnsmasq. Router i klienci nie są zobowiązani do jego używania, ale w routerze spełnia on jeszcze jedną ważną rolę - potrafi lokalnie przechowywać i rozwiązywać nazwy DNS (czyli pracuje jako tzw. cache). Ponieważ zależy nam na szybkości DNS to takie rozwiązanie ma ogromną zaletę - wizualne przyśpieszenie np. ruchu www. Wyobraźmy sobie rozbudowaną stronę WWW składającą się z wielu elementów i grafik. Jeżeli używamy normalnego serwera dns, to każde żądanie wczytania obrazka, szablonów styli czy skryptów zaczyna się pytaniem DNS o daną domenę. Jeżeli serwer jest wolny to każdy element zostanie wczytany z opóźnieniem wynikającym z odpowiedzi na zapytanie DNS. Jeżeli używamy serwera cachującego to pierwsze pytanie o domenę jest kierowane do innych serwerów, zaś pozostałe są już rozwiązywane lokalne bez wysyłania zapytań do zewnętrznych serwerów. Jest to domyślny tryb pracy serwera dnsmasq.
Jeżeli klient dostaje adres IP z DHCP, to jako serwer DNS dostaje adres routera, więc korzysta z wbudowanego serwera dnsmasq. Jeżeli ustawiamy adres w komputerze na stałe to nie zapominamy o podaniu adresu routera jako serwera DNS.

Własne serwery DNS

W najpopularniejszym rozwiązaniu - kabel podłączony do routera z OpenWrt - adresy serwerów DNS otrzymujemy od naszego dostawcy internetu w odpowiedzi na żądanie DHCP. Zwykle są to jego własne serwery (lub klaster serwerów zachowujących się jak jedno urządzenie), choć zdarza się także że są to adresy serwerów ogólnie dostępnych jakich jak Google czy OpenDNS. Z jakich serwerów korzysta dnsmasq można zobaczyć wydając polecenie

 
    # cat /tmp/resolv.conf.auto

lub


    # cat /tmp/resolv.conf.d/resolv.conf.auto

(zależy od wersji OpenWrt)
Do nich dnsmasq będzie kierował zapytania o adresy urządzeń których nie zna. Niestety dostawcy internetu nie zawsze przykładają się do pracy i serwery dostarczone przez nich odmawiają działania lub są dość wolne. Nic nie stoi na przeszkodzie abyśmy sami podali adresy serwerów z których chcemy korzystać. Wykonuje się to wpisując odpowiednie opcje konfiguracyjne w sekcji wan w pliku /etc/config/network:


    # uci set network.wan.dns="8.8.8.8 8.8.4.4"
    # uci commit network
    # ifup wan

Powyższe polecenia dodają dodatkowe serwery dns. Jeżeli chcemy wymusić korzystanie tylko z nich:


    # uci set network.wan.dns="8.8.8.8 8.8.4.4"
    # uci set network.wan.peerdns=0
    # uci commit network
    # ifup wan

Adresy 8.8.8.8 i 8.8.4.4 to adresy serwerów DNS Google, opcja peerdns=0 powoduje zignorowanie adresów dostarczonych przez ISP przez DHCP. Jeżeli używamy statycznego adresu IP na wan routera to oczywiście podanie opcji dns jest wręcz obowiązkowe. Jeżeli nie mamy interfejsu wan to serwery DNS dla routera możemy ustawić w identyczny sposób także w sekcji lan w pliku /etc/config/network.

Przekazanie innych serwerów DNS

Jak już wspomniano, jeżeli klient podłączony do routera korzysta z przydziału adresu IP przez DHCP to domyślnie dostanie także adres routera jako serwer DNS. Z różnych powodów może nam to nie pasować - np. z powodu architektury sieci w której mamy więcej routerów. Dnsmasq umożliwia zmianę serwerów wysyłanych do urządzeń:


    # uci add_list dhcp.lan.dhcp_option="6,8.8.8.8,8.8.4.4"
    # uci commit dhcp
    # /etc/init.d/dnsmasq restart

Powyższe polecenia zmieniają wartość opcji w odpowiedzi DHCP, numer 6 to właśnie inne serwery DNS.

Wymuszenie użycia routera jako serwera DNS

Może się zdarzyć że klient nie używa DHCP tylko ustawił manualnie adres IP lub ustawił samodzielnie inny serwer DNS. Zapytania DNS zwykle (patrz uwagę poniżej) wysyłanie są na port o numerze 53, więc o ile cały ruch klienta idzie przez nasz router to możemy wymusić używanie naszego routera niezależnie od tego co ma ustawione klient. Aby to wykonać należy przekierować na firewallu wszystkie żądania na docelowy port 53/tcp i 53/udp na nasz router.


    # uci set firewall.adblock_dns_53=redirect
    # uci set firewall.adblock_dns_53.src=lan
    # uci set firewall.adblock_dns_53.proto="tcp udp"
    # uci set firewall.adblock_dns_53.src_dport=53
    # uci set firewall.adblock_dns_53.dest_port=53
    # uci set firewall.adblock_dns_53.target=DNAT
    # uci commit firewall

Należy pamiętać że dostawca internetu też może wymusić korzystanie z określonych serwerów DNS, choć zwykle tego nie robi.

O ile port 53 jest "standardowym" portem usługi DNS, o tyle zdarza się że serwery nazw mogą też słuchać na innych portach. Przykładem jest usługa dnscrypt która komunikuje się po porcie 443. W sieciach wykorzystujących Tor też zwykle przekierowuje się się DNS na wbudowanego klienta sieć anonimizującej.

Zamiana adresów domen

Jeżeli mamy już i używamy naszego własnego serwera DNS to możemy pokusić się także o zamianę niektórych nazw na inne adresy niż wskazują to rzeczywiste DNSy. Tak zrealizowane są niektóre projekty typu Adblock, które zastępują niektóre nazwy swoimi adresami. Dla przykładu - zróbmy tak, aby pytanie o youtube.com zwróciło nasz lokalny router:


    # uci add_list dhcp.@dnsmasq[0].address='/youtube.com/192.168.1.1'
    # uci commit dhcp
    # /etc/init.d/dnsmasq restart

Obsługa wszystkich domen

Skoro można jeden adres przekierować to można i... wszystkie. Dzięki temu dnsmasq samodzielnie rozwiązuje wszystkie nazwy i może działać nawet jak router nie ma połączenia z internetem.


    # uci add_list dhcp.@dnsmasq[0].address='/#/192.168.1.1'
    # uci commit dhcp
    # /etc/init.d/dnsmasq restart

Obsługa niestandardowych domen

Konfiguracja własnego serwera DNS może obejmować także obsługę niestandardowych domen. Z takiego rozwiązania korzysta Gargoyle, który rozwiązuje nazwy typu .bit, .glue, .parody, .dyn, .bbs, .free czy .geek, przykazując je do serwerów które potrafią przetłumaczyć takie adresy. Jak to wykonać? Oczywiście trzeba ustawić odpowiednie opcje:


    # uci add_list dhcp.@dnsmasq[0].server="/.bit/178.32.31.41"
    # uci add_list dhcp.@dnsmasq[0].server="/.bit/78.47.86.43"
    # uci commit dhcp
    # /etc/init.d/dnsmasq restart

Logowanie zapytań DNS

Jeżeli na naszym routerze używamy demona dnsmasq oraz oczywiście używamy routera jako serwera DNS to można w prosty sposób przekonać go pokazywania wszystkich zapytań o domeny (domeny - nie pełne adresy url!). Wystarczy ustawić odpowiednią opcję:



    # uci set dhcp.@dnsmasq[0].logqueries='1'
    # uci commit dhcp
    # /etc/init.d/dnsmasq restart

Dzięki czemu w logach systemowych (polecenie logread) pojawią się informację o wszystkich zapytaniach o domeny skierowane do naszego routera.

Blokada domen

Blokady niechcianych domen, w tym przypadku dnsmasq zwróci że taka domena nie istnieje (NXDOMAIN). W ten sposób realizowane są współczesne projekty typu "Adblock".


    # uci set dhcp.@dnsmasq[0].serversfile='/etc/zakazane'
    # uci commit dhcp
    # echo "server=/testtest1.pl/" >> /etc/zakazane
    # echo "server=/testtest2.pl/" >> /etc/zakazane
    # /etc/init.d/dnsmasq restart

Od tego momentu dnsmasq dla domen "testtest1.pl" i "testtest2.pl" nie będzie rozwiązywać nazwy, więc nie będzie można się do nich odwołać.

Obsługa tylko wybranych domen

Przeciwieństwo poprzedniego rozwiązania - obsługujemy tylko kilka domen i żadnej innej (whitelista)


    # uci set dhcp.@dnsmasq[0].serversfile='/etc/dozwolone'
    # uci commit dhcp
    # echo "server=/eko.one.pl/#" >> /etc/dozwolone
    # echo "server=/openrouter.info/#" >> /etc/dozwolone
    # echo "server=/#/" >> /etc/dozwolone
    # /etc/init.d/dnsmasq restart

Dnsmasq będzie potrafił obsłużyć tylko domeny "eko.one.pl" i "openrouter.info", inne nie będą rozwiązywane.

Filtrowanie ruchu bazujące na DNS

Głównym zadaniem dnsów jest zamiana nazwy czytelnej dla ludzi na postać liczbową zrozumiałą dla komputerów. Wiąże się to także z pewną inną właściwością przedstawioną wcześniej - możemy podstawić własne adresy pod różne nazwy. Jesteśmy więc krok od możliwości filtrowania ruchu bazując na analizie zapytań dns.

Adblock

Rozwiązanie przedstawione jest w tym poradniku. Definiujemy listę lub listy adresów które uważamy za "złe" - serwery spamujące, wyświetlające reklamy, strony o różnych treściach (pornografia, przemoc, narkotyki) i uczymy nasz dns żeby przekierowywał te domeny na inny serwer. Dzięki temu zamiast docelowej strony pod danym adresem otrzymujemy treść podstawioną przez nas. Jednym popularniejszych zastosowań tego rozwiązania oprócz tytułowego adblocka była podmiana reklam w popularnym niegdyś komunikatorze Gadu-Gadu, dzięki czemu można było w sieci lokalnej wyświetlać własne obrazki i powiadomienia.

Adguard DNS

Kolejny darmowy serwis DNS Adguard DNS, głównie z możliwością blokady reklam i innych treści. Oferowane są dwie kategorie:

  • Default (block ads, trackers and phishing website)
Adresy serwerów DNS: 94.140.14.14, 94.140.15.15

  • Family Protection (block ads, trackers and phishing website, blocking adult websites, safe search)
Adresy serwerów DNS: 94.140.14.15, 94.140.15.16

Serwis nie wymaga żadnej konfiguracji, wystarczy używać w/w serwerów DNS.

Quad 9

Kolejny dns z blokadą niektórych stron. Łatwo go zapamiętać, ponieważ jego adres to same dziewiątki:

  • Quad9 is a free security solution that uses DNS to protect your system against the most common cyber threats
Adres serwera: 9.9.9.9

Serwis nie wymaga żadnej konfiguracji, wystarczy używać w/w serwera DNS.

OpenDNS

Nie można także zapominać o popularnym serwisie OpenDNS. Często postrzegany jest jako alternatywa dla serwerów Google, ale można także wykorzystać jego darmowe fragmenty do filtrowania określonych kategorii. Dostępne są dwie darmowe usługi:

  • OpenDNS FamilyShield
Usługa domyślnie blokuje witryny z kategorii pornografia, phishing, mailware.
Adresy serwerów DNS: 208.67.222.123, 208.67.220.123
Podobnie jak przy poprzednim serwisie wystarczy ustawić w/w serwery dns aby działała blokada.

  • OpenDNS Home
Jeżeli chcemy mieć możliwość wyboru blokowanych kategorii lub blokowania własnych witryn - wybieramy usługę OpenDNS Home. Wymaga ona jednak rejestracji oraz później aktualizacji adresu IP z którego korzystamy.
Adresy serwerów DNS: 208.67.222.222, 208.67.220.220

W celu rejestracji wchodzimy na stronę OpenDNS, z menu wybieramy "Personal", następnie "Sign" w panelu OpenDNS Home. Wprowadzamy dane, rejestrujemy się, potwierdzamy rejestrację która została wysłana na podany adres mejlowy. Po rejestracji wchodzimy na adres https://dashboard.opendns.com/settings/, uzupełniamy nasz aktualny adres IP i klikamy "Add this network", wpisujemy nazwę sieci (np. "home") i zaznaczamy czy jest to adres dynamiczny (adres IP może nam się zmienić) czy nie. Po dodaniu sieci domyślnie nic nie jest dla niej blokowane. Jeżeli chcemy to zmienić to klikamy IP sieci na w/w stronie i wybieramy jeden z poziomów filtrowania: High, Moderate, Low lub wybieramy Custom jeżeli sami chcemy mieć możliwość wyboru kategorii. Oczywiście można także ręcznie podać domeny które mają być blokowane. Zapisujemy zmiany.



Skorzystanie z tej usługi wymaga 2 elementów - ustawienia odpowiednich dnsów oraz poinformowanie OpenDNS z jakiego publicznego adresu IP aktualnie korzystamy (w założeniu podobne jest to do usługi DynamicDNS i dokładnie w ten sam sposób się to realizuje).

DNSy ustawiamy poleceniami:


    # uci set network.wan.dns="208.67.222.222 208.67.220.220"
    # uci set network.wan.peerdns=0
    # uci commit network
    # ifup wan

Aktualizację adresu IP - za pomocą prostego skryptu wywoływanego np. z hotplugu lub w cronie:


    #!/bin/sh
    wget -q -O - --user="<login>" --password="<password>" https://updates.opendns.com/nic/update?hostname=<network>
    exit 0

Należy podstawić własne dane:
- <network> - nazwa sieci zdefiniowana w serwisie (np. "home")
- <login> - nazwa użytkownika
- <password> - hasło do serwisu

W Gargoyle należy przejść do zakładki "Dynamic DNS", wybrać z listy usługę OpenDNS, podać dane i zapisać usługę.

Zamiast witryny wyświetla się strona informacyjna o blokadzie. Można ją w pewien sposób zmodyfikować na stronie konfiguracyjnej sieci w serwisie OpenDNS.

Inne serwisy

W sieci pojawia się co raz większa ilość darmowych DNSów oferujących blokowanie różnorodnych stron (najczęściej - bez naszego udziału, sami decydują które są "dobre" i które "złe"). Niektóre z takich serwerów można znaleźć np. tutaj lub tutaj.