Własny serwer DNS z cachowaniem zapytań

Czasem jest potrzeba postawienia własnego serwera DNS. Przyczyny mogą być różne, np. stworzenie własnej domeny wewnątrz prywatnej sieci, ułatwiającej adresowanie urządzeń znajdujących się w sieci, nie trzeba wtedy pamiętać adresów IP. Lub po prostu przyśpieszenie działania usługi DNS poprzez cachowanie zapytań co jest bardzo zasadne w przypadku sieci z dużą ilością komputerów.

Instalacja u konfiguracja

Nasz serwer DNS postawimy na najpopularniejszym demonie, czyli Bind 9. Zaczniemy od instalacji pakietu bind9 i przydatnych narzędzi

sudo apt-get install bind9 dnsutils

Następnie edytujemy plik z głównymi opcjami demona

sudo nano /etc/bind/named.conf.options

Po edycji wygląda mniej więcej tak

options {
        directory "/var/cache/bind";

        forwarders {
                # Publiczne darmowe serwery DNS Google
                8.8.8.8;
                8.8.4.4;

                # Publiczne darmowe serwery OpenDNS
                208.67.222.222;
                208.67.220.220;
                208.67.222.220;
                208.67.220.222;
        };

        listen-on port 53 {
                127.0.0.1;
                10.0.0.0;
                192.168.0.0;
        };

        allow-query {
                127.0.0.1;
                10.0.0.0/8;
                192.168.0.0/16;
        };

        recursion yes;
        auth-nxdomain no;    # conform to RFC1035
};

Najważniejsza jest sekcja forwarders, podajemy tam adresy IP publicznych serwerów DNS do których ma się odwoływać nasz serwer DSN z zapytaniami o domeny, których nie ma u siebie. Zapytania te są cachowane, więc po pierwszym odwołaniu do serwera publicznego kolejne odpowiedzi będą pobierane z cache co spowoduje ich przyśpieszenie. Podałem tam adresy darmowych serwerów DNS (Google i OpenDNS), ale dużo lepszym pomysłem jest wpisanie tam własnych w zależności od dostawcy Internetu, które na pewno będą miały krótsze czasy odpowiedzi od tych. Te darmowe można zakomentować i zostawić je na wszelki wypadek, gdyby był problem z tymi podstawowymi.

Zauważyłem, że kolejność podawanych serwerów nie ma znaczenia, Bind korzysta ze wszystkich podanych w podobnym stopniu, więc wpisanie w pierwszej kolejności serwerów od dostawcy a dalej tych darmowych publicznych nie jest dobrym wyjściem.

Kolejnymi ustawieniami są listen-onallow-query. W listen-on ustawiamy port i adresy na których Bind ma nasłuchiwać a w allow-query adres sieci lub adresy hostów, którym pozwalamy odpytywać nasz serwer. W przypadku braku tych ustawień serwer będzie otwarty na wszystkie połączenia, warto to ustawić i kontrolować skąd chcemy przyjmować zapytania.

DNS Cache dla samego siebie

Nie zawsze serwer DNS stawia się dla sieci, czasem warto postawić tylko dla lokalnej potrzeby, np. na serwerze pocztowym lub innym, który generuje dużo zapytań DNS. Ostatnio postawiłem taki DNS na serwerze Zabbix monitorującym serwery i strony www.

W takim przypadku ustawiamy w listen-on i allow-query tylko 127.0.0.1. Restartujemy Binda i zmieniamy adres DNS na serwerze w konfiguracji interfejsów sieciowych

sudo service bind9 restart
sudo nano /etc/network/interfaces
...
dns-nameservers 127.0.0.1
...

lub też

sudo nano /etc/resolv.conf
nameserver 127.0.0.1

ale po restarcie serwera te ustawienia mogą się przywrócić

Sprawdzamy działanie cachowania DNS

dig any google.pl

...
;; Query time: 5 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Jul 23 23:41:27 2014
;; MSG SIZE  rcvd: 129

Przy kolejnym wywołaniu

dig any google.pl

...
;; Query time: 1 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Jul 23 23:41:53 2014
;; MSG SIZE  rcvd: 129

Jak widać za pierwszym razem odpowiedź przyszła w czasie 5ms a za drugim razem już w czasie 1ms. Poprawnie też serwer z którego otrzymaliśmy odpowiedź ma adres 127.0.0.1.