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