Knot DNS: konfigurace autoritativního serveru

23. 11. 2021
Doba čtení: 7 minut

Sdílet

 Autor: Depositphotos
Abychom mohli autoritativní DNS server Knot DNS vůbec spustit, je třeba mu předložit nějakou konfiguraci. Konfigurace může být ve formě textového souboru nebo binární databáze.

Pokud konfiguraci explicitně nezadáme, pokusí se démon použít konfiguraci z přednastaveného umístění, které je určeno při překladu programu. Nejprve se zkouší konfigurační databáze (většinou /var/lib/knot/confdb) a pokud neexistuje, zkouší se konfigurační soubor (většinou /etc/knot/knot.conf). Konfigurací může být prázdný soubor nebo prázdná databáze. Kromě démona knotd, využívá konfiguraci i nástroj knotc na ovládání démona, nástroj keymgr na správu DNSSEC a další.

Konfigurační soubor

Formát konfiguračního souboru vychází z formátu YAML, ale jedná se pouze o jeho zjednodušenou variantu s některými úpravami. Na nejvyšší úrovni jsou uvedeny konfigurační sekce, kde každá sekce obsahuje buďto přímo jednu sadu konfiguračních voleb (např. server) nebo sekvenci pojmenovaných sad stejných konfiguračních voleb (např. remote). Hlubší zanoření se nepoužívá a odsazuje se výhradně mezerami (nikoli tabulátorem). Stejnou sekci je možné uvést vícekrát. Nelze ale vícekrát uvést sadu se stejným identifikátorem. Identifikátor sady konfiguračních voleb musí být uveden vždy jako první. Příklady:

server:
  listen: 192.168.1.1

remote:
  - id: ok1
    address: 192.168.1.2

  # identifier not first
  - address: 192.168.1.3
    id: bad_order

remote:
  - id: ok2
    address: 192.168.1.3

  # duplicate identifier
  - id: ok2
    address: 192.168.1.3

Některé konfigurační volby mohou obsahovat více hodnot. O které volby se jedná, lze vyčíst z referenčního manuálu. Více hodnot je možné zapsat jako seznam v hranatých závorkách na jednom řádku nebo nestandardním způsobem s opakováním názvu volby na více řádcích. Příklady:

remote:
  - id: one-line
    address: [192.168.1.1, 192.168.1.2]

  - id: multi-line
    address: 192.168.2.1
    address: 192.168.2.2

Při zopakování volby, která nepodporuje více hodnot, se použije pouze hodnota posledního výskytu.

