Konfigurace BIND DNS serveru na Ubuntu 20.04 (Configure BIND Ubuntu)

By | 27/08/2021

Last Updated on 27/08/2021 by administrator

Konfigurace BIND DNS serveru na Ubuntu 20.04 (Configure BIND Ubuntu)

Konfigurace BIND DNS serveru

Motivace:

Program BIND (Berkeley Internet Name Domain), jeden z nepouživanějších nástrojů pro implementaci DNS serveru. Může být nakonfigurovaný jako:

  • Autoritativní DNS server – jsou na něm uloženy záznamy k dané doméně/zóně
  • Rekurzivní (caching only) DNS server – vyřizuje libovolné DNS žádosti pro klienty a ty zároveň ukládá do mezipaměti

Článek pojednává jak nakonfigurovat jednoduchý privátní rekurzivní (caching only) DNS server. Jelikož se jedná o privátní rekurzivní (caching only) DNS server, tak nebude veřejně dostupný z internetu a bude mít přiřazené privátní doménové jméno podle RFC 6762.

Výhody konfigurace vlastního Rekurzivního DNS serveru:

  • Každému zařízení připojenému do domácí sítě lze přiřadit doménové jméno, což umožňuje lepší správu počítačové sítě
  • Může to urychlit resolving DNS dotazů, jelikož DNS server nebude odpovídat na DNS dotazy dalších lidí
  • Latence mezi Vaším zařízením a lokálním DNS serverem je téměr nulová, takže se odesílají DNS dotazy na kořenové DNS server rychleji.
  • Díky cachování DNS dotazů, budou opakované DNS dotazy rychleji zpracovány
  • Pokud se Vám nelíbí, že Vaše historie je uložená na DNS serverech třetích stran.

Pozn. DNS server je také označován jako name server (ns).

OS:

Implementace byla prakticky prováděna na Ubuntu 20.04 LTS, postup může být aplikovatelný na Ubuntu 19.10 a nižší.

Implementace:

Aktualizace seznamu balíčků z repozitářů:

sudo apt-get update

Instalace služby bind:

sudo apt-get install bind9

Verze bind:

named -v

Výpis příkazu named -v:

BIND 9.16.1-Ubuntu (Stable Release) <id:d497c32>

1. Vytvoření forwarding zóny:

Nyní bude nakonfigurován zónový soubor pro podsíť 192.168.0.0/24. V tomto případě konfigurovaný server pro službu BIND běží pod IP adresou 192.168.0.99. Podle RFC 6762 bude vybráno doménové jméno lan. Vytvořit jednoduchý zónový soubor db.lan se dvěma A záznamy:

cd /etc/bind
sudo vim db.lan

Zkopírovat do něj:

$TTL 604800

@       IN      SOA     ns.lan. email.lan. (
                              1         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800         ; Negative Cache TTL
);

        IN      NS      ns

ns      IN      A       192.168.0.99

router  IN      A       192.168.0.1

Typy záznamů:

$TTL – implicitní doba udržování záznamů v cache v sekundách (defaultně co 7 dní / 604800 sec), protože téměř každý DNS server funguje zároveň jako DNS cache.

SOA (Start Of Authority) – je definice domény, a také počáteční záznam zónového souboru. Definuje jméno primárního serveru s adresou elektronické pošty správce (zavináč je nahrazen tečkou). Třída pro internet je vždy označena IN. Dále obsahuje následující údaje:

  • Serial – Sériové číslo většinou ve formátu YYYYMMDD. S každou změnou záznamu je třeba číslo zvětšit, a tak sekundární server ví, že si má záznamy aktualizovat. Pokud se zapomene zvětšit, obsah sekundárních serverů se rozejde s primárním.
  • Refresh – Čas, po kterém sekundární server obnoví novou verzi zóny (defaultně co 7 dní).
  • Retry – Jak často má sekundární server opakovat své pokusy, pokud se mu nedaří spojit s primárním serverem (defaultně co 1 den).
  • Expire – Čas, po kterém sekundární server označí své záznamy za neplatné, pokud se nepodaří kontaktovat primární server (defaultně po 28 dní).
  • Negative Cache TTL – Implicitní doba platnosti záznamu (defaultně co 7 dní).

NS (Name Server record) – definuje a ohlašuje jméno autoritativního DNS serveru pro danou doménu.

  • zde se jedná o privátní doménu lan

