Nasazujeme Knot DNS na vlastní doméně: praktický návod

14. 10. 2021
Doba čtení: 12 minut

Sdílet

 Autor: Depositphotos
Uživatelé se často ptají, jak zprovoznit vlastní DNS server. Na praktických příkladech si tedy přiblížíme základy i pokročilejší možnosti Knot DNS, autoritativního serveru z dílen českého sdružení CZ.NIC.

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
  1. Verzování
  2. Instalace
  3. Základní nastavení
  4. Nastavení zóny
  5. Zprovoznění sekundárního serveru
  6. Zapnutí DNSSEC
  7. Hurá do Internetu

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.

bitcoin_skoleni


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.)

Autor článku

Vystudoval softwarové inženýrství na Fakultě jaderné a fyzikálně inženýrské ČVUT v Praze. V Laboratořích sdružení CZ.NIC má na starosti vývoj projektu Knot DNS, jehož je členem od roku 2012.