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

By | 27/08/2021

Last Updated on 20/07/2022 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 a konfigurace BIND DNS serveru 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>

Konfigurace BIND DNS Master serveru:

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
  • 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:

sudo service bind9 restart

Alternativně restart pomocí:

sudo 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;

Konfigurace BIND DNS Slave serveru (nepovinné):

Ve výše uvedeném případu byl nakonfigurován Master (primární) DNS server pod IP adresou 192.168.0.99. Pakliže je nakonfigurovaný tento primární DNS master server je již jednoduché nakonfigurovat Slave (sekundární) DNS server. Ten bude běžet pod jinou IP adresou na jiném serveru. V tomto případě to bude 192.168.0.98.

Slave (sekundární) server:

  • Také může být autoritativní
  • Data jsou získávána z Master DNS serveru
  • Může jich být více

Opět se provede aktualizace seznamu balíčků z repozitářů a instalace služby bind na jiném serveru:

sudo apt-get update
sudo apt-get install bind9

V souboru named.conf.local umístěného v /etc/bind/ Slave DNS serveru se deklarují opět všechny vytvořené zóny podobně jako na Master DNS serveru. Ve výše uvedeném případu byly vytvořeny dvě zóny a to forwarding zóna (lan) a reverzní zóna (0.168.192.in-addr.arpa):

sudo vim named.conf.local

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

zone "lan" in {

        type slave;
        
        masters { 192.168.0.99; };
        
        file "/var/cache/bind/db.lan";

        masterfile-format text;

};

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

        type slave;

        masters { 192.168.0.99; };

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

        masterfile-format text;
};

Legenda:

  • type slave – slave (sekundární) jmenný server
  • masters – definuje IP adresu Master DNS serveru
  • file – cesta uložení zónového souboru zkopírována z Master DNS serveru
  • masterfile-format text – přenesený zónový soubor bude v čitelném formátu

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

Restart služby BIND:

sudo service bind9 restart

Dodatečná konfigurace BIND DNS na Master serveru:

V souboru named.conf.options umístěného v /etc/bind/ na Master DNS serveru je nutné přidat následující řádek, který říká, že pokud nastane změna v jakémkoliv zónovém souboru Master DNS serveru, bude o tom oznámeno ihned slave DNS serveru. V tomto případě je IP adresa slave DNS serveru je 192.168.0.98:

also-notify { 192.168.0.98; };

Pozn. Defaultně by mělo býti povoleno přenášení zón z Master DNS serveru. Pokud příkaz allow-transfer { any; }, není vidět v souboru named.conf.options pak je vše v pořádku a netřeba dalších úprav. Pokud zde již tento příkaz allow-transfer uveden, je tak buďto nastavit na any, nebo definovat IP adresu Slave DNS serveru.

Nakonec provést restart služby BIND na Master DNS serveru:

sudo service bind9 restart

Jak informovat Slave DNS server o změnách v zónovém souboru na Master DNS serveru:

Po aktualizaci zónového souboru na Master DNS serveru je potřeba:

1. Zvětšit sériové číslo (Serial) ve změneném zónovém souboru. Např:

4 ; Serial

bude inkrementován na:

5 ; Serial

2. Provést reload zóny. Např. pokud se provede změna v zónovém souboru lan, provede se reload zóny pomocí

rndc reload lan

Po reloadu zóny Master DNS server díky příkazu also-notify oznámí změny v zónovém souboru a Slave DNS server si vyžádá zone tranfer [3].

Pozn. Přenesení zónových soubor z Master na Slave DNS server může být provedeno hromadně pomocí rndc reload, nebo restartem bind služby na Master DNS serveru. Nicméně v produkčním prostředí je doporučen právě rndc reload, jelikož nedojde k ovlivnění DNS překladu pro klienty.

Řešení problémů:

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:

sudo service bind9 restart

5) Problém “managed-keys.bind.jnl” a “managed-keys-zone”:

Dec 29 15:32:00 jesterka named[73812]: managed-keys.bind.jnl: open: permission denied
Dec 29 15:32:00 jesterka named[73812]: managed-keys-zone: keyfetch_done:dns_journal_open -> unexpected error
Dec 29 15:32:00 jesterka named[73812]: managed-keys-zone: error during managed-keys processing (unexpected error): DNSSEC validation may be at risk
Řešení problému [4]:

Problém vznikl na Secondary Slave DNS serveru, kdy byly zónové soubory stahovány do složky/var/cache/bind. Ta měla nesprávného vlastníka, než by měla mít. Tomto případě byl aplikován příkaz níže, což změnilo vlastníka:

sudo chown -R bind:bind /var/cache/bind/

A provést restart služby BIND:

sudo 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/
[3] https://serverfault.com/questions/954269/bind-force-zone-update-on-slave
[4] https://servercode.ca/how-to-fix-bind-error-managed-keys-bind-jnl-open-permission-denied/

Dobrovolný dar

Ahoj čtenáři, rád bych tě poprosil aby ses zamyslel, co je vše potřeba ke vzniku článku.
Jakožto amatérský softwarový kutil musím:

1) Nejdříve vše nastudovat v cizích jazycích.
2) Vše následně prakticky vyzkoušet.
3) Svoje poznatky a zkušenosti napsat do článku který si právě přečetl v jazyku kterému rozumíš.
4) Dát článku hlavu a patu a publikovat.

Každý článek zabere několik hodin práce, za kterou mi nikdo neplatí.
Prosím zvaž, kolik času jsem ti právě ušetřil.
Pokud ti to stojí aspoň za cenu jedné kávy, tak mi ji kup.
Předem moc děkuji.

Příspěvek tak můžeš provést zasláním libovolné částky na mé číslo účtu 1558701011/3030 Nebo můžeš dar poslat kliknutím na tento odkaz Podpořit tento WEB , který tě přesměruje na mou platební bránu Revolut.

Dar je také možné poslat ve formě Bitcoinu na BTC peněženku bc1qqdf5fp42a7srwwhh2rut8zr9x4jm5c8fqc9qw6

Veškeré peněžní prostředky budu také používat na zlepšení kvality své webové tvorby a na psaní nových technických návodů. Za každý dar předem děkuji.

Leave a Reply

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