Pokud hodnota obsahuje nějaký speciální znak (např. mezeru nebo komentář #), je třeba celou hodnotu uzavřít mezi dvojici dvojitých uvozovek " (jednoduchá uvozovka ' je považována za běžný znak). Příklad:

server:
  identity: "My best server #1"

Konfigurační soubor je načítán sekvenčně a při jeho zpracování se kontroluje validita hodnot, závislosti mezi některými položkami či nevhodné nastavení. Proto může záležet, v jakém pořadí jsou některé sekce uvedeny. Pokud je uvedená hodnota identifikátor nějaké konfigurační sekce, musí být takový identifikátor znám před jeho uvedením. Příklady:

remote:
  - id: remote1
    address: 192.168.1.1

acl:
  - id: ok
    remote: remote1
    action: transfer

  - id: ko
    # unknown identifier remote2
    remote: remote2
    action: transfer

remote:
  - id: remote2
    address: 192.168.1.2

Je dobrým zvykem ještě před načtením upraveného konfiguračního souboru ověřit, že neobsahuje chyby, které by zabránily jeho načtení. Obzvlášť při restartu démona by mohlo dojít k nepříjemné situaci. Pro ověření konfigurace slouží příkaz:

$ sudo knotc conf-check
Configuration is valid

V případě chyby je stručně popsán problém a číslo řádku, kde se problém vyskytuje. U kontextových chyb číslo řádku odkazuje za postiženou sekci. Příklad:

$ sudo knotc conf-check
error: config, file '/etc/knot/knot.conf', line 29, item 'remote', value 'remote2' (invalid reference)
error: failed to load configuration file '/etc/knot/knot.conf' (not exists)

Zónové šablony

Při konfigurování více zón se stejným nastavením je praktické používat zónové šablony. Jedná se o pojmenované obecné nastavení zóny, na které se lze odkázat bez nutnosti opětovné specifikace všech voleb. Nastavení z šablony je možné potlačit explicitní specifikací příslušné volby. Šablona s identifikátorem default, pokud existuje, je použita pro nastavení všech zón, které nemají šablonu uvedenu. Příklady:

template:
  - id: default
    storage: /var/lib/knot/unsigned-zones
    dnssec-signing: off

  - id: signed
    storage: /var/lib/knot/signed-zones
    dnssec-signing: on

zone:
  # zone with default template
  - domain: example.com.

  # zone with default template but signing enabled
  - domain: example.org.
    dnssec-signing: on

  # zone with signing enabled by template
  - domain: example.net.
    template: signed

Vkládání souborů

U obsáhlejších konfigurací nebo konfigurací, kde jsou různé části nastavení spravovány někým jiným, může být vhodné konfigurační soubor rozdělit na více částí a tyto části vložit do hlavního konfiguračního souboru. To lze provést konfigurační volbou include. Takže například soubor /etc/knot/zones.conf s dílčím obsahem konfigurace:

zone:
  - domain: example.com.
  - domain: example.net.
  - domain: example.org.

vložíme do hlavního souboru konfigurace /etc/knot/knot.conf:

server:
  listen: 192.168.1.1

template:
  - id: default
    storage: /var/lib/knot/zones

include: /etc/knot/zones.conf

Konfigurační databáze

Konfigurační databáze je založena na výkonné databázi LMDB, která je typu klíč-hodnota. Její obsah není určen k přímému přístupu, ale přes ovládací nástroj knotc, čímž je do jisté míry zaručena její integrita. Hlavní výhodou konfigurační databáze je, že je okamžitě k dispozici oproti konfiguračnímu souboru, který se musí vždy nejprve naparsovat a uložit do dočasné konfigurační databáze (interně se pracuje pouze s nějakou formou konfigurační databáze). Pokud je tedy konfigurace obsáhlá, je vhodné použit perzistentní konfigurační databázi, neboť výrazně urychlí start démona knotd či spouštění nástrojů (knotc, keymgr).

Před použitím konfigurační databáze jí musíme nejprve inicializovat příkazem (pozor na vlastníka souborů databáze!):

$ sudo -u knot knotc conf-init
OK

Tím se vytvoří prázdná konfigurační databáze /var/lib/knot/confdb a při dalším spuštění démona nebo některého z nástrojů se automaticky použije. Od této chvíle je případný konfigurační soubor ignorován!

Často ale nechceme vycházet z prázdné databáze, ale chceme ji naplnit obsahem nějakého existujícího konfiguračního souboru. To je možné provést příkazem:

$ sudo knotc conf-import /etc/knot/knot.conf
OK

Po restartování démona sudo systemctl restart knot vidíme v logu informaci o použití konfigurační databáze:

Nov 15 14:09:39 ns1.xdp.cz knotd[171682]: info: loaded configuration database '/var/lib/knot/confdb', mapsize 512 MiB

Pokud bychom chtěli aktuální obsah konfigurační databáze exportovat do konfiguračního souboru, poslouží nám k tomu příkaz:

$ sudo knotc conf-export /tmp/knot.conf
OK

Podobně jako u databáze žurnálu, i konfigurační databáze má limit na maximální zaplnění. Pokud by nám výchozí limit nevyhovoval (většinou 512 MiB), můžeme ho upravit přidáním řádků:

[Service]
Environment="KNOT_CONF_MAX_SIZE=1024"

v editačním režimu po spuštění příkazu:

$ sudo systemctl edit knot

Po následném restartu serveru sudo systemctl restart knot vidíme v logu navýšený limit:

Nov 15 14:28:53 ns1.xdp.cz knotd[171851]: info: loaded configuration database '/var/lib/knot/confdb', mapsize 1024 MiB

Dynamická konfigurace

Ke konfigurační databázi přistupujeme pomocí nástroje knotc. Pro výpis aktuální konfigurace slouží příkaz conf-read s případným upřesňujícím parametrem názvu sekce či konkrétní volby. Příklady:

$ sudo knotc conf-read server
server.rundir = /run/knot
server.user = knot:knot
server.listen = 2001:1488:ac15:ff30::28 127.0.0.1@53 ::1@53

$ sudo knotc conf-read zone[xdp.cz]
zone.domain = xdp.cz.
zone[xdp.cz.].notify = secondary
zone[xdp.cz.].acl = acl_secondary
zone[xdp.cz.].zonefile-sync = -1
zone[xdp.cz.].zonefile-load = difference-no-serial
zone[xdp.cz.].journal-content = all
zone[xdp.cz.].dnssec-signing = on
zone[xdp.cz.].serial-policy = dateserial

$ sudo knotc conf-read zone[xdp.cz].dnssec-signing
zone[xdp.cz.].dnssec-signing = on

Abychom mohli konfiguraci upravovat, musíme nejprve zahájit konfigurační transakci příkazem conf-begin. V jednu chvíli může být aktivní pouze jedna transakce, která je sdílena mezi všemi klienty (knotc nebo rozhraní v Python). V rámci transakce jsou k dispozici příkazy:

  • conf-get – obdoba conf-read ale zohledňuje změny v transakci,
  • conf-set – nastavení nové hodnoty nebo přidání hodnoty do seznamu hodnot,
  • conf-unset – odebrání volby nebo odebrání hodnoty ze seznamu hodnot,
  • conf-diff – zobrazení rozdílu mezi aktuálním stavem a transakcí,
  • conf-commit – ukončení transakce s uložením změn,
  • conf-abort – ukončení transakce s ignorováním změn.

Pro ukázku si přidáme pokusný popis vzdáleného serveru s identifikátorem test:

$ sudo knotc conf-begin
OK

$ sudo knotc conf-set remote[test]
OK

$ sudo knotc conf-set remote[test].address 192.168.1.27
OK

$ sudo knotc conf-set remote[test].address 2001:1488:ac15:ff30::27
OK

$ sudo knotc conf-diff
+remote.id = test
+remote[test].address = 192.168.1.27 2001:1488:ac15:ff30::27

$ sudo knotc conf-get remote
remote.id = secondary
remote[secondary].address = 2001:1488:ac15:ff30::29
remote[secondary].key = key.xdp.cz.
remote.id = test
remote[test].address = 192.168.1.27 2001:1488:ac15:ff30::27

$ sudo knotc conf-read remote
remote.id = secondary
remote[secondary].address = 2001:1488:ac15:ff30::29
remote[secondary].key = key.xdp.cz.

$ sudo knotc conf-commit
OK

$ sudo knotc conf-read remote
remote.id = secondary
remote[secondary].address = 2001:1488:ac15:ff30::29
remote[secondary].key = key.xdp.cz.
remote.id = test
remote[test].address = 192.168.1.27 2001:1488:ac15:ff30::27

Interaktivní režim

Ovládací nástroj knotc nabízí interaktivní režim, který může usnadnit práci nejen při správě konfigurace. Do tohoto režimu vstoupíme, když při spuštění knotc nezadáme žádný příkaz. Interaktivní režim je založen na službách knihovny libedit. Historie příkazů je uložena v souboru ~/.knotc_history. Názvy příkazů, sekcí nebo identifikátorů lze doplňovat klávesou TAB. Vyčištění terminálu pomocí CTRL+l. Poslední dnešní ukázkou je úprava konfigurace v interaktivním režimu v animované podobě (klikněte pro zvětšení):

bitcoin školení listopad 24


Autor: CZ.NIC

Příště se podíváme na problematiku DNSSEC.

(Původně napsáno pro blog 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.