A – mapuje doménové jméno k IPv4 adrese

V souboru db.lan byly tedy nadefinovány dva A záznamy, kde:

  • doménové jméno router.lan bude přeloženo na IP adresu 192.168.0.1
  • doménové jméno ns.lan bude přeloženo na IP adresu 192.168.0.99

V souboru named.conf.local umístěného v /etc/bind/ se deklaruje nebo deklarují všechny vytvořené zóny. V tomto případě byla vytvořená jen jedna zóna s názvem db.lan:

sudo vim named.conf.local

Na konec souboru named.conf.local přidat:

zone "lan" in {

        type master;

        file "/etc/bind/db.lan";

};

Legenda:

  • zone – zóna, která definuje zónový soubor – zde určuje jak se bude doména jmenovat (zde má doména jméno “lan”, doména se neurčuje v zónovém souboru)
  • type master – primární jmenný server pro reverzní překlad
  • file – odkazuje se na zónový soubor

2. Vytvoření reverzní zóny:

Reverzní překlad realizuje opačný překlad, a to mapování IP adres na doménová jména. Místo A záznamu se použije záznam PTR (Pointer). Nyní bude nakonfigurován reverzní zónový soubor pro podsíť 192.168.0.0/24.

Vytvořit jednoduchý zónový soubor db.0.168.192.in-addr.arp se dvěma PTR záznamy:

cd /etc/bind
sudo vim db.0.168.192.in-addr.arp

Zkopírovat do něj:

TTL    604800
@       IN      SOA     ns.lan. email.lan. (
                              1         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800         ; Negative Cache TTL
);

@       IN      NS      ns.lan.

1       IN      PTR     router.lan.

99      IN      PTR     ns.lan.

Pozn. Nastavit je vždy možné jen jeden PTR záznam na IP adresu. [2]

V souboru db.0.168.192.in-addr.arp byly tedy nadefinovány dva PTR záznamy, kde:

  • IP adresa 192.168.0.1 bude přeložena na doménové jméno router.lan
  • IP adresa 192.168.0.99 bude přeložena na doménové jméno ns.lan

Opět je nutné deklarovat reverzní zónu v souboru named.conf.local umístěnou v /etc/bind/. V tomto případě byla vytvořená reverzní zóna s názvem db.0.168.192.in-addr.arp:

sudo vim named.conf.local

Na konec souboru named.conf.local přidat:

zone "0.168.192.in-addr.arpa" in {

     type master;

     file "/etc/bind/db.0.168.192.in-addr.arp";

};

Vyzkoušet, zda nebyla udělaná žádná chyba v zónových souborech:

sudo named-checkconf -z

Výpis příkazu sudo named-checkconf -z značí, že je vše OK:

zone lan/IN: loaded serial 1
zone 0.168.192.in-addr.arpa/IN: loaded serial 1
zone localhost/IN: loaded serial 1
zone 127.in-addr.arpa/IN: loaded serial 1
zone 0.in-addr.arpa/IN: loaded serial 1
zone 255.in-addr.arpa/IN: loaded serial 1

Restart služby BIND:

service bind9 restart

Alternativně restart pomocí:

systemctl restart bind9

Ověření funkce služby Bind:

service bind9 status

Výpis příkazu service bind9 status:

