Hlavní navigace

Knot DNS aneb jak přeseknout DNS uzel

8. 11. 2011
Doba čtení: 7 minut

Sdílet

Na 63. mezinárodní konferenci RIPE byl představen nový autoritativní DNS server Knot DNS, vyvinutý v Laboratořích CZ.NIC, výzkumném a vývojovém centru správce české národní domény. Čím je zajímavý, proč vznikl a jak se používá? Tomu se budeme věnovat v první části našeho dvoudílného článku.

Proč další DNS server?

Hlavním důvodem pro vznik projektu Knot DNS je nedostatečná nabídka svobodných implementací autoritativních serverů vhodných pro provoz top-level domény, jako je například doména .CZ. V současnosti jsou v zásadě k dispozici pouze dva použitelné open-source autoritativní servery – BIND a NSD, což je například pro zabezpečení stability TLD domény málo. Další implementace, napsaná „na zelené louce“, umožní zvýšit diverzitu dostupných řešení a tím i pravděpodobnost, že v případě bezpečnostního incidentu postihujícího vybranou implementaci bude možné dál poskytovat požadované služby.

Provoz DNS systému je společně například se směrováním a dalšími pro koncového uživatele neviditelnými protokoly velmi důležitý pro chod většiny ostatních vyšších protokolů jako SMTP, HTTP, XMPP a dalších. Jelikož naše expertíza leží především v oblasti DNS a jeho rozšíření jako je například DNSSEC, je vývoj vlastního DNS serveru také způsob, jak tyto znalosti a zkušenosti vracet zpět a podporovat tak rozvoj stability, bezpečnosti a robustnosti celé infrastruktury dnešního Internetu.

BIND, Unbound, …, Knot

Vymyslet název pro nový DNS server může být náročnější, než se na první pohled zdá. Po mnoha pokusech vymyslet rozumnou zkratku (zmařených buď jejich nevyslovitelností, nebo tím, že většina trojpísmenných zkratek je již zabrána jinými programy) jsme skončili u jednoduché asociativní hříčky s významy anglických slov bind a unbound (přestože druhý jmenovaný je rekurzivní a ne autoritativní server). Ostatně téměř totožná anglická výslovnost s „not DNS“ může být i celkem vtipně sebeironická.

Co Knot DNS umí?

Knot DNS je ryze autoritativní DNS server. Jeho hlavním úkolem je tudíž poskytovat zóny a to co nejrychleji a s vysokou dostupností, tedy bez výpadků. První vlastnost je zajištěna samotným návrhem serveru, který téměř nepoužívá zamykání, druhá vlastnost je možná díky schopnosti přidávat a odebírat zóny za běhu serveru a to bez nutnosti restartu. Touto vlastností se také Knot DNS liší od jiného vysoce výkonného autoritativního serveru NSD, který v současné verzi pro přidání či odebrání zóny vyžaduje restart.

K dalším důležitým vlastnostem patří podpora pro bezpečnostní rozšíření technologie DNSSEC. Ta je sice na světě už nějaký ten pátek, její zavádění je však velmi pozvolné. Knot DNS jí vychází vstříc, a to tak, že již od začátku poskytuje plnou podporu pro DNSSEC včetně NSEC3. K tomu je samozřejmě nutná také podpora EDNS0, což je rozšíření DNS protokolu, které odstraňuje některé předchozí limity DNS protokolu, jako je například maximální velikost DNS zprávy; ta byla na počátku omezena na 512 bajtů.

V zájmu dobré využitelnosti a kompatibility podporuje Knot DNS oba protokoly pro transfer zón – AXFR i IXFR a to jak v režimu master, tak v režimu slave, včetně zasílání notifikací o změnách v zónách. Konfigurace transferů je, jak uvidíme dále, velice jednoduchá a samozřejmě umožňuje omezit transfery jenom na vybrané servery.

Na seznamu vlastností, které Knot DNS podporuje nebo bude podporovat, jsou i další. O těch si ale povíme v pokračování toho článku, kde nastíníme další vývoj projektu.

Instalace a ovládání

Při instalaci ze zdrojových souborů (v současnosti je toto jediná možnost; již ale připravujeme balíčky pro nejdůležitější distribuce) se postupuje klasicky:

$ ./configure
$ make
$ sudo make install

Je samozřejmě možné nastavit prefix (parametr --prefix skriptu configure) na libovolný adresář. Dle výchozího nastavení se instaluje s prefixem /usr/local. Z hlediska uživatele jsou důležité dva soubory:

  • knotd – daemon; nachází se v $prefix/sbin/
  • knotc – ovládací utilita; nachází se v $prefix/bin/

Nejjednodušší (a doporučený) způsob ovládaní Knota je pomocí utility knotc, která pak ovládá kompilátor zóny i samotný daemon (z toho důvodu uživatel, pod kterým se knotc spouští, musí mít příslušné adresáře v  PATH). Při spuštění bez parametrů vypíše nápovědu:

Usage: /usr/local/bin/knotc [parameters] start|stop|restart|reload|running|compile
Parameters:
 -c [file]  Select configuration file.
 -f     Force operation - override some checks.
 -v     Verbose mode - additional runtime information.
 -V     Print knot server version.
 -w     Wait for the server to finish start/stop operations.
 -i     Interactive mode (do not daemonize).
 -j [num]   Number of parallel tasks to run (only for 'compile').
 -h     Print help and usage.
Actions:
 start     Start knot server zone (no-op if running).
 stop      Stop knot server (no-op if not running).
 restart   Stops and then starts knot server.
 reload    Reload knot configuration and compiled zones.
 running   check if server is running.
 compile   Compile zone file.

