Na úvod ještě jedno upozornění. Budeme se věnovat autoritativnímu DNS serveru. Pokud spravujete, nebo byste rádi začali spravovat nějaké domény, je tento seriál určen právě pro vás. Funkcí rekurzivního DNS serveru se zabývá sesterský projekt Knot Resolver.
Co se dozvíte v článku
Verzování
Verze Knot DNS se označuje klasickou kombinací tří čísel oddělených tečkou (X.Z.Y), kde první dvě čísla udávají majoritní verzi a třetí číslo verzi minoritní. Majoritní verze se mohou výrazně lišit ve funkcionalitě a programovém rozhraní knihoven. Minoritní verze, v rámci stejné majoritní verze, se liší množstvím oprav a případných menších vylepšeních, která nenarušují kompatibilitu. Podporovány jsou vždy jen poslední dvě majoritní verze:
- aktuální stabilní verze (nyní 3.1.2) – obsahuje nejnovější funkce a opravy, avšak s větším rizikem výskytu nových chyb,
- předchozí stabilní verze (nyní 3.0.9) – časem prověřenější a stabilnější kód, kde aktualizace obsahují většinou už jen důležitější opravy.
Životnost majoritních verzí není striktně určena, ale bývá přibližně tři čtvrtě roku. S vydáním nové majoritní verze se přesune aktuální stabilní verze do role předchozí stabilní verze. A předchozí stabilní verze už není dále podporována. Je naší snahou zaručit, aby přechod mezi bezprostředně následnými verzemi byl bezproblémový. Proto je vhodné, aby uživatelé včas vyřešili případná varování v logu ohledně budoucích změn. U vzdálenějších přechodů již nemusí fungovat zpětná kompatibilita (viz migrace na následující verzi).
Instalace
Na výběr je několik způsobů instalace:
- ze zdrojového kódu – určeno spíše pokročilejším uživatelům se speciálními potřebami. Zdrojový kód je možné stáhnout jako komprimovaný archiv nebo přímo z repozitáře git. Příslušné odkazy jsou na stránkách projektu.
- distribuční repozitáře – pro většinu linuxových distribucí, BSD systémů nebo macOS můžete nalézt nějakou verzi Knot DNS ve formě binárního balíčku nebo portu (hezký přehled nabízí služba Repology). Nevýhodou této varianty je často neaktuálnost či dokonce nevhodnost dostupné verze. U distribucí/repozitářů s delším životním cyklem je tato varianta spíše nedoporučena.
- Projektové repozitáře – v rámci projektu udržujeme vlastní repozitáře pro dominantní linuxové distribuce (Debian, Ubuntu, CentOS, Fedora, openSUSE). Opět na stránkách projektu naleznete odkazy a návody k instalaci. Největší výhodou je aktuálnost a možnost výběru mezi aktuální a předchozí stabilní verzí. Nevýhodou je omezenější výběr architektur (i386, amd64, armhf, arm64).
- Docker image – na Docker Hub jsou také k dispozici obrazy pro jednotlivé verze.
Pro následující ukázky jsme si zvolili aktuální stabilní verzi Knot DNS a čistou instalaci operačního systému Ubuntu 20.04. Nastavíme si projektový repozitář, nainstalujeme server knot a pomocné utility knot-dnsutils, které poslouží k následným ukázkám:
$ sudo add-apt-repository ppa:cz.nic-labs/knot-dns-latest $ sudo apt update Hit:1 http://ppa.launchpad.net/cz.nic-labs/knot-dns-latest/ubuntu focal InRelease ... $ sudo apt install knot knot-dnsutils
Úspěšnou instalaci ověříme pomocí:
$ systemctl status knot ● knot.service - Knot DNS server Loaded: loaded (/lib/systemd/system/knot.service; disabled; vendor preset: enabled) Active: active (running) since Wed 2021-10-06 13:39:19 CEST; 13s ago Docs: man:knotd(8) man:knot.conf(5) man:knotc(8) Main PID: 60808 (knotd) Tasks: 16 (limit: 1674) Memory: 1.9M CGroup: /system.slice/knot.service └─60808 /usr/sbin/knotd -m 512 Oct 06 13:39:19 ns1.xdp.cz knotc[60796]: Configuration is valid Oct 06 13:39:19 ns1.xdp.cz knotd[60808]: info: Knot DNS 3.1.2 starting Oct 06 13:39:19 ns1.xdp.cz knotd[60808]: info: loaded configuration file '/etc/knot/knot.conf', mapsize 512 MiB Oct 06 13:39:19 ns1.xdp.cz knotd[60808]: warning: no network interface configured Oct 06 13:39:19 ns1.xdp.cz knotd[60808]: info: loading 0 zones Oct 06 13:39:19 ns1.xdp.cz knotd[60808]: warning: no zones loaded Oct 06 13:39:19 ns1.xdp.cz knotd[60808]: info: starting server Oct 06 13:39:19 ns1.xdp.cz knotd[60808]: info: server started in the foreground, PID 60808 Oct 06 13:39:19 ns1.xdp.cz knotd[60808]: info: control, binding to '/run/knot/knot.sock' Oct 06 13:39:19 ns1.xdp.cz systemd[1]: Started Knot DNS server.
Z výpisu se můžeme dočíst, že démon knotd byl úspěšně spuštěn, jeho konfigurace je uložena v textovém souboru /etc/knot/knot.conf, neposlouchá na žádné síťové adrese a nemá k dispozici žádnou zónu.
Základní nastavení
Obsah textového konfiguračního souboru je ve formátu zjednodušeného YAML. Zjednodušeného znamená, že jsou podporovány pouze základní konstrukce, ale zároveň je zde pár nekompatibilních změn, se kterými je třeba počítat v případě zpracovávání jinými nástroji. Na odlišnosti upozorníme v dalším popisu.
Struktura konfigurace se skládá z několika sekcí, kde každá sekce nastavuje odlišnou část démona. V textovém editoru otevřeme zmíněný konfigurační soubor a vyhledáme sekci server. Zde se nastavují obecné parametry démona. Odstraníme znak komentáře # z řádky u volby listen a přidáme veřejnou IPv6 adresu našeho serveru k již vyplněným dvěma lokálním adresám. Výsledek bude v našem případě vypadat:
server: rundir: "/run/knot" user: knot:knot listen: [ 2001:1488:ac15:ff30::28, 127.0.0.1@53, ::1@53 ]
Výchozí hodnotu portu 53 není třeba specifikovat. Změnu uložíme a restartujeme démona, aby si načetl novou konfiguraci:
$ sudo systemctl restart knot
Ve výpisu logů nově vidíme, že démon poslouchá na třech adresách:
$ journalctl -u knot ... Oct 06 13:42:29 ns1.xdp.cz knotd[61008]: info: binding to interface 2001:1488:ac15:ff30::28@53 Oct 06 13:42:29 ns1.xdp.cz knotd[61008]: info: binding to interface 127.0.0.1@53 Oct 06 13:42:29 ns1.xdp.cz knotd[61008]: info: binding to interface ::1@53 ...
Nyní může nástrojem kdig ověřit základní funkčnost démona, kdy se ho dotážeme po lokální adrese ::1 na jeho verzi pomocí speciálního dotazu:
$ kdig @::1 ch txt version.server ;; ->>HEADER<<- opcode: QUERY; status: NOERROR; id: 42337 ;; Flags: qr rd; QUERY: 1; ANSWER: 1; AUTHORITY: 0; ADDITIONAL: 0 ;; QUESTION SECTION: ;; version.server. CH TXT ;; ANSWER SECTION: version.server. 0 CH TXT "Knot DNS 3.1.2" ;; Received 59 B ;; Time 2021-10-01 20:02:13 CEST ;; From ::1@53(UDP) in 0.0 ms
Ve výstupu je důležitý návratový kód v hlavičce status: NOERROR a obsah sekce ANSWER.
Nastavení zóny
V tomto kroku už dáme našemu démonu nějaká data. Jako příklad jsme si zvolili doménu xdp.cz. Abychom mohli doménu provozovat, je třeba popsat část DNS stromu (tzv. zónu), pro kterou bude náš server autoritativní. Obsah zóny se většinou zapisuje do textového souboru, jehož základní formát stanovuje RFC 1035.
Vytvoříme zónový soubor /var/lib/knot/xdp.cz.zone s následujícím obsahem:
$ORIGIN xdp.cz. $TTL 300 xdp.cz. SOA ns1.xdp.cz. knot-dns.nic.cz. 1 36000 600 864000 300 xdp.cz. NS ns1.xdp.cz. xdp.cz. NS ns2.xdp.cz. ns1.xdp.cz. AAAA 2001:1488:ac15:ff30::28 ns2.xdp.cz. AAAA 2001:1488:ac15:ff30::29
Formát souboru je poměrně volný a některé informace lze zjednodušit. Např. direktivou $TTL, která určuje hodnotu TTL záznamů, u kterých není uvedena. Za povšimnutí stojí nevýrazný detail, že každé doménového jméno je ukončeno tečkou. Takové doménové jméno se nazývá plně kvalifikované (tzv. FQDN). Pokud je doménové jméno zapsáno relativně (bez ukončení tečkou), je interně interpretováno, jako kdyby bylo ukončeno obsahem direktivy $ORIGIN (např. ns1 je ekvivalentní ns1.xdp.cz.).
Následují záznamy:
- SOA – určuje název primárního serveru (ns1.xdp.cz.), e-mailovou adresu správce zóny (první tečka má význam zavináče, tedy knot-dns@nic.cz.), verzi obsahu zóny (1), časovače pro synchronizaci zóny (36000 600 864000) a TTL negativních odpovědí (300),
- NS – určuje název serveru, ze kterého je zóna poskytována. V našem případě jsou dva (ns1.xdp.cz. a ns2.xdp.cz.),
- AAAA – určuje IPv6 adresu serveru (ns1.xdp.cz.. má adresu 2001:1488:ac15:ff30::28),
- (A) – by určoval IPv4 adresu (z technických důvodů nepoužito).
V konfiguračním souboru aktivujeme zónu přidáním:
zone: - domain: xdp.cz.
Načteme změněnou konfiguraci (v tomto případě už není třeba restartovat démona):
$ sudo systemctl reload knot
V logu zkontrolujeme úspěšné načtení přidané zóny:
Oct 06 17:16:14 ns1.xdp.cz systemd[1]: Reloading Knot DNS server. Oct 06 17:16:14 ns1.xdp.cz knotd[61008]: info: reloading configuration file '/etc/knot/knot.conf' Oct 06 17:16:14 ns1.xdp.cz knotd[61008]: info: [xdp.cz.] zone will be loaded Oct 06 17:16:14 ns1.xdp.cz knotd[61008]: info: configuration reloaded Oct 06 17:16:14 ns1.xdp.cz systemd[1]: Reloaded Knot DNS server. Oct 06 17:16:15 ns1.xdp.cz knotd[61008]: info: [xdp.cz.] zone file parsed, serial 1 Oct 06 17:16:15 ns1.xdp.cz knotd[61008]: info: [xdp.cz.] loaded, serial none -> 1, 203 bytes
Ověříme funkčnost dotazem přes veřejnou adresu:
$ kdig @2001:1488:ac15:ff30::28 xdp.cz soa ;; ->>HEADER<<- opcode: QUERY; status: NOERROR; id: 4974 ;; Flags: qr aa rd; QUERY: 1; ANSWER: 1; AUTHORITY: 0; ADDITIONAL: 0 ;; QUESTION SECTION: ;; xdp.cz. IN SOA ;; ANSWER SECTION: xdp.cz. 300 IN SOA ns1.xdp.cz. knot-dns.nic.cz. 1 36000 600 864000 300 ;; Received 77 B ;; Time 2021-10-06 17:17:46 CEST ;; From 2001:1488:ac15:ff30::28@53(UDP) in 0.0 ms
Zprovoznění sekundárního serveru
Pro provoz domény potřebujeme ještě alespoň jeden DNS server (požadavek registru domén .cz). Většinou jde o geograficky jinou lokalitu, jinou podsíť a někdy i jinou softwarovou implementaci. V naší ukázce se omezíme jen na druhou instanci Knot DNS pod jinou adresou. Bez ukázky si zprovozníme druhý (sekundární) server ns2.xdp.cz s adresou 2001:1488:ac15:ff30::29. Postup je stejný až po nastavení zóny, protože obsah zóny zde budeme automaticky synchronizovat z primárního serveru. Tato operace se nazývá zónový transfer.
Na primárním serveru rozšíříme konfiguraci o popis sekundárního serveru. Tento popis bude odkazován pod názvem secondary:
remote: - id: secondary address: 2001:1488:ac15:ff30::29
Protože zónové transfery nejsou ve výchozím nastavení povoleny, musíme ještě zavést pravidlo, které povolí operaci transfer pro sekundární server:
acl: - id: acl_secondary remote: secondary action: transfer
Nakonec v nastavení zóny přiřadíme příslušné pravidlo ACL a zapneme pro sekundární server zasílání oznámení o změně zóny:
zone: - domain: xdp.cz. notify: secondary acl: acl_secondary
Kdybychom notifikace nenastavili, synchronizoval by si sekundární server obsah zóny sám jen na základě hodnot časovačů v záznamu SOA, což není vhodné pro zóny, které se často mění nebo jsou zabezpečené pomocí DNSSEC. Změny potvrdíme příkazem sudo systemctl reload knot
Na sekundárním serveru vytvoříme „zrcadlovou“ konfiguraci. Zavedeme popis pro primární server:
remote: - id: primary address: 2001:1488:ac15:ff30::28
Vytvoříme pravidlo ACL pro přijímání notifikací od primárního serveru:
acl: - id: acl_primary remote: primary action: notify
Přidáme zónu s příslušným ACL a nastaveným primárním serverem:
zone: - domain: xdp.cz. master: primary acl: acl_primary
Změny potvrdíme příkazem sudo systemctl reload knot a v logu sekundárního serveru se přesvědčíme o úspěšném transferu:
Oct 06 20:07:00 ns2.xdp.cz systemd[1]: Reloading Knot DNS server. Oct 06 20:07:00 ns2.xdp.cz knotd[48345]: info: reloading configuration file '/etc/knot/knot.conf' Oct 06 20:07:00 ns2.xdp.cz knotd[48345]: info: [xdp.cz.] zone will be loaded Oct 06 20:07:00 ns2.xdp.cz knotd[48345]: info: [xdp.cz.] failed to parse zone file (not exists) Oct 06 20:07:00 ns2.xdp.cz knotd[48345]: info: configuration reloaded Oct 06 20:07:00 ns2.xdp.cz systemd[1]: Reloaded Knot DNS server. Oct 06 20:07:00 ns2.xdp.cz knotd[48345]: info: [xdp.cz.] AXFR, incoming, remote 2001:1488:ac15:ff30::28@53, started Oct 06 20:07:00 ns2.xdp.cz knotd[48345]: info: [xdp.cz.] AXFR, incoming, remote 2001:1488:ac15:ff30::28@53, finished, 0.00 seconds, 1 messages, 241 bytes Oct 06 20:07:00 ns2.xdp.cz knotd[48345]: info: [xdp.cz.] refresh, remote 2001:1488:ac15:ff30::28@53, zone updated, 0.01 seconds, serial none -> 1 Oct 06 20:07:00 ns2.xdp.cz knotd[48345]: info: [xdp.cz.] zone file updated, serial 1
V logu primárního serveru vidíme úspěšný odchozí transfer:
Oct 06 20:07:00 ns1.xdp.cz knotd[61008]: info: [xdp.cz.] AXFR, outgoing, remote 2001:1488:ac15:ff30::29@60394, started, serial 1 Oct 06 20:07:00 ns1.xdp.cz knotd[61008]: info: [xdp.cz.] AXFR, outgoing, remote 2001:1488:ac15:ff30::29@60394, finished, 0.00 seconds, 1 messages, 241 bytes
V tuto chvíli máme zónu na sekundárním serveru automaticky synchronizovanou. Poznamenejme, že popsané nastavení zónového transferu není nijak zabezpečeno s ohledem na zajištění integrity a soukromí. O možnostech vylepšení si povíme někdy příště.
Zapnutí DNSSEC
Co by to bylo za návod, kdybychom opominuli zabezpečit naší zónu pomocí DNSSEC. Na primárním serveru přidáme do konfigurace zóny dnssec-signing: on. Tedy:
zone: - domain: xdp.cz. notify: secondary acl: acl_secondary dnssec-signing: on
Změnu potvrdíme sudo systemctl reload knot a v logu primárního serveru vidíme:
Oct 06 20:13:48 ns1.xdp.cz systemd[1]: Reloading Knot DNS server. Oct 06 20:13:48 ns1.xdp.cz knotd[61008]: info: reloading configuration file '/etc/knot/knot.conf' Oct 06 20:13:48 ns1.xdp.cz knotd[61008]: info: [xdp.cz.] DNSSEC, signing zone Oct 06 20:13:48 ns1.xdp.cz knotd[61008]: info: configuration reloaded Oct 06 20:13:48 ns1.xdp.cz systemd[1]: Reloaded Knot DNS server. Oct 06 20:13:48 ns1.xdp.cz knotd[61008]: notice: [xdp.cz.] DNSSEC, KSK submission, waiting for confirmation Oct 06 20:13:48 ns1.xdp.cz knotd[61008]: info: [xdp.cz.] DNSSEC, key, tag 32114, algorithm ECDSAP256SHA256, KSK, public, ready, active+ Oct 06 20:13:48 ns1.xdp.cz knotd[61008]: info: [xdp.cz.] DNSSEC, key, tag 16843, algorithm ECDSAP256SHA256, public, active Oct 06 20:13:48 ns1.xdp.cz knotd[61008]: info: [xdp.cz.] DNSSEC, signing started Oct 06 20:13:48 ns1.xdp.cz knotd[61008]: info: [xdp.cz.] DNSSEC, successfully signed Oct 06 20:13:48 ns1.xdp.cz knotd[61008]: info: [xdp.cz.] DNSSEC, next signing at 2021-10-13T20:13:48+0200 Oct 06 20:13:48 ns1.xdp.cz knotd[61008]: info: [xdp.cz.] zone file updated, serial 1 -> 2 Oct 06 20:13:48 ns1.xdp.cz knotd[61008]: info: [xdp.cz.] notify, outgoing, remote 2001:1488:ac15:ff30::29@53, serial 2 Oct 06 20:13:48 ns1.xdp.cz knotd[61008]: info: [xdp.cz.] IXFR, outgoing, remote 2001:1488:ac15:ff30::29@60396, started, serial 1 -> 2 Oct 06 20:13:48 ns1.xdp.cz knotd[61008]: info: [xdp.cz.] IXFR, outgoing, remote 2001:1488:ac15:ff30::29@60396, finished, 0.00 seconds, 1 messages, 1657 bytes
Tedy že zóna byla úspěšně podepsána dvěma ECDSA klíči KSK (keytag 32114) a ZSK (keytag 16843), nová verze zóny je 2, obsah zónového souboru byl aktualizován, sekundární server informován o změně a následně synchronizován.
V logu sekundárního serveru vidíme úspěšnou synchronizaci:
Oct 06 20:13:48 ns2.xdp.cz knotd[48345]: info: [xdp.cz.] notify, incoming, remote 2001:1488:ac15:ff30::28@48870, serial 2 Oct 06 20:13:48 ns2.xdp.cz knotd[48345]: info: [xdp.cz.] refresh, remote 2001:1488:ac15:ff30::28@53, remote serial 2, zone is outdated Oct 06 20:13:48 ns2.xdp.cz knotd[48345]: info: [xdp.cz.] IXFR, incoming, remote 2001:1488:ac15:ff30::28@53, started Oct 06 20:13:48 ns2.xdp.cz knotd[48345]: info: [xdp.cz.] IXFR, incoming, remote 2001:1488:ac15:ff30::28@53, finished, 0.00 seconds, 1 messages, 1657 bytes Oct 06 20:13:48 ns2.xdp.cz knotd[48345]: info: [xdp.cz.] refresh, remote 2001:1488:ac15:ff30::28@53, zone updated, 0.05 seconds, serial 1 -> 2 Oct 06 20:13:48 ns2.xdp.cz knotd[48345]: info: [xdp.cz.] zone file updated, serial 1 -> 2
Hotovo!
Hurá do Internetu
V předchozích krocích jsme si připravili naše servery, ale aby začaly odbavovat reálný provoz z Internetu, je třeba je řádně „zaregistrovat“. Musíme tedy v rozhraní registrátora u naší domény nastavit tzv. NSSET. To je jen výčet autoritativních serverů pro danou doménu. Pokud spadají názvy serverů pod samotnou doménu, je nutné ještě doplnit jejich síťové adresy (tzv. glue). V našem případě:
- ns1.xdp.cz s IPv6 adresou 2001:1488:ac15:ff30::28
- ns2.xdp.cz s IPv6 adresou 2001:1488:ac15:ff30::29
Kdybychom nebyli netrpěliví, tak bychom mohli vyčkat několik dní, než se automaticky aktivuje DNSSEC v registru CZ.NIC. To ovšem není náš případ, takže si na primárním serveru vypíšeme obsah DNSKEY záznamu pro klíč KSK:
$ sudo keymgr xdp.cz dnskey xdp.cz. DNSKEY 257 3 13 ONGSk6Yko2ZDmzlASEh6H8ZOnVv2lrjLU2CCJKH6QEaevH1vlH42sSDd+kCngJ4FKvXGpazCtAPbjHby67iBxA==
V rozhraní registrátora nastavíme tzv. KEYSET, kam vložíme vypsaný obsah. Po uložení změn a vyčkání několika desítek minut máme naši doménu zcela nakonfigurovanou. Dotázáním veřejného resolveru ověříme:
$ kdig @1.1.1.1 xdp.cz dnskey +dnssec +nocrypto ;; ->>HEADER<<- opcode: QUERY; status: NOERROR; id: 6705 ;; Flags: qr rd ra ad; QUERY: 1; ANSWER: 3; AUTHORITY: 0; ADDITIONAL: 1 ;; EDNS PSEUDOSECTION: ;; Version: 0; flags: do; UDP size: 1232 B; ext-rcode: NOERROR ;; QUESTION SECTION: ;; xdp.cz. IN DNSKEY ;; ANSWER SECTION: xdp.cz. 277 IN DNSKEY 256 3 13 [id = 16843] xdp.cz. 277 IN DNSKEY 257 3 13 [id = 32114] xdp.cz. 277 IN RRSIG DNSKEY 13 2 300 20211020181348 20211006164348 32114 xdp.cz. [omitted] ;; Received 297 B ;; Time 2021-10-07 16:11:58 CEST ;; From 1.1.1.1@53(UDP) in 16.2 ms
S využitím služby DNSViz ověříme správně nakonfigurovaný DNSSEC. Červený vykřičník znamená nedostupnost serverů po IPv4.
Dnes jsme si předvedli, jak lze snadno nasadit Knot DNS na vlastní doméně. Problematika DNS je však obsáhlá a předvedené ukázky byly voleny minimalisticky. V dalších dílech se zaměříme na některá témata více do hloubky. Mezi tím se budeme těšit na případnou zpětnou vazbu.
(Původně vyšlo na blogu CZ.NIC.)