● named.service - BIND Domain Name Server
     Loaded: loaded (/lib/systemd/system/named.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2021-08-09 20:11:04 CEST; 20s ago
       Docs: man:named(8)
   Main PID: 1076066 (named)
      Tasks: 8 (limit: 4395)
     Memory: 17.0M
     CGroup: /system.slice/named.service
             └─1076066 /usr/sbin/named -f -u bind

Standartně služba BIND běží pod UDP/53 a TCP/53. TCP/53 se používá jen pro odpovědí větší než 512 bajtů a pro přenesení zónových souborů.

Výpis všech portů na kterém poslouchá služba BIND se provede příkazem níže:

sudo lsof -P -i -n | grep bind

Výpis příkazu sudo lsof -P -i -n | grep bind:

named     14667      bind   15u  IPv4  91119      0t0  UDP 127.0.0.1:53 
named     14667      bind   17u  IPv4  91120      0t0  TCP 127.0.0.1:53 (LISTEN)
named     14667      bind   18u  IPv4  91120      0t0  TCP 127.0.0.1:53 (LISTEN)
named     14667      bind   21u  IPv4 123558      0t0  UDP 192.168.0.99:53 
named     14667      bind   22u  IPv4 123559      0t0  TCP 192.168.0.99:53 (LISTEN)
named     14667      bind   23u  IPv6  91123      0t0  UDP [::1]:53 
named     14667      bind   24u  IPv6  91124      0t0  TCP [::1]:53 (LISTEN)
named     14667      bind   25u  IPv6  91124      0t0  TCP [::1]:53 (LISTEN)
named     14667      bind   26u  IPv4  91125      0t0  TCP 127.0.0.1:953 (LISTEN)
named     14667      bind   27u  IPv6  91126      0t0  TCP [::1]:953 (LISTEN)
named     14667      bind   28u  IPv4 123559      0t0  TCP 192.168.0.99:53 (LISTEN)

Pokud je nakonfigurovaný firewall (lze zjistit příkazem sudo ufw status), je nutné povolit provoz UDP/53 a TCP/53:

sudo ufw allow 53/udp
sudo ufw allow 53/tcp
Ověření překladu doménového jména na IP adresu (A záznam):

Bude ověřeno, zda funguje DNS resolving přes nslookup a dig. Příkaz nslookup lze použít na OS Windows, či OS Linux, kdežto dig je nativně jen v OS Linux.

Test nslookup:

Pozn. Formát dotazu je: nslookup <doménové jméno> <IP adresa Bind serveru>:

C:\>nslookup router.lan 192.168.0.99
Server:  ns.lan
Address:  192.168.0.99

Name:    router.lan
Address:  192.168.0.1

Test dig:

user@jesterka:/# dig @192.168.0.99 +short router.lan
192.168.0.1
Ověření překladu IP adresy na doménové jméno (PTR záznam):

Test nslookup:

C:\>nslookup 192.168.0.1 192.168.0.99
Server:  ns.lan
Address:  192.168.0.99

Name:    router.lan
Address:  192.168.0.1

Test dig:

user@jesterka:/# dig @192.168.0.99 +short -x 192.168.0.1
router.lan
Ověření rekurzivního dotaz doménového jména na IP adresu (A záznam):

Defaultně je BIND server nastaven tak, aby prováděl rekurzivní DNS dotazy.

Test nslookup:

C:\>nslookup google.cz 192.168.0.99
Server:  ns.lan
Address:  192.168.0.99

Non-authoritative answer:
Name:    google.cz
Addresses:  2a00:1450:4014:80c::2003
          172.217.23.195

Test dig:

user@jesterka:/# dig @192.168.0.99 +short google.cz
172.217.23.195

Pokud se DNS resolving neprovádí, je potřeba přidat do souboru named.conf.options následující řádek a provést restart služby BIND:

recursion yes;

Nicméně defaultní nastavení v souboru named.conf.options by mělo provádět DNS resolving i bez příkazu výše.

Pozn. Defaultně je rekurzivní dotaz zasílán na jeden z 13 root DNS serverů. Tyto DNS root servery lze najít v souboru /usr/share/dns/root.hints (nově na OS Ubuntu 20.04) případně a na nižších OS Ubuntu v souboru /etc/bind/db.root. [1] Pozn. V době psaní tohoto článku je dnes skutečných root DNS serverů kolem 1400 a jsou rozdistribuované po celém světě. To pěkně ukazuje mapa zde: https://root-servers.org

Nastavení DNS serveru pro celou domácí síť:

Proto aby se mohl tento DNS server a doménové jméno použít v celé domácí síti, je nutné provést změnu na domácím routeru / wifi routeru, či na jakémkoliv síťovém zařízení poskytující DHCP server. Zde je příklad nastavení pro TP-Link:

TP-link DHCP settings

Pak záleží na nastavení Lease Time v DHCP nastavení. Zde je Lease time nastaven na 120 min, čili změny by se měly projevit pro všechna síťová zařízení nejpozději po tomto čase.

Volitelně je možné nastavit, aby sám Ubuntu server využil DNS resolving “sám na sebe” a zároveň aby participoval v doméně lan a to v /etc/resolv.conf souboru:

sudo vim /etc/resolv.conf

Dopsat či přepsat následující řádky:

nameserver 127.0.0.1
search lan

Potrvzení změn:

sudo systemctl restart systemd-resolved

Ověření nastavení:

systemd-resolve --status

Výpis příkazu systemd-resolve –status:

  Current DNS Server: 127.0.0.1
         DNS Servers: 127.0.0.1
          DNS Domain: lan

Logy:

Logování klientských DNS dotazů (Query) se vypíše příkazem níže:

sudo journalctl -eu named

Výpis příkazu sudo journalctl -eu named ukazuje query logy:

srp 15 11:44:47 jesterka named[24393]: client @0x7fdff800f190 192.168.0.248#53531 (seznam.cz): query: seznam.cz IN A + (192.168.0.99)
srp 15 11:44:48 jesterka named[24393]: client @0x7fdff800f190 192.168.0.248#53532 (seznam.cz): query: seznam.cz IN AAAA + (192.168.0.99)

Pokud se neprovádí tato logování, je potřeba přidat do souboru named.conf.options následující řádek a provést restart služby BIND:

querylog yes;

Řešení problému:

a) Problém “network unreachable resolving”:

Chyby níže uvedené ve výstupu sudo journalctl -eu named můžou nastat pokud není v síti použitá IPv6.

srp 15 12:10:49 jesterka named[24953]: network unreachable resolving 'seznam.cz/A/IN': 2001:678:10::1#53
srp 15 12:10:49 jesterka named[24953]: network unreachable resolving 'seznam.cz/A/IN': 2a02:598:4444::4#53
srp 15 12:10:49 jesterka named[24953]: network unreachable resolving 'seznam.cz/A/IN': 2a02:598:3333::3#53

Řešení problému [1]:

Aby BIND nedělal resolving pro IPv6 adresy a zároveň neposlouchal na IPv6 se provede v souboru /etc/default/named:

sudo vim /etc/default/named

a přidá se -4 za parametr OPTIONS:

OPTIONS="-u bind -4"

Restart služby BIND:

sudo service bind9 restart

b) Problém “Server: UnKnown”:

Příkaz nslookup ukazuje Server: UnKnown

C:\>nslookup router.lan 192.168.0.99
Server:   UnKnown
Address:  192.168.0.99

Name:    router.lan
Address:  192.168.88.1

Řešení problému:

a) Buďto není nakonfigurována reverzní zóna viz. Vytvoření reverzní zóny

b) nebo není dobře deklarován NS záznam v reverzní zóně pro name server. Např. pokud je doménové jméno lan, NS záznam bude vypadat následovně:

@       IN      NS      ns.lan.

3) Problém “ignoring out-of-zone data”:

Při použití příkazu sudo named-checkconf -z nastala hláška ignoring out-of-zone:

/etc/bind/db.lan:4: ignoring out-of-zone data (lan)
/etc/bind/db.lan:17: ignoring out-of-zone data (router.lan)
/etc/bind/db.lan:22: ignoring out-of-zone data (ns.lan)

Řešení problému:

V tomto případě pomohlo v daném zónovém souboru buďto opravení parametru $ORIGIN se zadáním správného doménového jména, nebo vymazání tohoto parametru.

4) Problém “none:100: ‘max-cache-size 90%’ – setting to 3379MB (out of 3755MB)”

Tuto hlášku lze vidět ve výstupu sudo journalctl -eu named příkazu:

srp 22 20:49:18 jesterka named[1753449]: /etc/bind/named.conf.options:38: 'max-cache-size 50%' - setting to 1877MB (out of 3755MB)

Řešení problému [1]:

Defaultně je velikost mezipaměti (cache) pro uložení DNS výsledků nastavena na 90 % z celkové paměti RAM. Ta není využita hned a je použita jen pokud je DNS požadavků velmi hodně. Změna velikosti DNS mezipaměti se provede v souboru /etc/bind/named.conf.options. Zde bude hodnota změněna na 50%.

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

a dopsat:

max-cache-size 50%;

Restartovat službu BIND:

service bind9 restart

Zdroj:

[1] https://www.linuxbabe.com/ubuntu/set-up-local-dns-resolver-ubuntu-20-04-bind9
[2] https://blog.vpsfree.cz/co-je-to-reverzni-zaznam-ptr-a-jak-ho-nastavit/

Leave a Reply

Your email address will not be published. Required fields are marked *