Asi nejdůležitějším parametrem je –c, kterým je možno zadat cestu ke konfiguračnímu souboru. V případě, že tento parametr není zadaný, hledá se výchozí konfigurační soubor ( $prefix/etc/knot.conf).

Před samotným spuštěním daemona je potřeba zkompilovat zónové soubory. Během kompilace se zónová data předzpracují pro rychlejší načítaní a zároveň optimalizují pro rychlé vyhledávání. Pokud před spuštěním samotného serveru nedojde ke kompilaci textových zónových souborů do binární podoby, nedojde k jejich načtení do daemona a tyto zóny nebudou serverem poskytovány. Uživatel je o tomto faktu informován zápisem do logu (dle výchozího nastavení do syslogu). Po ukončení načítání zón je uživatel pomocí syslogu informován také o celkovém počtu načtených zón. Tato informace je ale, na rozdíl od informace o nenačtené zóně, klasifikována do úrovně INFO a tudíž se při použití výchozího nastavení konfiguračního souboru do logu nezapisuje.

Kompilace zónových souborů se, jak je patrno z nápovědy, spustí příkazem

$ knotc compile

Zkompilované zóny se ukládají do souborů s příponou .db v pracovním adresáři nastaveném v konfiguračním souboru. Kompilace může trvat poměrně dlouho a je o něco málo náročnější na paměť než samotný server. Orientační čas a množství potřebné operační paměti pro zkompilování zóny (a tedy dostačující i pro běh serveru) uvádí následující tabulka. Je však potřebné vzít v úvahu, že přijetí zóny pomocí AXFR vyžaduje dvojnásobné množství paměti. Je totiž potřeba uchovat starou zónu v paměti do doby, než bude transfer ukončen.

Velikost zóny Potřebný čas Paměť – 32bit systém Paměť – 64 bit systém
1 MB 0,4 s 5 MB 5 MB
50 MB 20 s 130 MB 245 MB
400 MB 1 m 45 s 1,30 GB 1,45 GB

Samotné spuštění serveru je pak přímočaré:

$ knotc start

Ovšem je také možné spustit server na popředí (tj. ne jako daemon) pomocí parametru –i, případně spouštět ho přímo samotného daemon knotd.

Konfigurace

Konfigurační soubor má jednoduchý formát vycházející z konfigurace směrovacího daemona Bird. Po instalaci Knot DNS má uživatel k dispozici příklady konfiguračních souborů, z kterých se dá jednoduše odvodit jakákoliv žádaná konfigurace. Ukázkový konfigurační soubor knot.full.conf, který se nachází v adresáři samples/ mezi zdrojovými soubory, obsahuje všechny podporované konfigurační možnosti s vyčerpávajícím popisem. V této části článku si uvedeme jenom ukázkové příklady konfigurace. Detailní popis všech možností nastavení najdete v příštím díle.

AXFR/IXFR master

system {
    storage “/var/lib/knot”;        # pracovni adresar
}

interfaces {
    iface0 {                 # symbolicke jmeno interface
        address 203.0.113.1; # server bude poslouchat
                             # na uvedene adrese
        port 53;           # a danem portu
    }
}

remotes {
    my-slave {                # symbolicke jmeno pro slave server
        address 192.0.2.10; # s uvedenou adresou
        port 53;            # a portem
    }
}

zones {
    example.com {                     # jmeno zony
        file “/etc/knot/example.com.zone”;    # zonovy soubor
        xfr-out my-slave;             # slave pro tuto zonu
        notify-out my-slave;          # prijemci NOTIFY zpráv
    }
}

AXFR/IXFR slave

system {
    storage “/var/lib/knot”;
}

interfaces {
    iface0 {
        address 192.0.2.10;
        port 53;
    }
}

remotes {
    my-master {
        address 203.0.113.1;
        port 53;
    }
}

zones {
example.com {
        file “/etc/knot/example.com.zone”;
        xfr-in my-master;           # master pro tuto zonu
        notify-in my-master;        # povolene zdroje NOTIFY zprav
    }
}

Dvě instance Knot DNS s těmito konfiguracemi spolu budou komunikovat jako master a slave pro zónu example.com. Slave server přitom při spuštění nemusí mít zónový soubor. Ve chvíli, kdy zjistí, že neexistuje, pokusí se jej získat pomocí AXFR od svého master serveru.

Kde Knot DNS najít?

Hlavní stránka projektu je na adrese www.knot-dns.cz.

Chyby a návrhy na vylepšení můžete hlásit v tomto systému: git.nic.cz/redmine/projects/knot-dns/.

Zdrojové kódu udržujeme v Gitu na adrese: git://git.nic.cz/knot-dns.git; stabilní verze je udržována ve větvi master a vývoj probíhá ve větvi development.

skoleni

Příště…

V tomto prvním článku jsme si představili Knot DNS – nový výkonný autoritativní DNS server vyvíjený v Laboratořích CZ.NIC, který má za cíl stát se alternativou k existujícím implementacím na poli open-source řešení. Dále jsme si ukázali základní možnosti použití a příslušné konfigurace. V příštím dílu se podíváme na konfiguraci detailněji, vyhodnotíme výkon v porovnání s jinými implementacemi a načrtneme, jakým směrem se bude ubírat další vývoj.

Autoři:

Ľuboš Slovák a Ondřej Surý pracují v Laboratořích CZ.NIC, výzkumném a vývojovém centru správce české národní domény, sdružení CZ.NIC.

Autor článku

Autor je vedoucím výzkumu Laboratoří CZ.NIC, z.s.p.o. a studentem FSS MU. Zajímá se o DNS, DNSSEC, Linux.
Ľuboš Slovák pracuje jako programátor pro výzkum a vývoj v Laboratořích CZ.NIC, výzkumném a vývojovém centru správce české národní domény.