Princip fungování DNS

Domain Name System je fascinující – jedná se o klíčovou službu Internetu, kterou všichni denně využíváme, ale přitom „není vidět“. Jak je sestaven doménový strom? Co je to TLD? Existují i jiné hierarchie?

Doménový strom

Z hlediska obsahu je klíčovou komponentou DNS doménový strom. V této datové struktuře jsou hierarchicky uspořádány veškeré informace, které obsahuje. Všichni víte, že doménová jména se zapisují v podobě m1.jr.lixis.cz – jednotlivé domény jsou v zápisu oddělovány tečkami a uvádějí se v pořadí od konkrétních k těm nejobecnějším. Jméno však zároveň funguje – směrem zezadu dopředu – jako popis průchodu doménovým stromem.

V tomto konkrétním případě říká, že z kořene doménového stromu je třeba jít do domény cz (označující Českou republiku), z ní pokračovat do její poddomény lixis (LIXIS s.r.o v Jaroměři), dále pokračovat do poddomény jr (moje pracoviště doma) a v ní navštívit poddoménu m1. Doménové jméno tedy jednoznačně identifikuje konkrétní uzel v doménovém stromě a zároveň popisuje cestu od kořene k němu. Zejména tato druhá vlastnost je klíčová, protože je využívána při hledání odpovědi.

Zastavme se ještě chvíli u vlastního doménového stromu. Jako každý správný strom obsahuje jediný kořen – takzvanou kořenovou doménu (root domain). Jelikož je jediná, nemá smysl ji ve jméně uvádět, a proto ji v zápisu nenajdete. V případě nutnosti se zapisuje jako samotná tečka . (tímto způsobem je také znázorněna na našich obrázcích).

Některé nástroje či konfigurační soubory rozlišují mezi absolutně a relativně zadaným doménovým jménem. Absolutně zadané jméno končí tečkou – například www.nic.cz. – a znamená to, že je úplné, protože obsahuje všechny údaje až po kořenovou doménu. Používá se pro ně také pojem plné či plně specifikované doménové jméno, v originále Fully Qualified Domain Name (FQDN).

Pokud na konci není tečka, chápe se jako jméno relativní a příslušný program si k němu doplní, či alespoň může doplnit, nějakou koncovku. Zkuste si třeba do WWW prohlížeče zadat jako cílovou adresu jen samotné www a uvidíte, že si k němu iniciativně něco doplní a přistanete na konkrétním webu. Relativní jména jsou běžná v datových souborech DNS, kde se vždy vztahují k aktuální doméně. Jinak bychom se upsali. Problematika je složitější, protože nelze chtít po uživatelích, aby jména důsledně ukončovali tečkou. Operační systémy a aplikace proto odhadují, zda jméno bez tečky na konci skutečně je či není relativní.

Hlavní úlohou kořenové domény je držet celý strom pohromadě a poskytnout výchozí bod pro řešení dotazů. Bezprostředně pod ní se nacházejí takzvané domény nejvyšší úrovně (top-level domains, TLD). Původně vznikly s cílem stručně charakterizovat držitele domény a zároveň snížit pravděpodobnost konfliktů.

Kategorie TLD

TLD znamená Top Level Domain (domény nejvyšší úrovně).

Když DNS přišlo na svět, mělo na nejvyšší úrovni pět domén: com pro komerční firmy, edu pro vzdělávací instituce, gov pro vládu, mil pro vojáky a org pro organizace nezařaditelné do žádné z ostatních kategorií. Záhy k nim přibyly domény jednotlivých států a postupem času i další. Podle určení a klíčových vlastností je lze rozdělit do čtyř základních kategorií:

Obecné domény (generic top-level domains, gTLD) navazují na původní členění. Dělí se do dvou odrůd: Nesponzorované obecné domény, jako například com, net, org nebo info, patří do přímé kompetence ICANN. Sponzorované obecné domény (sTLD) jsou založeny a spravovány určitou organizací, která určuje podmínky pro registraci v nich. Bývají vymezeny geograficky nebo tematicky, například v sTLD aero mohou získat poddoménu jen subjekty působící v oblasti letectví. Jako další příklady sponzorovaných obecných domén lze jmenovat asia, jobs, museum či xxx.

Státní domény (country-code top-level domains, ccTLD) jsou domény přidělené jednotlivým státům. Jejich zkratky odpovídají (až na několik výjimek) dvoupísmenným zkratkám příslušných států podle standardu ISO 3166–1. Jistě nejvýznamnější výjimkou je doména eu pro Evropskou unii. Za zmínku stojí též britská doména uk, přestože Velká Británie má ve zmiňovaném standardu přidělenu zkratku gb. Důvody výjimek jsou zpravidla historické.

Státní domény v národních abecedách (internationalized ccTLD, IDN ccTLD) odpovídají, podobně jako předchozí kategorie, jednotlivým státům. Jejich názvy jsou ovšem zapsány v národních abecedách, které nevycházejí z latinky (čínská, arabská a další písma).

Infrastrukturní doména (infrastructure top-level domain) je pouze jediná. Jedná se o doménu arpa, která slouží pro některé interní mechanismy DNS, zejména pro reverzní převody IP adres na jména a pro ENUM. Má poměrně zajímavou historii – původně byla určena pro agenturu ARPA (Advanced Research Projects Agency), jež stála u kolébky Internetu. Později doména změnila svůj význam a odpovídajícím způsobem byl upraven i význam zkratky, v současnosti znamená Address and Routing Parameter Area.

Po bouřlivém začátku, kdy kolem poloviny 80. let vznikla valná většina domén nejvyšší úrovně, nastalo dvacetileté období klidu. Kořenová doména byla tou dobou velmi konzervativní, obsahovala kolem 300 poddomén a narůstala průměrným tempem jedné až dvou nových TLD ročně. Roku 2005 pak byl zahájen proces vedoucí ke vzniku celé řady nových obecných domén.

Kromě výše uvedených čtyř existuje ještě jedna skupina doménových jmen nejvyšší úrovně. Mezi předchozí ovšem nepatří, protože tyto domény neexistují a ani existovat nemohou. RFC 2606 rezervovalo několik jmen nejvyšší úrovně pro speciální účely:

  • test pro testování DNS programů,

  • example pro příklady v dokumentaci,

  • invalid pro vytváření neplatných jmen a

  • localhost pro odkaz sama na sebe.

Kromě nich byly vyhrazeny ještě tři domény druhé úrovně (example.com, example.net a example.org), opět pro potřeby příkladů v dokumentaci. Tyto domény nejsou součástí doménového stromu a mohou být volně využívány k daným účelům.

Jelikož se později objevilo ještě několik jmen rezervovaných pro speciální účely, RFC 6761 Special-Use Domain Names je shrnulo a zavedlo pro ně registr, který obhospodařuje IANA. Aktuální přehled doménových jmen se speciálním významem najdete na webu organizace IANA.

Domény druhé úrovně

Poddoménami TLD jsou tak zvané domény druhé úrovně. K jejich přidělování existují dva základní přístupy: Většinou jsou přidělovány již konkrétním organizacím či jednotlivcům. Tímto způsobem je spravována například naše doména cz, proto třeba Technická univerzita v Liberci disponuje doménou tul.cz, Seznam doménou seznam.cz a podobně.

V některých doménách se snaží na druhé úrovni rozlišit charakter vlastníka, podobně jako původní nejvyšší domény com, edu a spol. Domény organizací a dalších vlastníků se pak nacházejí až na třetí úrovni. Nejznámějšími příklady tohoto uspořádání jsou Rakousko (at), Velká Británie (uk) či Austrálie (au), ale je jich mnohem víc. Seznam dostupných koncovek doménových jmen obsahuje Public Suffix List, který najdete na publicsuffix.org/list/. Například vídeňská univerzita je držitelem domény univie.ac.at, kde ac na druhé úrovni signalizuje akademickou instituci. Tento způsob organizace domén je výrazně menšinový a spíše se od něj ustupuje – třeba v Rakousku je dnes již možná také registrace domén druhé úrovně.

Hloubka doménového stromu je omezena na 127 úrovní. Tento limit je však ryze teoretický, v praxi se jen zřídka setkáte s hloubkou větší než pět. Výjimkou jsou různé speciální mechanismy – ENUM pro telefonní čísla a zejména reverzní dotazy pro IPv6, které zasahují až do 35. úrovně. To je hodně extrémní případ, přesto se dostal jen do čtvrtiny maximální přípustné hloubky.

Alternativní stromy

Když už jsme u extrémů, zmiňme se o existenci alternativních DNS stromů. My se věnujeme „originálnímu a jedině pravému DNS“. Kromě něj ovšem existují i jeho vedlejší odnože, které používají stejné protokoly, technologie i programy, jen jejich doménový strom je odlišný. Má svůj vlastní kořen, ze kterého obvykle vedou odkazy na všechny TLD oficiálního DNS, ovšem kromě nich ještě některé navíc.

Důvody pro jejich existenci mohou být ideové (nesouhlas s některými pravidly a omezeními, jimž podléhá standardní kořenová doména), komerční, nebo se může jednat o čistě interní záležitost určité organizace.

Jejich společnou vlastností je, že vyžadují speciální konfiguraci na straně strojů, které DNS prohledávají, a jejich dosah bývá velmi omezený. Drtivá většina Internetu o nich nemá tušení. Hlavním problémem jejich existence je samozřejmě nekonzistence informací. Kromě toho vznikají nepříjemné konflikty, pokud některý z alternativních kořenů vytvoří svou specifickou TLD a později je stejnojmenná doména založena v oficiálním DNS, což se přihodilo například doméně biz.

Internetová komunita nepohlíží na alternativní doménové stromy s žádným nadšením, což se odráží i v RFC 2826 IAB Technical Comment on the Unique DNS Root. Jeho obsah by se dal stručně shrnout heslem „jeden Internet – jedno DNS“. I nám se existence alternativních doménových stromů jeví jako krajně problematická a nebudeme se jim více věnovat.

Role různých typů serverů při řešení dotazů

Není server jako server a v DNS to platí dvojnásob. V hierarchii domén existuje několik různých typů serverů, jejichž role se významně liší. Vysvětlíme si, za co který zodpovídá a jak pracuje.

Role serverů

Klíčovou úlohu v celém systému hrají servery. Obsahují jednotlivé části oné obrovské distribuované databáze, zasílají si dotazy a odpovědi a spolupracují při distribuci informací. Díky jejich vzájemné provázanosti a spolupráci celý systém vůbec může fungovat. DNS servery mají ke konkrétním doménám různý vztah, ze kterého pak vyplývá jejich úloha při řešení dotazů. Pro určitou konkrétní doménu může mít server jednu z následujících rolí:

  • Autoritativní server obsahuje data dané domény a zodpovídá dotazy na ně. Obsah autoritativních serverů tvoří onu distribuovanou databázi, kterou DNS představuje. O odpovědích autoritativního serveru ohledně dané domény se nepochybuje, jsou považovány za správné, protože pocházejí přímo od zdroje. Na základě vzájemných vztahů lze rozlišit dvě varianty autoritativních serverů: primární a sekundární.

  • Primární server (master) je místo, kde vznikají informace o doméně. Pokud je třeba udělat v jejích datech změny, musí být provedeny na primárním serveru. Z podstaty věci je jasné, že každá doména má obvykle právě jeden primární server.

  • Sekundární server (slave) je automatickou kopií primárního. V pravidelných intervalech se na něj obrací s dotazem, zda v doméně nedošlo ke změně, a pokud ano, stáhne si aktuální verzi dat. Současné implementace zpravidla umožňují, aby primární server aktivně upozornil sekundární, že se cosi změnilo a je čas přihlásit se o aktuální data. Díky tomu je synchronizace údajů podstatně rychlejší.
    Úloha sekundárního serveru je jasná – dokáže zastoupit primární v případě výpadku a slouží i pro rozkládání zátěže. Je také autoritativní, jeho odpovědi mají v DNS stejnou váhu jako odpovědi primárního serveru. Každá doména musí mít dva autoritativní servery, typicky jeden primární a jeden sekundární, který by měl být z hlediska síťové topologie co nejnezávislejší na primárním.

  • Rekurzivní server má dvojí tvář. Vůči svým klientům, což bývají typicky stroje z místní sítě, vystupuje jako server. Přijímá jejich dotazy, řeší je a posílá odpovědi. Během řešení se dotazuje autoritativních serverů, vůči kterým vystupuje jako klient. Informace, které při řešení získá, si ukládá do vyrovnávací paměti a dokud nevyprší jejich životnost, využívá je pro své další odpovědi.

Hlavním smyslem rekurzivních serverů je poskytnout společnou vyrovnávací paměť pro místní klienty. Aby se například adresy často používaných webů nehledaly znovu a znovu. Zopakuje-li se dotaz na jméno, které má rekurzivní server v paměti, rovnou pošle odpověď. Zvyšuje tak efektivitu celého systému, zmenšuje počet dotazů a odpovědí přenášených po síti a zrychluje odezvy. Jeho odpovědi samozřejmě nejsou autoritativní. Proto se pro něj používá také pojem pomocný server (caching only).

Ještě jednou zdůrazněme, že výše zmiňované role serverů se vždy vztahují ke konkrétní doméně. Jeden a tentýž server může být primární pro tři domény, sekundární pro dalších pět a pomocný pro všechny ostatní. Rozhoduje o tom pouze a jedině jeho konfigurace.

Primární a sekundární

Z pohledu DNS komunikace není žádný rozdíl mezi primárním a sekundárním serverem. Dokonce ani není viditelný. Pro doménu se ukládají (v záznamech typu NS) všechny autoritativní servery, primární a sekundární se nijak nerozlišují. Odpověď v sobě nese příznak (označovaný AA – Authoritative Answer), zda je autoritativní nebo nikoli. Jeho hodnota závisí na tom, zda odpověď odeslal přímo některý z autoritativních serverů, nebo zda ji odeslal server pomocný ze své vyrovnávací paměti.

Rozdělení na primární a sekundární servery je čistě organizační záležitost, která se promítá do jejich konfigurace. Týká se toho, jak data vznikají, nikoli jejich věrohodnosti. Z pohledu DNS jsou odpovědi všech autoritativních serverů pro doménu stejně důvěryhodné. Některé domény koncept primárních a sekundárních serverů vůbec nepoužívají. Data mají například uložena v databázi, ze které si je berou jejich autoritativní servery. Synchronizaci jejich obsahu zajišťují databázové prostředky.

Mimochodem, jedny z nejošklivějších chyb vznikají, pokud se rozejde obsah primárního serveru se sekundárními. K této situaci může dojít, pokud správce domény upravuje její obsah ručně a zapomene zvětšit sériové číslo, které slouží jako indikátor změny. Sekundární servery si pak nechají původní obsah domény a jejich odpovědi se budou lišit od primárního. Jednotliví klienti se budou obracet na různé autoritativní servery (v závislosti na softwarové implementaci klienta a dobách odezvy jednotlivých serverů) a budou dostávat nekonzistentní odpovědi. Rozložení příjemců špatných odpovědí bude v podstatě náhodné, což řešení problému rozhodně neulehčí.

Případné problematické stavy ještě zhoršují pomocné servery. Na jedné straně výrazně zkracují doby odezvy DNS a snižují zátěž autoritativních serverů, na straně druhé však do něj zavádějí určitou setrvačnost. Dojde-li ke změně, vyrovnávací paměti pomocných serverů nadále obsahují původní údaje a dokud nevyprší jejich platnost, budou je poskytovat svým tazatelům. Tyto servery jsou rozesety po celém světě, jsou zcela mimo působnost správce domény a dotyčné záznamy si uložily v různém čase. Postupně budou nahrazovány aktuální verzí, ale tento proces může trvat několik dnů. Správce domény jej může ovlivňovat jen nepřímo – vhodným nastavením životnosti záznamů.

Autoritativní servery

DNS neposkytuje za každých okolností stoprocentně konzistentní a aktuální informace. Je to cena, kterou platíme za jeho škálovatelnost a efektivitu. Obecně platí, že čím významnější je doména, tím větší péče bývá věnována jejím autoritativním serverům. Má jich zpravidla větší počet a jsou vhodně rozmístěny v různých částech Internetu.

Počet autoritativních serverů poslouží jako orientační měřítko významu domény. Posuďte sami: doména tul.cz má dva, nic.cz tři, doména cz čtyři, com hned třináct a stejný počet má i kořenová doména. Ve skutečnosti je jich podstatně více, protože za jedním jménem v záznamu typu NS se může skrývat mnoho fyzických serverů.

Vyšší počet autoritativních serverů má dva významy: větší robustnost, protože lépe dokáže překonat i větší výpadky sítě, a také rozkládání zátěže. Na autoritativní servery velkých domén se valí obrovské množství dotazů, jejich obsluhování více stroji rozloženými v různých částech sítě je holou nezbytností.

Zcela zásadní roli mají autoritativní servery kořenové domény, tak zvané kořenové servery (root servers). U nich začíná řešení všech dotazů, které pak postupuje doménovým stromem po jednotlivých patrech od kořene až k cíli. Případná nedostupnost všech kořenových serverů by učinila DNS nefunkčním. Proto se za jejich třinácti adresami ve skutečnosti skrývají stovky serverů – konkrétně v polovině roku 2023 jich bylo zhruba 1500. Používají se tak zvané výběrové adresy (anycast), kdy se stejná adresa přidělí několika strojům a směrování se postará o doručení paketu nejbližšímu z jejích majitelů.

Podrobnosti o kořenových serverech včetně mapky jejich rozložení najdete na adrese https://www.root-servers.org. Budiž autorům a správcům DNS připsáno ke cti, že za celou jeho historii nedošlo k vyřazení všech kořenových serverů, přestože se vyskytlo několik cílených útoků na ně. Zmíněných třináct adres kořenových serverů je velmi konzervativních, protože je musí znát miliony dalších serverů v celém Internetu. Mění se proto zhruba rychlostí pohybu kontinentů. Jejich nejvýznamnější změnou v posledních letech byla postupná implementace IPv6 a s ní přidávané IPv6 adresy.

Resolver čili řešič

Máme tedy data, máme i servery a zbývá nám už jen klient, který se bude systému ptát. V oficiální terminologii se pro něj používá termín resolver (čili řešič). Jeho hlavní úlohou je zprostředkovávat místním aplikacím styk s DNS – na základě jejich požadavků sestavuje DNS dotazy, zasílá je serverům a zpracovává příchozí odpovědi. Obvykle také mívá vlastní vyrovnávací paměť, aby zbytečně neobtěžoval stále stejnými dotazy.

Resolver bývá součástí operačního systému. Z programátorského hlediska má zpravidla podobu knihovny funkcí, které tvoří jeho rozhraní (API) vůči aplikacím. Touto cestou mu jednotlivé programy zadávají úkoly a přebírají si výsledky. Uživatel se na něj přímo obrátit nemůže, proto bývají součástí systému jednoduché aplikace, jejichž prostřednictvím lze komunikovat s resolverem poměrně přímo a zjišťovat tak aktuální informace v DNS.

Podle schopností existují dva základní druhy resolverů:

Plnohodnotný (též rekurzivní) resolver je schopen samostatné existence. Zná adresy kořenových serverů a pokud nemá ve vyrovnávací paměti nic, co by pomohlo s vyřešením aktuálního dotazu, obrátí se na některý z nich. Podrobněji celý proces popíšeme vzápětí. Tento typ resolverů bývá základem výše zmíněných rekurzivních DNS serverů.

Jednoduchý resolver (v originále pahýlový, stub resolver) představuje minimalistický přístup. Potřebuje ke své činnosti adresu místního serveru (případně několika serverů), na který se má obracet se svými dotazy. Dostane-li od aplikace požadavek, převede jej do podoby DNS dotazu a pošle danému serveru. Ten dotaz vyřeší a pošle zpět výslednou odpověď. Jednoduchý resolver nezná adresy kořenových serverů a není schopen samostatné existence. Sám dotazy neřeší, jen je předává místnímu serveru. Součástí běžných operačních systémů bývají právě takové resolvery.

Konfigurační soubor jednoduchého resolveru na Linuxu: /etc/resolv.conf
# This file is managed by man:systemd-resolved(8). Do not edit.
#
# This is a dynamic resolv.conf file for connecting local clients to the
# internal DNS stub resolver of systemd-resolved. This file lists all
# configured search domains.
#
# Run "resolvectl status" to see details about the uplink DNS servers
# currently in use.
#
# Third party programs must not access this file directly, but only through the
# symlink at /etc/resolv.conf. To manage man:resolv.conf(5) in a different way,
# replace this symlink by a static file or a different symlink.
#
# See man:systemd-resolved.service(8) for details about the supported modes of
# operation for /etc/resolv.conf.

nameserver 127.0.0.53     (1)
options edns0 trust-ad
search chorche.net
1 Odkaz na plnohodnotný resolver, který je shodou okolností na stejném počítači.

Jednoduchý resolver se snadněji implementuje. Sortiment jeho funkcí je omezený, a kód programu tudíž jednodušší. Vyžaduje však konfiguraci – potřebuje se dozvědět adresu lokálního serveru, který bude řešit jeho dotazy. Její nastavení musí zajistit místní správce, a to buď přímo odpovídajícím konfiguračním zásahem na koncovém stroji, nebo (častěji) prostřednictvím konfiguračního protokolu DHCP.

Nabízí se otázka, proč operační systémy neobsahují plnohodnotné resolvery. Jejich kód i nároky by sice byly o něco větší, rozdíl by však nebyl nijak zásadní a pro současný hardware v podstatě zanedbatelný. Zato bychom získali jednoduchost použití – plnohodnotný resolver je soběstačný a téměř bezúdržbový. Potřebuje jen adresy kořenových serverů, které se prakticky nemění, a případnou změnu by šlo řešit obvyklou cestou systémových aktualizací.

Tím bychom se ale připravili o hlavní výhodu, společnou vyrovnávací paměť. Jednoduché resolvery strojů v lokální síti posílají své dotazy místnímu rekurzivnímu serveru, který je řeší a výsledky si ukládá do vyrovnávací paměti. Jelikož se všechny lokální stroje obracejí na stejný server, mohou využívat záznamy, které zjistil při řešení dřívějších dotazů jejich sousedů. To podstatným způsobem zvyšuje efektivitu vyrovnávací paměti a snižuje objem síťového provozu odcházejícího mimo lokální síť.

Kromě toho může rekurzivní server něco přidat k datům z veřejného DNS stromu. Jestliže se například v místní síti používají neveřejné adresy, neměly by se objevit ve veřejném DNS. Ovšem interně pro ně chcete používat jména. Často se tato situace řeší tak, že se rekurzivní server nastaví jako autoritativní pro speciální doménu, která obsahuje záznamy s neveřejnými adresami. Tato doména není v doménovém stromě, takže nedostává dotazy zvenčí. Ovšem místní stroje mu posílají všechny své dotazy, takže jim může zasílat odpovědi z této nestandardní domény.

Život jednoho dotazu

Máme už pohromadě základní stavební kameny DNS – doménový strom, servery a klienty. Podívám se, jak jednotlivá kolečka zapadají do sebe. Projdeme si kroky, které proběhnou mezi položením dotazu a příchodem odpovědi.

Řekněme, že sháníte informace o Technické univerzitě v Liberci. Do webového prohlížeče proto zadáte www.tul.cz a DNS klient ve vašem počítači dostane za úkol najít k tomuto jménu odpovídající IP adresu. Ve své konfiguraci má zapsáno, kde začít – IP adresu lokálního DNS serveru obsluhujícího místní síť.

Vznik dotazu

Celá DNS transakce začne tím, že klient na základě požadavku vašeho prohlížeče vytvoří DNS dotaz požadující záznam typu A pro jméno www.tul.cz a zašle jej lokálnímu serveru. Zatím necháme stranou vyrovnávací paměti a popíšeme postup řešení dotazu bez nich. Je znázorněn na obrázku, jednotlivé kroky jsou opatřeny pořadovými čísly – toto byl krok 1.

Hledání adresy pro www.tul.cz

dns dotaz

Oslovený server se chopí řešení dotazu. Odpověď samozřejmě nezná, ale zaúkoluje svůj plnohodnotný resolver, jenž má k dispozici adresy kořenových serverů, u nichž začíná řešení všech dotazů. Lokální server některý z nich vybere, řekněme k.root-servers.net, a pošle mu stejný dotaz: hledám záznam typu A pro www.tul.cz (krok 2).

Hierarchické uspořádání domén svádí k myšlence, že dotaz bude postupně „probublávat“ hierarchií vzhůru. Tak to ale není, cestu nahoru absolvuje jedním skokem. Je to rychlejší a snadněji udržitelné – stačí, aby každý místní server znal třináct adres kořenových serverů, které jsou pro všechny společné a stabilní. Mívá je ve své konfiguraci a při startu si zjišťuje jejich aktuální složení pomocí tak zvaných přípravných dotazů (priming queries, podrobněji se problematice věnuje RFC 8109 Initializing a DNS Resolver with Priming Queries).

Průchod stromem

Hierarchické uspořádání se začne uplatňovat až při sestupu doménovým stromem dolů. Oslovený kořenový server zná situaci v kořenové doméně. Ví, že doména nejvyšší úrovně cz skutečně existuje a kdo jsou její autoritativní servery. Na rozdíl od lokálního serveru však nemá čas dotaz řešit – dostává jich příliš mnoho. Proto rovnou pošle tazateli odpověď, která však místo požadovaného záznamu A pro www.tul.cz napovídá, kde se ptát dál (krok 3). V tomto konkrétním případě bude obsahovat informace o autoritativních serverech pro doménu cz:

cz.               NS    d.ns.nic.cz.
cz.               NS    a.ns.nic.cz.
cz.               NS    b.ns.nic.cz.
cz.               NS    c.ns.nic.cz.

d.ns.nic.cz.      AAAA  2001:678:1::1
c.ns.nic.cz.      AAAA  2001:678:11::1
b.ns.nic.cz.      AAAA  2001:678:10::1
a.ns.nic.cz.      AAAA  2001:678:f::1
d.ns.nic.cz.      A     193.29.206.1
c.ns.nic.cz.      A     194.0.14.1
b.ns.nic.cz.      A     194.0.13.1
a.ns.nic.cz.      A     194.0.12.1

Lokální server nyní může sestoupit o jedno patro hierarchie níže. Dozvěděl se jména a adresy autoritativních serverů pro doménu cz, takže stejný dotaz (hledám záznam typu A pro www.tul.cz) položí jednomu z nich, například a.ns.nic.cz (krok 4). Opakuje se podobná situace jako v kořeni, jen jsme o něco blíže řešení. Oslovený server opět nezná odpověď a nemá kapacitu dotaz řešit, ale zná doménu cz. Proto ví, že tul.cz skutečně existuje a jaké jsou její autoritativní servery. Tuto informaci pošle tazateli jako odpověď (krok 5):

tul.cz.            NS    tul.cesnet.cz.
tul.cz.            NS    bubo.tul.cz.

bubo.tul.cz.       A     147.230.16.1
bubo.tul.cz.       AAAA  2001:718:1c01:16::aa

Lokální server se zase o krok přiblížil vyřešení dotazu. Vybere si jeden z autoritativních serverů pro doménu tul.cz, třeba bubo.tul.cz, a zopakuje mu svůj dotaz (krok 6). Jelikož je poptávané jméno jen o jedno patro níže, je jisté, že tentokrát již dostane definitivní odpověď (krok 7). V daném případě:

www.tul.cz.        CNAME   novy.tul.cz.
novy.tul.cz.       A       147.230.18.195

Říká se v ní, že jméno www.tul.cz je ve skutečnosti přezdívkou pro novy.tul.cz, jehož adresa je v odpovědi také obsažena. Předá ji klientovi (krok 8). Zdůrazněme, že postup řešení bude víceméně stejný odkudkoli z celého Internetu. Lišit se bude jen výběr oslovených serverů, vždy však lokální server nejprve osloví jeden z kořenových serverů, pak některý z autoritativních serverů pro doménu cz a do třetice vybere jeden z autoritativních serverů domény tul.cz. Obecně platí, že dotaz se vždy vyhoupne do kořene doménového stromu a pak postupně sestupuje po jednotlivých patrech blíže a blíže danému cíli.

Kořenová zóna

Možná vám trochu vrtá hlavou, jak může kořenový server poslat záznam typu A třeba pro a.ns.nic.cz. Kořenová doména obsahuje pro cz záznamy typu NS, v nichž jsou uvedena doménová jména jejích autoritativních serverů. Vyvstává klasický problém slepice versus vejce: abychom se mohli zeptat autoritativního serveru a.ns.nic.cz na informace ohledně domény cz, potřebujeme jeho adresu. Ta je ovšem uložena kdesi v doméně cz.

Tento problém řeší tak zvané slepující záznamy (glue records). Jedná se o adresní záznamy (typy A a AAAA) umístěné ve vyšších patrech doménové hierarchie, než by jim náleželo. Jestliže jméno autoritativního serveru pro určitou poddoménu samo leží v této poddoméně, je standardním postupem nezjistitelné. Proto se do nadřízené domény společně se záznamem typu NS uvádějícím jméno serveru umístí i záznamy obsahující IP adresy tohoto serveru.

Kořenová doména tedy obsahuje slepující záznamy typu A a AAAA pro a.ns.nic.cz a doména cz podobně obsahuje slepující záznam A pro bubo.tul.cz. Pokud server odesílá příslušný záznam NS, automaticky do své zprávy přibalí i odpovídající slepující záznamy, pokud je má k dispozici.

Vyrovnávací paměť (cache)

V příkladu jsme zatím zcela ignorovali existenci vyrovnávacích pamětí (cache). Nastal čas věnovat jim trochu pozornosti. Lokální server si samozřejmě uloží získanou odpověď pro www.tul.cz a pokud se v době jeho životnosti bude po této informaci shánět některý z místních klientů, odpoví mu rovnou. Celá DNS komunikace pak bude mít jen dva kroky: klient se zeptá místního serveru a ten mu rovnou pošle odpověď s příznakem, že není autoritativní.

Server si však neukládá jen výsledné řešení, ale veškeré informace, které během jeho hledání získal. V tomto případě autoritativní servery pro domény cz a tul.cz. Když po chvíli brouzdání po stránkách pošlete elektronickou poštou na adresu info@tul.cz nějaký dotaz, bude váš poštovní server poptávat záznamy typu MX pro doménu tul.cz. Situaci ilustruje další obrázek.

Hledání poštovních serverů pro tul.cz s využitím cache

dns dotaz 2

Jeho resolver se obrátí na lokální DNS server, který má ve vyrovnávací paměti platné údaje o autoritativních serverech pro tuto doménu. Díky tomu se zeptá rovnou některého z nich a obratem se dozví:

tul.cz.       MX     0   bubo.tul.cz.
tul.cz.       MX     50  tul.cesnet.cz.

bubo.tul.cz.  A      147.230.16.1
bubo.tul.cz.  AAAA   2001:718:1c01:16::aa

Dorazí-li zanedlouho lokálnímu DNS serveru dotaz na www.liberec.cz (chystáte se studovat v Liberci a zajímá vás, co je ve městě k vidění) využije uložené informace o autoritativních serverech pro doménu cz a zeptá se některého z nich, aniž by začínal u kořenového serveru. Jak by to zhruba vypadalo, vidíte na dalším obrázku.

Hledání adresy www.liberec.cz s využitím cache

dns dotaz 3

Při řešení dotazů a uplatňování vyrovnávacích pamětí hraje klíčovou roli skutečnost, že doménové jméno je zároveň jednoznačným popisem cesty doménovým stromem, jež vede k získání požadované informace. Díky tomu každý z oslovených serverů okamžitě ví, kudy se má pokračovat k vyřešení. Zároveň si dokáže najít ve vyrovnávací paměti nejkonkrétnější relevantní informaci a tu využít k omezení síťové komunikace a zrychlení odezvy.

Rekurzivní a nerekurzivní chování

V příkladu z předchozí části jsme popsali dva výrazně odlišné způsoby chování DNS serverů. Zatímco lokální server se dotazu chopil, vyřešil jej a poslal výslednou odpověď, kořenový server se dotazem nezabýval a jako odpověď poskytl obratem informace o serverech, které mají blíže k řešení. Pro tyto dva druhy chování existují i oficiální názvy.

Rekurzivní řešení dotazu je takové, kdy se server dotazu ujme, vyřídí veškerou potřebnou korespondenci až po získání odpovědi, kterou pak odešle tazateli. Rekurzivní chování server samozřejmě zatěžuje. Musí si uchovávat datové struktury pro rozpracované dotazy, přeposílat dotazy a podle reakcí na ně se rozhodovat, jak pokračovat dál. Hlavní a základní výhodou rekurzivního řešení dotazů je, že si server plní vyrovnávací paměť. Procházejí jím dílčí i finální odpovědi, které si ukládá a může je využít při řešení dalších dotazů. Toto chování je typické pro lokální servery, které fungují jako rekurzivní resolvery obsluhující jednoduché resolvery místních strojů.

Nerekurzivní řešení dotazu znamená, že server jednoduše odkáže tazatele jinam. Obdrží dotaz, nahlédne do svých dat, odešle jako odpověď informace o autoritativních serverech bližších k řešení (nebo chybový kód, pokud jste se zeptali na doménu, k níž nemá co říci) a pustí dotaz z hlavy. Nemusí si nic uchovávat, zátěž serveru je minimální, což je přesně ten důvod, proč se nerekurzivně chovají autoritativní servery v horních patrech doménové hierarchie – tedy kořenové a servery domén nejvyšší úrovně.

Obecné doporučení zní, že v každé síti připojené k Internetu by měl být místní rekurzivní server, na nějž se obracejí zdejší klienti. Jeho hlavní úlohou je poskytnout společnou vyrovnávací paměť a omezit tak objem DNS komunikace směřující do Internetu. Pokud hledáte hojně používaný server, třeba www.seznam.cz, skoro jistě budete obslouženi z vyrovnávací paměti, protože adresu před vámi požadoval někdo jiný. Čím více klientů se schází na jednom lokálním serveru, tím vyšší je pravděpodobnost opakování dotazů a efektivita využití uložených informací.

Proto není dobrý nápad stavět rekurzivní servery na každém rohu. Ideální počet je jeden pro celou místní síť. Tím ovšem vzniká slabé místo, protože při jeho výpadku přestane místním strojům fungovat DNS. Pokud je síť větší, je rozumné postavit do ní dva rekurzivní DNS servery – jeden hlavní a jeden záložní pro případ výpadku prvního. Více rozhodně ne.

Na druhé straně je však třeba upozornit, že rekurzivnímu serveru se dají podstrčit falešné informace a on následně bude své klienty mystifikovat. Je proto velmi důležité, aby byl správně konfigurován a chránil se před podobnými pokusy. Naprostou samozřejmostí by mělo být, že rekurzivní služby poskytuje jen strojům z místní sítě, nikoli veřejně do Internetu.

Pokud má koncová síť přidělenu vlastní doménu, otevírá se zajímavá otázka vztahu autoritativních serverů této domény a pomocných (rekurzivních) serverů koncové sítě. Lze k ní přistoupit dvěma způsoby: puristicky nebo úsporně. Vhodnější puristická varianta používá zcela oddělené servery, zatímco úsporná sází na jeden společný server pro obě role.

Domény, zóny a zónové soubory

V článcích o DNS jsme opakovaně zdůraznili distribuovaný charakter DNS databáze. Různé části globálního doménového stromu jsou spravovány různými subjekty a vydávány různými servery. Kde jsou přesně hranice?

Souvislá část doménového stromu, jejíž správa byla delegována jednomu subjektu, je označována jako zóna (zone). Jednou zónou je například kořenová doména, jejíž správu vykonává ICANN. Pod ní se nachází například zóna odpovídající doméně cz spravovaná sdružením CZ.NIC.

Hranice zón

Hranice mezi zónami prochází vždy hranou doménového stromu, jež spojuje nadřazenou doménu spadající do jedné zóny s podřazenou, která je již v jiné zóně. Pro tyto hranice se používá pojem zónový řez (zone cut) a označují vlastně hranice zodpovědnosti jednotlivých subjektů. Zónový řez znamená „od tohoto místa spravuje připojený podstrom někdo jiný“. Dotyčný správce může skutečně spravovat celý podstrom, nebo jeho části odřízne a svěří do správy dalším subjektům. To už je čistě otázkou jeho rozhodnutí.

Rozdělení domén do zón

rozdeleni domen do zon

Podívejme se na příklad části doménového stromu na obrázku, který popsaný princip ilustruje. Správce kořenové zóny odřízl její poddoménu cz a svěřil ji CZ.NIC. Ten pochopitelně neobhospodařuje celý příslušný podstrom, ale opět svěřuje jednotlivé domény druhé úrovně subjektům, které o ně projeví zájem.

Takže například doménu tul.cz získala do správy Technická univerzita v Liberci a vznikla tak další zóna. Celou doménu zde obhospodařuje centrální správa sítě, proto pod tul.cz nenajdete žádné další řezy a zóna zahrnuje celý podstrom. Jiný přístup zvolila podstatně větší Univerzita Karlova, která delegovala fakultní domény do správy příslušných fakult. Pod zónou cuni.cz spravovanou centrálním Ústavem výpočetní techniky UK tak vznikly zóny mff.cuni.cz, lf1.cuni.cz, ff.cuni.cz a další, jejichž správu si zajišťují přímo odpovídající fakulty.

Zónový soubor

Existence zón se promítá i do obsahu DNS. V doméně bezprostředně nad zónovým řezem musí být informace o tom, že podřízená doména existuje, avšak má už jiné autoritativní servery. To zajišťují záznamy typu NS. Například doména cz proto obsahuje dvojici záznamů NS pro doménu tul.cz se jmény jejích autoritativních serverů bubo.tul.cz a tul.cesnet.cz. Jména obou serverů leží v zónách podřízených zóně cz, proto musí obsahovat také slepující (glue) záznamy s jejich adresami. Právě tyto záznamy pošle autoritativní server domény cz tazateli, který se bude zajímat o nějaké informace z domény tul.cz.

Každá zóna ve svém kořeni obsahuje záznam typu SOA (Start of Authority), ze kterého zjistíte jméno jejího primárního serveru, e-mail správce a časové konstanty, které ovlivňují zacházení s jejími daty.

Data zóny bývají na serveru uložena v podobě tak zvaného zónového souboru, jehož podobu definuje RFC 1035 pod názvem master file. Je to poněkud nezvyklé, protože formát lokálních dat by měl být spíše věcí implementace a některé se skutečně od standardní podoby odchylují. Nicméně většina serverů tuto syntaxi dodržuje a používá se také ve všech dokumentech o DNS.

Jedná se o textový soubor, v němž je každý záznam zapsán na jeden řádek. Pokud jsou data dlouhá (například v záznamu typu SOA), lze je pro lepší čitelnost uzavřít do závorek a rozdělit do několika řádků. Uvnitř závorek má konec řádku stejný význam jako mezera. Záznam má pět položek vzájemně oddělených libovolnou kombinací mezer a/nebo tabulátorů:

doménovéJméno   životnost   třída   typ     data

Doménové jméno určuje jméno, k němuž se záznam vztahuje. Bývá také označováno jako vlastník záznamu. Pokud je zakončeno tečkou, chápe se jako absolutní a úplné. V opačném případě se za ně doplní aktuální doména. Takže například jméno www v zónovém souboru pro nic.cz znamená www.nic.cz.

Jméno může na začátku záznamu zcela chybět, v takovém případě se zdědí z předchozího. Jestliže jako jméno použijete samotný znak @, označuje aktuální doménu. Tedy doménu, v jejímž zónovém souboru se vyskytuje nebo která byla určena direktivou $ORIGIN, jíž se zanedlouho budeme věnovat.

Životnost určuje počet sekund životnosti záznamu ve vyrovnávací paměti a třída jeho třídu. Jejich pořadí může být prohozeno. Údaje také mohou chybět a server za ně dosadí implicitní hodnoty. Poslední dvě položky jsou jako jediné povinné. Určují typ záznamu a v závislosti na něm pak data, která obsahuje.

Existují i servery, jež si lokálně data ukládají do databází, tedy principiálně odlišně od oficiální podoby. Hodnoty jednotlivých položek tvoří celá čísla, doménová jména, IP adresy a řetězce znaků. Jejich zápisy odpovídají běžným konvencím. V případě celých čísel zdůrazněme, že jsou zapisována v desítkové soustavě jako souvislé sekvence číslic. Nelze do nich vkládat oddělovače řádů (mezery, čárky a podobně).

Příklad dat

Výše jsme uvedli, že zóna cz musí obsahovat záznamy NS pro autoritativní servery tul.cz a také odpovídající slepující záznamy. Příslušný úsek zónového souboru by vypadal takto:

tul         NS     bubo.tul
            NS     tul.cesnet
bubo.tul    A      147.230.16.1
            AAAA   2001:718:1c01:16::aa
tul.cesnet  A      195.113.233.250

Všimněte si, že všechna jména jsou relativní (nekončí tečkou), takže se za ně doplní doména, v jejímž souboru se vyskytují. Například tul proto znamená tul.cz.

Řetězce znaků, jsou-li souvislé, lze psát přímo tak jak jsou. Pokud však má řetězec obsahovat mezery, je třeba obklopit jej uvozovkami ("), aby nebyly pochopeny jako oddělovače položek. Řetězec v uvozovkách může obsahovat i konce řádků a být tedy rozdělen do několika řádků za sebou. Pokud má obsahovat uvozovky, vložte před ně zpětné lomítko ( \" ).

Tento přístup je obecný – chcete-li potlačit speciální význam libovolného znaku, zapište před něj zpětné lomítko. O vložení zpětného lomítka do řetězce se tudíž postará \. Zcela libovolný znak lze vložit konstrukcí \DDD, kde DDD jsou číslice udávající kód znaku v osmičkové soustavě. Také tyto znaky jsou interpretovány jako pasivní část textu a je potlačen jejich případný speciální význam.

Alternativním zápisem pro vložení uvozovek by tedy bylo \042 , protože znak " má ASCII kód 34, v osmičkové soustavě 42.

Ke zvýšení čitelnosti lze do zónového souboru vkládat prázdné řádky a komentáře. Ty začínají středníkem, všechny následující znaky až po konec řádku jsou interpretovány jako komentář a serverem ignorovány.

Kromě běžných záznamů se v zónovém souboru mohou objevit také tak zvané direktivy, které představují příkazy ovlivňující způsob interpretace souboru. Různé servery si přidávají vlastní, ale standardně jsou definovány jen tři, jež shrnuje tabulka.

direktiva význam

$ORIGIN jméno

změní aktuální doménu – počínaje následujícím řádkem bude za relativní doménová jména doplňováno uvedené jméno

$INCLUDE soubor

vloží obsah daného souboru jako by jeho text byl zapsán v místě výskytu direktivy

$TTL čas

nastavuje implicitní dobu životnosti záznamů v zóně (definována v RFC 2308)

Jednoduchý zónový soubor

Zónový soubor pro velmi zjednodušenou zónu tul.cz, která obsahuje jen web, server pro příjem pošty a jednu poddoménu s vlastním webem, by mohl vypadat například takto:

Zónový soubor pro tul.cz
$TTL 48h
$ORIGIN tul.cz.
@       SOA    bubo.tul.cz. pavel\.satrapa.tul.cz. (
               2023071001 ;sériové číslo
               86400 ;aktualizovat po 1 dni
               7200 ;opakovat po 2 hod
               3600000 ;zrušit po 1000 hod
               172800 ) ;minimum 2 dny

        NS     bubo
        NS     tul.cesnet.cz.
        MX     0 bubo
        MX     50 tul.cesnet.cz.

bubo    A      147.230.16.1
        AAAA   2001:718:1c01:16::aa
        MX     0 bubo
web     A      147.230.16.27
        AAAA   2001:718:1c01:16:216:3eff:fela:d23f
www     CNAME  web

$ORIGIN fm.tul.cz.
; poddoména fm.tul.cz
; zavádíme sirius.fm.tul.cz a www.fm.tul.cz

sirius  A      147.230.72.241
www     CNAME  sirius

V souboru používáme relativní jména, abychom jej zkrátili a učinili o něco přehlednějším. U jmen ležících mimo tul.cz (zde například tul.cesnet.cz) je třeba nezapomenout na konci tečku, aby byla správně interpretována jako absolutní. Bez závěrečné tečky by tul.cesnet.cz bylo interpretováno jako tul.cesnet.cz.tul.cz.

Zde zónový soubor obsahuje kompletní data pro celou zónu. To odpovídá logice věci, nicméně není to nezbytné a pro velké zóny to nebude ani příliš praktické – se soubory obludné velikosti se po všech stránkách špatně pracuje. Bylo by klidně možné pro fm.tul.cz vytvořit samostatnou zónu s vlastním souborem:

Zónový soubor pro fm.tul.cz
$TTL 48h
$ORIGIN fm.tul.cz.
@       SOA    bubo.tul.cz. pavel\.satrapa.tul.cz. (
               2023071001 ;sériové číslo
               86400 ;aktualizovat po 1 dni
               7200 ;opakovat po 2 hod
               3600000 ;zrušit po 1000 hod
               172800 ) ;minimum 2 dny

        NS     bubo
        NS     tul.cesnet.cz.

sirius  A      147.230.72.241
www     CNAME  sirius

Pokud jsou obsluhovány stejnými servery, není třeba ani do tul.cz zavádět delegaci záznamem NS. Tazatel hledající www.fm.tul.cz se propracuje k autoritativním serverům pro tul.cz, jež mají oba zónové soubory a rovnou mu odpovědí. Z původního zónového souboru by tedy stačilo vymazat závěrečné řádky (počínaje druhým $ORIGIN). Koncepčnější ale je přidat do rodičovské domény záznamy s delegací, stejně jako by podřízenou doménu spravoval jiný subjekt. Závěrečné řádky původního zónového souboru je tedy lépe nahradit dvojicí:

fm      NS     bubo
        NS     tul.cesnet.cz.

Pokud spravujete zónu s poddoménami, je jen na vašem rozhodnutí, zda ji celou uložíte do jednoho souboru, nebo zda ji rozdělíte po jednotlivých doménách – obě varianty mají své přednosti.

Reverzní dotazy aneb hledá se jméno pro adresu

Reverzní dotaz vychází z IP adresy (verze 4 nebo 6) a snaží se zjistit, jaké doménové jméno jí náleží. Zlidšťují se tak protokoly o činnosti serverů, výstupy testovacích programů typu traceroute a podobně.

Aby se dalo DNS použít k řešení tohoto typu problémů, musí se z adresy vytvořit určité speciální doménové jméno, které se následně stane předmětem dotazu. Nepůjde to ale udělat přímočaře, protože doménové jméno má obecné části vzadu a směrem dopředu se zpřesňuje, zatímco v případě adresy je směr přesně opačný. Začíná obecnou adresou sítě, za ní následuje podsíť a až na konci se nachází adresa konkrétního stroje v podsíti.

Převod IP na jméno

DNS je postaveno na principu distribuované správy, aby informace mohli upravovat místní správci. Proto bylo třeba vymyslet způsob převodu IP adresy na dotazované jméno, který by umožnil například doménu odpovídající síťovému prefixu 147.230.0.0/16 svěřit do správy organizaci, jíž byla přidělena dotyčná síť.

Řešením je prosté otočení adresy. Konkrétně z IPv4 adresy se vytvoří poptávané doménové jméno tak, že se vyjde z jejího standardního zápisu, v něm se obrátí pořadí jednotlivých bajtů a na konec se přidá přípona in-addr.arpa. Pokud bychom například hledali, pod jakým jménem je registrována adresa 147.230.16.27, poptávali bychom doménové jméno:

27.16.230.147.in-addr.arpa

Síti 147.230.0.0/16 odpovídá v tomto pojetí doména 230.147.in-addr.arpa, kterou lze snadno svěřit do správy držiteli adresy. Distribuovaná správa je možná a informace nadále mohou být do DNS vkládány přímo tam, kde vznikají. Pro reverzní dotazy byl vytvořen speciální typ zdrojových záznamů nazvaný PTR (pointer ukazatel). Jeho hodnotou je doménové jméno odpovídající příslušné adrese.

Například dotaz na záznam typu PTR pro výše uvedené doménové jméno vás oblaží odpovědí, že náleží stroji web.tul.cz. TUL, jejíž doménu tul.cz jsme používali pro příklady v předchozí části, disponuje právě sítí 147.230.0.0/16. Zónový soubor pro její reverzní doménu 230.147.in-addr.arpa, který by odpovídal našemu příkladu výše, by vypadal následovně:

$TTL 48h
$ORIGIN 230.147.in-addr.arpa.
@       SOA bubo.tul.cz. pavel\.satrapa.tul.cz. (
            2023071001 ;sériové číslo
            86400 ;aktualizovat po 1 dni
            7200 ;opakovat po 2 hod
            3600000 ;zrušit po 1000 hod
            172800 ) ;minimum 2 dny

        NS  bubo.tul.cz.
        NS  tul.cesnet.cz.

1.16    PTR bubo.tul.cz.
27.16   PTR web.tul.cz.
241.72  PTR sirius.fm.tul.cz.

Jsme v reverzní doméně, relativní jména jsou proto vztažena k ní – například 1.16 znamená 1.16.230.147.in-addr.arpa. Veškerá jména z domény tul.cz musí být zapsána jako absolutní. Považujeme za rozumné držet celou zónu pohromadě v jednom souboru, nedelegovat její části do dalších zón.

Různá délka prefixu

Popsaný systém byl navržen v době, kdy IPv4 adresy patřily do tříd A, B nebo C a přidělované prefixy končily vždy na hranici bajtů. Když bylo v polovině 90. let nasazeno beztřídní adresování (CIDR, Classless Inter-Domain Routing), vznikl problém, protože najednou mohla koncová síť dostat prefix libovolné délky. Poskytovatel internetu, který má při správě adres roli lokálního internetového registru (LIR), například dostal pro své zákazníky k dispozici prefix 10.1.2.0/24.

Vzhledem k velikosti koncových sítí a aktuálním pravidlům se jej rozhodl rozdělit na čtyři části různé velikosti a ty přidělit jednotlivým zákazníkům:

  • prefix 10.1.2.0/25 dostal zákazník xyz1,

  • prefix 10.1.2.128/26 dostal zákazník xyz2,

  • prefix 10.1.2.192/27 dostal zákazník xyz3 a

  • prefix 10.1.2.224/27 dostal zákazník xyz4.

Při zachování původní koncepce reverzních zón bylo jedinou možností, aby jejich společnou zónu 2.1.10.in-addr.arpa spravoval poskytovatel a na základě požadavků jednotlivých zákazníků do ní vkládal záznamy pro jejich stroje. Takové uspořádání je ale dost nepraktické a popírá princip, aby si reverzní zónu spravoval sám držitel příslušného prefixu. Bylo potřeba vymyslet způsob, jak reverzní zónu delegovat kdesi uprostřed bajtu.

S řešením přišlo RFC 2317 s názvem Classless IN-ADDR.ARPA delegation. Do reverzního jména navrhlo vložit další doménu, která popisuje rozdělení bajtu a umožňuje delegovat jednotlivé poddomény různým subjektům. Toto vložení nelze udělat obecně, protože adresní prostor je členěn podle potřeby, jeho jednotlivé části se liší a zdaleka ne každá potřebuje delegaci uvnitř bajtu.

Držitel či správce prefixu, na jehož konci došlo k rozdělení, musí tuto skutečnost zanést do odpovídající reverzní zóny. V bajtu, ve kterém došlo k rozdělení, zavede poddomény pro jeho jednotlivé části a hodnoty do nich rozdělí. Používají se k tomu záznamy typu CNAME (přezdívka).

Konkrétně v našem příkladu by poskytovatel v doméně 2.1.10.in-addr.arpa+; zavedl poddomény `+0/25, 128/26, 192/27 a 224/27 a delegoval je příslušným zákazníkům. Kromě toho by do domény 2.1.10.in-addr.arpa vložil záznamy CNAME, jimiž by převedl původní reverzní jména na jména v těchto poddoménách. Všechny adresy přidělené prvnímu zákazníkovi by byly převedeny do domény 0/25.2.1.10.in-addr.arpa, takže například jméno 15.2.1.10.in-addr.arpa by se stalo přezdívkou pro 15.0/25.2.1.10.in-addr.arpa. Pro adresy druhého zákazníka by přezdívky vedly do domény 128/26.2.1.10.in-addr.arpa – například 137.2.1.10.in-addr.arpa by se díky CNAME změnila na 137.128/26.2.1.10.in-addr.arpa a tak dále.

Výhodou je, že dělicí zónu lze připravit předem a celou, bez ohledu na to, zda adresy byly přiděleny nebo nikoli. Zóna bude obsahovat záznamy CNAME pro všech 256 možných hodnot a až při dotazu autoritativních serverů jednotlivých poddomén spravovaných zákazníky se zjistí, zda pro danou adresu existuje PTR záznam či nikoli. Okamžitě po přidělení prefixů by tedy poskytovatel mohl vytvořit zónový soubor pro doménu 2.1.10.in-addr.arpa s následujícím obsahem:

$TTL 48h
$ORIGIN 2.1.10.in-addr.arpa.
@       SOA …

;poddomény spravované zákazníky
0/25    NS   ns1.xyz1.cz
        NS   ns2.xyz1.cz
128/26  NS   ns1.xyz2.cz
        NS   ns2.xyz2.cz
192/27  NS   ns1.xyz3.cz
        NS   ns2.xyz3.cz
224/27  NS   ns1.xyz4.cz
        NS   ns2.xyz4.cz

;pro všechny adresy v rozsahu prvního zákazníka
0       CNAME 0.0/25
1       CNAME 1.0/25
2       CNAME 2.00/25
…
127     CNAME 127.0/25

;pro všechny adresy v rozsahu druhého zákazníka
128     CNAME 128.128/26
129     CNAME 129.128/26
130     CNAME 130.128/26
…
191     CNAME 191.128/26

;pro všechny adresy v rozsahu třetího zákazníka
192     CNAME 192.192/27
193     CNAME 193.192/27
…
223     CNAME 223.192/27

;pro všechny adresy v rozsahu čtvrtého zákazníka
224     CNAME 224.224/27
225     CNAME 225.224/27
…
255     CNAME 255.224/27

Poddomény pak budou obsahovat běžné záznamy typu PTR pro existující stroje. Reverzní zóna 0/25.2.1.10.in-addr.arpa spravovaná zákazníkem xyz1 by mohla obsahovat například:

$TTL 48h
$ORIGIN 0/25.2.1.10.in-addr.arpa.
@       SOA …
        NS  ns1.xyz1.cz.
        NS  ns2.xyz1.cz.

1       PTR www.xyz1.cz.
2       PTR ns1.xyz1.cz.
3       PTR ns2.xyz1.cz.
4       PTR podpora.xyz1.cz.
35      PTR pc1.xyz1.cz.
36      PTR pc2.xyz1.cz.
127     PTR router.xyz1.cz.

Reverzní záznamy pro IPv6

Pro IPv6 adresy se používá analogický postup, jen je vzhledem k zápisu adres o něco složitější. Opět vychází ze zápisu adresy, který se rozvine na úplný tvar – tedy doplní se všechny vynechané nuly. Pořadí jednotlivých šestnáctkových číslic v adrese se obrátí a každá z nich se stane samostatnou doménou. Za ně se pak přidá konstantní přípona ip6.arpa. Vezměme jako příklad adresu 2001:db8:89ab:1:2a0:ecff:fe12:345. Doplníme chybějící nuly:

2001:0db8:89ab:0001:02a0:ecff:fe12:0345

Poté otočíme pořadí šestnáctkových číslic, uděláme z nich poddomény a připojíme ip6.arpa. Výsledný dotaz tedy bude poptávat doménové jméno:

5.4.3.0.2.1.e.f.f.f.c.e.0.a.2.0.1.0.0.0.b.a.9.8.8.b.d.0.1.0.0.2.ip6.arpa

Tento přístup opět umožňuje delegovat poddomény v souladu s přidělenými částmi adresního prostoru, navíc to vzhledem k důsledné agregaci adres půjde dělat hierarchicky. Vlastní informace o příslušném doménovém jméně je uložena v záznamu typu PTR, stejně jako v případě IPv4.

Nezaručená konzistence

Nikde není zaručeno, že dopředná a reverzní informace budou konzistentní. Tedy že odpověď získaná reverzním dotazem je skutečným doménovým jménem, pod nímž je zaregistrována daná adresa. Nesrovnalosti vznikají chybami, v horším případě úmyslně s cílem podvádět.

Nikdo totiž nemůže zabránit správci reverzní domény 230.147.in-addr.arpa, aby do ní zanesl, že některá ze zdejších adres přísluší třeba www.google.cz. Pokud na tom záleží (například při omezování přístupu ke službě podle klientovy domény), je záhodno si získané jméno ověřit – nechat si pro ně najít adresy a podívat se, zda je původní adresa mezi nimi. Pokud ne, nejsou data v reverzní doméně v pořádku.

Řekněme, že nejmenovaný server má povolen přístup pouze pro stroje z domény tul.cz. Dorazí-li mu paket z IPv4 adresy 147.230.33.44, získá reverzním dotazem jeho jméno, řekněme pc33.tul.cz. Jelikož se této informaci nedá věřit, poptá vzápětí záznamy typu A pro pc33.tul.cz. Ty už do DNS vkládá správce domény tul.cz a má je pod kontrolou. V odpovědi se dozví třeba:

pc33    A    147.230.11.12
        A    147.230.33.44

Pak může nalezenému jménu důvěřovat, protože zkoumaná adresa se nachází v jeho záznamech A. Daleko častější chybou než úmyslné falšování je chybějící reverzní záznam. Nemálo správců se jejich údržbou nezatěžuje a pokus o zjištění jména k takové adrese skončí neúspěchem.

Chybějící reverzní záznam u poštovního serveru obvykle znamená, že takovýto server bude považován za nedůvěryhodný a pošta od něj bude házena do spamu.

Vnitřní život DNS

V předcházející kapitole jsme stručně popsali základní komponenty a principy, na nichž je systém postaven. Nyní se budeme jeho složkám věnovat podrobněji a podíváme se jim důkladně na zoubek. Začněme daty, která mají dvě základní složky: jména identifikující jednotlivé domény a formát zpráv, jež tvoří DNS komunikaci. Po nich probereme protokol a chování jednotlivých účastníků.

Doménová jména

Jak už jsme uvedli, jméno určuje cestu doménovým stromem, jež vede od kořene (případně z jiného bodu, pokud je jméno relativní) až k dané doméně. Formálně je tvořeno posloupností tak zvaných jmenovek (label), jež jsou navzájem odděleny tečkami. Oficiálně se na ně vztahuje několik málo omezení:

  • maximální délka jedné jmenovky je 63 znaků,

  • celé jméno nesmí být delší než 255 znaků,

  • počet jmenovek ve jméně je omezen na 127.

Upřímně řečeno, jen málokteré z nich skutečně pocítíte. Nikdo nemá zájem vytvářet dlouhatananánská jména ve stylu

www.polni.mys.hrabosi.savci.prirodovedne.sbirky.narodnimuzeum.cz

a to se ještě pořád pohybujeme hluboko v povolené zóně — délka obludy dosahuje pětiny přípustné velikosti.

Jmenovky mohou teoreticky obsahovat ledacos. Postupem času se však objevila řada chyb a nedokonalostí programů používajích údaje z DNS, proto RFC 1035 doporučuje držet se u jednotlivých jemnovek následujících omezení:

  • používat jen písmena anglické abecedy, číslice a pomlčky,

  • začínat jmenovku vždy písmenem,

  • zakončit jmenovku písmenem nebo číslicí, nikoli pomlčkou.

Je lépe vyhýbat se řadě populárních znaků, jako jsou podtržítka, lomítka, dvojtečky, procenta či jiné exotičtější znaky národních abeced, které jsou velmi žádány v oblastech, jejichž písmo není odvozeno od latinky. Pro ně bylo vytvořeno rošíření IDN, kterému se budeme věnovat později.

Doménová jména musí být jednoznačná. Proto sourozenci v doménovém stromě (poddomény stejné rodičovské domény) musí mít odlišné jmenovky. Nebo opačně: pokud se vyskytuje několik záznamů se stejným jménem a typem, jsou považována za záznamy stejného vlastníka — například několik záznamů MX pro jednu doménu nebo několik IP adres jednoho počítače.

Tatáž jmenovka se samozřejmě může opakovat v různých místech doménového stromu — jako nejlepší příklad poslouží www, kterou najdeme na každém rohu.

Při porovnání se v DNS nerozlišují malá písmenka od velkých. Nemohou tedy existovat domény nic.cz a NIC.cz, protože jsou považovány za shodné. Na druhé straně se ale od DNS software požaduje, aby při předávání informací neměnil velikost znaků v nich obsažených. Takže například jméno k IP adrese při reverzním dotazu dostanete v té podobě, jak je zapsána v DNS databázi, i s případnými malými/velkými písmeny. Při jeho porovnávání s dalšími jmény ale velikost znaků nehraje roli. Zadáte-li do webového prohlížeče adresu www.NIC.cz, skončíte zcela korektně na stránce www.nic.cz.

Oficiálně se délka jedné jmenovky musí pohybovat v rozmezí od 0 do 63 znaků. Prázdnou jmenovku však nelze používat — byla vyhrazena pro kořenovou doménu. Jestliže jsme v předchozí kapitole psali, že pro zdůraznění absolutního jména se na jeho konec píše tečka (www.nic.cz.), vlastně to znamená, že za touto tečkou je ještě uvedena prázdná jmenovka kořenové domény.

V DNS zprávách se doménová jména nepřenášejí jako řetězce znaků, ale jako sled po sobě jdoucích jmenovek. Každá začíná jednobajtovou informací o své délce, za níž pak následují znaky tvořící vlastní obsah jmenovky. Přesněji řečeno, nejvyšší dva bity počátečního bajtu jmenovky jsou interpretovány jako kód určující její typ. Jejich hodnoty (binárně) mají následující význam:

  • 00 Obyčejná jmenovky. Proto je délka omezena na 63 znaků, což je maximální hodnota zbývajících šesti bitů délkového bajtu.

  • 01 Rozšířená jmenovka. Následujících šest bitů obsahuje kód určující její konkrétní typ. Rozšířené jmenovky jako obecný princip zavedlo EDNS(0), zatím však byly definovány jen nepoužívané experimentální binární jmenovky. Podrobněji to popíšeme později.

  • 10 Zatím nedefinováno.

  • 11 Zkratka, která se odkazuje na jiné jméno ve zprávě, případně jeho část. Zanedlouho ji popíšeme podrobněji.

Specifikace doporučují aby stejný formát používaly interně také aplikace, které s DNS pracují.

Formát DNS zpráv

Formát zpráv, které si účastníci DNS komunikace vyměňují, definuje RFC 1035. Obsahuje celkem pět částí. Začíná pevnou hlavičkou se základními informacemi. Za ní naásleduje vlastní obsah, rozdělený do čtyř sekcí: dotaz, odpověď, autorita a doplňky. Rámcovou podobu DNS zprávy představuje obrázek. V základní podobě je přenášena protokolem UDP v jednom datagramu a její celková délka nesmí překročit 512 bajtů.

Formát DNS zprávy

format DNS zpravy

K párování dotazů a odpovědí slouží počáteční Identifikátor (ID). Odesílatel pak do něj pro každý svůj dotaz vloží jednoznačnou hodnotu, kterou server zkopíruje do odpovědi. 16 bitů následujících za identifikátorem je věnováno různým příznakům a stavovým kódům charakterizujícím zprávu. Jednobitových příznaků je definováno celkem sedm:

  • QR (Query/Response) rozlišuje, zda se jedná o dotaz (hodnota 0) nebo odpověď (hodnota 1). DNS je zcela minimalistické, zavádí pouze dva základní typy zpráv, takže k jejich rozlišení slouží jediný bit.

  • AA (Authoritative Answer) obsahuje jedničku, pokud je server autoritativní pro data obsažená v Odpovědi.

  • TC (Truncated) indikuje, že zpráva byla zkrácena, protože překročila délkový limit 512 bajtů. Tazatel by měl zopakovat dotaz protokolem TCP.

  • RD (Recursion Desired) nastaví klient v dotazu, pokud požaduje jeho rekurzivní zpracování.

  • RA (Recursion Available) umožňuje serveru oznámit, že podporuje rekurzivní zpracování dotazů.

  • následující příznak není definován a povinně musí mít hodnotu 0.

  • AD (Authentic Data) ohlašuje, že server posílající zprávu úspěšně ověřil autentičnost dat pomocí DNSSEC

  • CD (Checking Disabled) se používá v dotazu a je-li nastaven, klient si vysloveně nepřeje ověření DNSSEC, chce si je zkontrolovat sám.

Čtyřbitová položka OpKód (Opcode) je spojena s dotazem. Upřesňuje, jaká činnost se od serveru očekává. Nejběžnější hodnotou je nepochybně nula, která ohlašuje standardní dotaz, kdy se ke jménu hledají záznamy daného typu. Další možné varianty shrunuje tabulka, k nejvýznamějším z nich se později dostaneme.

Tabulka 1. Kódy dotazů (hodnoty položky OpKód)
Kód Význam Popis

0

QUERY

standardní dotaz

1

IQUERY

inverzní dotaz (zavržený)

2

STATUS

dotaz na stav serveru

3

nepřiřazeno

4

NOTIFY

upozornění na novinky

5

UPDATE

žádost o změnu

6

DSO

stavový provoz DNS

7—​15

nepřiřazeno

K odpovědi se váže návratový kód uložený v položce VýslKód (RCode). Pouze pokud obsahuje nulu, vše proběhlo v pořádku a má smysl se zabývat dalšími položkami odpovědi. Jak DNS postupně košatělo, návratové kódy jsou jedním z míst, kde brzy začala tlačit bota. Do čtyř bitů, které jsou k dispozici, se vejde jen 16 hodnot. Rozšíření EDNS(0), kterému se za chvíli budeme věnovat, proto přidalo dalších 8 bitů v pseudozáznamu OPT, který doplňuje základní hlavičku. Přehled všech definovaných kódů včetně rozšiřujících najdete v tabulce 2.

Tabulka 2. Kódy pro odpovědi (hodnoty položky VýslKód)
Kód Význam Popis

0

NoError

vše v pořádku

1

FormErr

server nedokázal dotaz interpretovat

2

ServFail

problém na straně serveru

3

NXDomain

dané jméno neexistuje

4

NotImp

požadovaná operace není implementována

5

Refused

dotaz odmítnut na základě lokální politiky

6

YXDomain

jméno existuje, ale nemělo by

7

YXRRSet

sada záznamů existuje, ale neměla by (nesplněná podmínka)

8

NXRRSet

sada záznamů neexistuje, ale měla by (nesplněná podmínka)

9

NotAuth

server není pro danou zónu autoritativní

9

NotAuth

neautorizovaný požadavek (pro TSIG)

10

NotZone

jméno v zóně neexistuje (nesplněná podmínka nebo špatný cíl dynamické aktualizace)

11—​15

nepřiřazeno

16

BADVERS

chybná verze OPT

16

BADSIG

selhání podpisu TSIG

17

BADKEY

neznámý klíč

18

BADTIME

podpis mimo dobu platnosti

19

BADMODE

chybný režim TKEY

20

BADNAME

duplicitní jméno klíče

21

BADALG

nepodporovaný alogoritmus

22

BADTRUNC

špatné zkrácení

23—​3840

nepřiřazeno

3841—​4095

rezervováno pro privátní využití

4096—​65534

nepřiřazeno

65535

rezervováno

Navzdory prodloužení návratového kódu stále platí, že ke stejnému výsledku mohou vést různé příčiny a hodily by se větší podrobnosti. RFC8914 extended DNS Errors prot přišlo s konceptem rozšířených chyb. Jedná se o dopňkovou informaci upřesňující, proč odpověď obsahuje daný návratový kód. Specifikace zakazuje měniť podle těchto informací chování DNS, jedná se skutečně jen o doplněk, který zejména pro diagnostiku problémů a ladění. Podrobnosti se dočtete dále.

Všechny čtyři hlavní sekce DNS zprávy mají proměnlivou velikost. Proto jsou předcházeny čtveřicí položek hlavičky obsahující jejích délky. Za nimi postupně následují:

  • Dotaz (Question) specifikuje hledanou informaci. Jako jediný má pevnou strukturu — obsahuje hledané jméno, třídu a typ záznamů. Nelze se ptát na několik jmen či typů najednou. Pokud vznikne taková potřeba, je potřeba odeslat několik jmen či typů najednou, každý s jednou kombinací hledaných parametrů. Formát této části zprávy znázorňuje obrázek.

Formát sekce Dotaz v DNS zprávě

format sekce dotaz

  • Odpověď (Answer) obsahuje zdrojové záznamy přímo odpovídající na dotaz. Tedy záznamy požadovaného jména, typu a třídy. Formát zdrojového zdrojového záznamu najdete na obrázku 3. Obsah sekce je tvořen prostou posloupností těchto záznamů, stejně jako zbývající dvě části.

  • Autorita (Authority) poskytuje informace o autoritativních serverech příslušných pro řešení dotazu.

  • Doplňky (Additional) nesou informace, které by mohli být tazateli užitečné. Mohou zde být například adresy serverů ze sekce autorit nebo materiál pro DNSSEC. Tato sekce zprávy není klíčová, pouze dopňuje informace z předchozích částí. Údaje zde obsažené klient v principu může získat následně samostatnými dotazy. Například poptávat záznamy typu MX a dozvědět se v odpovědi doménová jména poštovních serverů, v Doplňcích byly přibaleny jejich adresy — záznamy typu A a/nebo AAAA, Pokud tam nebudou, zeptá se na ně. Bude to vyžadovat přenos dalších zpráv a bude to pomalejší, ale v principu je to možné. Přínos Doplňků spočívá ve zvýšení efektivity a zrychlení celého mechanismu.

Formát zdrojového záznamu v DNS zprávě

format zdrojoveho zaznamu

Poslední dílek do skládačky datových formátů představují zdrojové záznamy, jimiž jsou naplněny závěrečné tři sekce DNS zprávy. Každý záznam obsahuje pět základních informací: jméno, k němuž se vztahuje, svůj typ, třídu, nesená data a dobu živostnosti této informace. Jsou přenášeny ve tvaru podle obrázku 3. Jméno (Name) je uloženo ve formátu popsaném v předchozí části. Samo v sobě obsahuje informace informace o délce, proto nejsou nutné žádné doprovodné položky. Přehled existujících Tříd (Class) podává tabulka. Definovaných Typů (Type) je dnes kolem devadesáti. Jejich výčet s veškerými podrobnostmi obsahuje část III na straně 369, postupem času se pozvolna mění — vznikají nové typy, jiné jsou opouštěny. Aktuální seznam tříd i typů IANA na adrese

Tabulka 3. Třídy záznamů
Kód Zápis Popis

0

rezervováno

1

IN

Internet

2

nepřiřazeno

3

CH

Chaosnet

4

HS

Hesiod

5—​253

nepřiřazeno

254

NONE

žádná třída

255

ANY

libovolná třída

256—​65279

nepřiřaazeno

65280—​65534

rezervováno pro provátní využití

65535

rezervováno

Doba životnosti (TTL) zdrojového záznamu je uvedena relativně. Tato položka obsahuje počet sekund, po které smí příjemce ponechat záznam ve vyrovnávací paměti. Je-li nulová, záznam se sice může použít, ale uložit jej nelze.

Nesená data mají proměnlivou strukturu i délku. Tu proto uvádí samostatná položka Délka dat (RDlength), jejímž obsahem je i délka položky Data (Rdata) v datech.

V obsahu zpráv se urputně bojuje o místo — 512 bajtů není nijak nijak oslnivé číslo, zejména pokud se do něj mají vejít i digitální podpisy a klíče DNSSEC. Jedním z významných spotřebitelů jsou jména, která se navíc často opakují. Proto RFC 1035 zavedlo jednoduchou komprimační metodu umožňující nahradit celé jméno či jeho část odkazem na jiné. Jedná se o šestnáctibitovou hodnotu, jejíž první dva bity obsahují jedničku a ve zbývajících čtrnácti je uloženo číslo bajtu v DNS zprávě, kde začíná odkazovaná jmenovka. Pokud se ve zprávě opakuje stejné jméno (například jména zdrojových záznamů v Odpovědi se zpravidla shodují se jménem Dotazu), lze je jednoduše nahradit odkazem. Dají se ale používat i částí jmen — odkázat se třeba na závěrečné dvě jmenovky — a odkazy kombinovat se jmenovkami — začít jméno normálně, ale konec nahradit odkazem. Jediným omezením odkazů je, že skončí vždy až koncem odkázaného jména. Nelze převzít první jmenovku a za ni doplnit něco jiného. Doménové jméno v DNS zprávě může tedy mít jednu z podob:

  • plné jméno — sekvence jmenovak ukončené jmenovkou nulové délky,

  • odkaz,

  • sekvence jmenovek ukončená odkazem.

Komprimace je jednoduchá, výpočetně nenáročná, ale poměrně účinná, protože recyklovatelných jmen a jejich částí je v DNS zpávách dost. Extrémním příkladem je dotaz na kořenové servery. V odpovědi dostanete 13 jmen, která sdílejí poměrne dlouhou doménu root-servers.net. Vsekci Doplňky se každé jméno dvakrát opakuje v záznamech typu A a AAAA. V nekomprimované podobě by všechna jména v odpovědi zabrala 741 bajtů. Komprimace zmenší jejich objem na 116 bajtů, tedy méně než šestinu, Díky tomu celá odpověď včetně všech adres měří 811 bajtů.

Formát zprávy poskytuje dost malý prostor pro případné doplňky či rozšíření. Paul Vixie proto v roce 1999 přišel s návrhem, jak otevřít prostor těmto aktivitám. Vžilo se pro něj označení EDNS(0) a jeho definici přineslo RFC 2671 Extension Mechanism for DNS (EDNS0), později nahrazené stejnojmenným RFC 6891. Jedná se o stručný dokument, který vlastně definuje jen dva prvky: pseudozáznam OPT a rozšířené typy jmenovek.

Pseudozáznam OPT zvětšuje počet možných kódů pro výsledek operace z původních šestnácti na 4096, s čímž si snad DNS nějakou dobu vystačí, a umožňuje přidat další příznaky. Podstatný přínos spočívá také v tom, že ohlašuje velikost UDP dat, která je jeho odesílatel schopen zpracovat naráz, a umožňuje tak posílat odpovědi přesahující standard 512 bajtů.

Rozšířené typy jmenovek se poznají podle toho, že v nejvyšších dvou bitech svého prvního bajtu obsahují hodnotu 01. Zbývajících šest bitů pak obsahuje typ této rozšířené jmenovky a na jejich hodnotě nezáleží., jak budou interpretována její následující data. Žádné konkrétní rozšířené typy RFC 2671 nezavedlo, jen definovalo tento obecný mechanismus pro jejich vytváření. RFC 6891.

Na základní specifikaci navázalo RFC 2673 Binary Labels in the Domain Name System, které zavedlo binární jmenovky. Jejich formát byl jednoduchý — první bajt obsahoval konstatní hodnotu 65, identifikující tento typ jmenovky. Následovala jednobajtová délka a po ní až 256 bitů vlastní jmenovky v "nativní" podobě. Textový zápis binární jmenovky byl uzavřen do znaků \[ a ], vlastní jmenovka pak byla zapsána v binární podobě (prefix b), oktalové (prefix o) nebo hexadecimální (prefix x) soustavě, případně jako čtveřice tečkami oddělovaných desítkových čísel, stejně jako IPv4 adresa. Součástí zápisu jmenovky mohlo být i lomítko následované její délkou v bitech.

Binární jmenovky se ovšem neujaly. Chybějící podpora ze strany serverů způsobovala provozní potíže a žádný z návrhů na jejich konkrétní využití (například reverzní záznamy pro IPv6 podle pozděěji odmítnutého RFC 2874) se neprosadil. Když v roce 2013 vyšla v RFC 6891 aktualizovaná specifikace EDNS(0), nařídila povinnou podporu pseudozáznamu OPT, ovšem binární jmenovky uložila k ledu a změnila jejich statut na experimentální. Tato nová specifikace se k rozšířeným jmenovkám obecně staví velmi rezervovaně, protože způsobují řadu praktických problémů při nasazení.

EDNS(0) je podporováno snad všemi moderními implementacemo DNS. Staví na něm některá pozdější rozšíření, jako například DNSSEC, pro jehož objemné záznamy by původní maximální délka zprávy 512 bajtů byla příliš omezující.

Komunikace mezi klientem a serverem

Že je protokol DNS postaven na principu klient — server už víte. V běžných případech je komunikace mezi nimi triviální, zahrnuje výměnu pouhých dvou datagramů: klient pošle dotaz a server na něj odpoví. Nemá tudíž valný smysl řešit ztrácení paketů či přehození jejich pořadí, k němuž by při přenosu internetem mohlo dojít. Proto DNS jako standardní transportní protokol používá UDP, konkrétně jeho port 53.

Kromě základní komunikace však existují případy, kdy je objem přenášených dat větší. Tím nejčastějším je přenos zóny z primárního serveru na sekundární. Případně může celková velikost odpovědi překročit délkový limit (standardně 512 bajtů, při použití EDNS(0) protokolu může být vyšší, ale ani ten nemusí stačit). V takových případecj přijde ke slovu protokol TCP (opět port číslo 53). DNS je tedy jednou z mála služeb využívající oba základní trnasportní protokoly internetové architektury. Valnou většinu práce však zajistí UDP.

Situace s transportními protokoly se postupem času stále více zamotává a nově do ní vstupuje i šifrování. Zde popíšeme tradiční model, se kterým DNS přišlo na svět a který dosud převažuje. Specialitám, odchylkám a novotám se budeme věnovat později.

Klient

Vzájemnou komunikaci zahajuje vždy klient (resolver). Podle požadavků aplikace sestaví dotaz. DNS zprávu, které do sekce Dotaz uloží hledané jméno, typ a třídu záznamu. Jako typ může uvést libovolný konkrétní typ, nebo některou ze speciálních hodnot z tabulky. Za zmínku stojí zejména hodnota 252 (označovaná jako AXFR), jejím prostřednictvím klient požaduje zaslání celé zóny. Používá se pro synchronizaci dat mezi servery, ke které se dostaneme později. Druhým zajímavým případem je hodnota 255 (označovanou jako hvězdička nebo ANY), která říká, že na typu záznamu nezáleží.

Tabulka 4. Speciální typy záznamů pro dotazy
Typ Význam

ANY (255)

libovolný typ

AXFR (252)

přenos celé zóny

IXFR (251)

přenos rozdílů v zóně

Na první pohled by se tyto dva typy mohly zdát totožnými — oba chtějí "všechno". Ve skutečnosti je mezi nimi podstatný rozdíl. Typ ANY požaduje záznamy, které se vztahují přesně k danému jménu. Například pro jméno nic.cz dostanete přes dvacet záznamů devíti typů — SOA, NS, MX, A, AAAA, TXT, RRSIG, NSECPARAM a DNSKEY. Všechny jsou svázány se jménem nic.cz. Požádáte-li o AXFR pro stejné jméno, dostali byste kompletní zónu. Tedy nejen záznamy pro vlastní nic.cz, ale také vše, co obsahuje — záznamy pro www.nic.cz, a.ns.nic.cz, enum.nic.cz a řadu dalších. Podíváte-li se na doménový strom, ANY se týká jen jednohoho konkrétního vrcholu, zatímco AXFR žádá o celou zónu začínající daným vrcholem.

Popsaná interpretace ANY ve smyslu "chci všechny typy" je tradiční a většina serverů se ji drží. Bohužel může vést ke dlouhodobýcm a snadno zneužitelným odpovědím. RFC 8482 Minimal Responses for ANY Queries proto zdůrazňuje, že toto chování nemá podporu ve specifikacích a ve skutečnosti ANY znamená "jakýkoliv typ", nikoli "všechny typy". Navrhuje také několik možností, jak odpovědi zkrátit. Například autoritativní servery domény tul.cz pošlou jen záznam typu A.

Základní chování klienta je jednoduché. Pošle dotaz a čeká na odpověď. Pokud nepřichází, zkusí to znovu., pokud možno s jiným serverem. Když dorazí výsledky, předá je žadateli. Oficiálně jeho základní algoritmus definuje RFC 1034 následovně:

  1. Pokud je odpověď k dispozici lokálně (ve zdejší vyrovnávací paměti), poskytne ji rovnou aplikaci a skončí.

  2. Najde nejvhodnější servery.

  3. Posílá jim dotazy, dokud některý neodpoví.

  4. Analyzuje odpověď a vybere jednu z následujících variant:

    1. Pokud obsahuje odpověď na dotaz, uloží si ji do vyrovnávací paměti a předá aplikaci.

    2. Pokud odpověď obsahuje lepší delegaci (autoritativní servery blíže k řešení), uloží si ji do vyrovnávací paměti a vrátí se k bodu 2.

    3. Pokud odpověď obsahuje přezdívku (CNAME) a tento typ záznamu nebyl aplikací požadován, uloží si záznam CNAME do vyrovnávací paměti, změní hledané jméno na kanonické jméno uvedené v CNAME a vrátí se k bodu 1.

    4. Pokud odpověď oznamuje selhání serveru nebo je nekorektní, odstraní server ze seznamu dotazovaných a vrátí se k bodu 3.

Asi nejzajímavější je druhý bod, kde klient vybíránejvhodnější servery. Je triviální u jednoduchého resolveru, který má svůj jeden server (nebo dva) a vše posílá jemu. V zajímavější situaci je plnohodnotný resolver pracující na rekurzivním serveru. Základním materiálem pro výběr serverů jsou záznamy NS v jeho vyrovnávací paměti. Vybere z nich autoritativní servery pro doménu, která má nejdelší shodu s hledaným jménem (shoduje se největší počet po sobě jdoucích jmenovek od konce doménového jména).

Hledá-li například www.uibk.ac.at a ve vyrovnávací paměti má záznamy NS pro domény ., nic.cz, cz a at, zvolí si v nodu 2 autoritativní servery pro doménu at, které jsou z nich nejblíže řešení. Jako podpověď od nich dostane záznamy NS pro doménu ac.at, které si podle bodu 4b přidá do vyrovnávací paměti, vrátí se k bodu 2 a nově si pro dotazování vybere právě tuto skupinu serverů, protože jsou nyní nejrelevantnější.

Pokud nenajde ve vyrovnávací paměti žádný vhodný server, musí mít k dispozici "krabičku poslední záchrany" a adresami serverů pro tento případ. Standardně se jedná o adresy kořenových serverů.

Jak vybírat mezi servery, které se chystá oslovit, či v jakém pořadí je oslovovat specifikace neřeší a ponechává rozhodnutí na implementaci. Ta je buď náhodně střídá, nebo si vede statistiky o dobách odezvy a oslovuje nejprve ty nejrychlejší. Cílem je nalézt vhodnou rovnováhu mezi rychlostí odezvy a zatížením sítě.

Server

DNS server naslouchá na UDP a TCP portech číslo 53 a zodpovídá přicházející dotazy. Nejjednodušší variantou je nerekurzivní server, který zasílá data pouze z lokálních informací. Složitější je úloha rekurzivního serveru, který musí být doplněn resolverem a vyrovnávací pamětí, do níž ukládá získané záznamy. RFC 1034 opět popisuje základní algoritmus jeho činnosti při sestavování odpovědi, později lehce doplněný v RFC 6672:

  1. Podle svých vlastností nastaví nebo vymaže v odpovědi příznak RA oznamující dostupnost rekurzivního řešení dotazů. Poku podporuje rekurzi a klient ji příznakem RD požadoval, pokračuje bodem 5. Jinak přejde k bodu 2.

  2. Hledá v dostupných zónách takovou, která je nejbližším předkem hledaného jména. Jestliže ji najde, pokračuje bodem 3, při neúspěchu bodem 4.

  3. Začne postupně shora dolů prohledávat jmenovky v zóně a porovnávat je s hledaným jménem. Může skončit několika různými způsoby:

    1. Najde kompletní hledané jméno, tedy přesně požadovaný uzel doménoveho stromu. Pokud nalezený záznam typu CNAME a tazatel nepožadoval záznam tohoto typu, vloží nalezený záznam CNAME do sekce Odpověď, nahradí hledané jméno za kanonické jméno podle záznamu a vrátí se ke kroku 1. Jinak vloží do sekce Odpověď všechny záznamy odpovídajícího typu pro nalezené jméno a pokračuje krokem 6.

    2. Najde záznam NS, který znamená, že hledané jméno leží mimo zónu, pro niž je tento server autoritativní. Vloží nalezené záznamy NS do sekce Autorita a pokud pro ně zóna obsahuje slepující záznamy s adresami, přidá je do sekce Doplňky. Pokračuje bodem 4.

    3. Pokud je shoda nemožná (odpovídající jmenovka neexistuje), podívá se, zda poslední nalezené jméno obsahuje záznam DNAME (více v další části). Pokud ano, vloží jej do Odpovědi, změní podle něj hledané jméno, vygeneruje záznam CNAME převádějící hledané jméno na změněné a také jej přidá do Odpovědi. Následně se vrátí ke kroku 1.
      Když neexistuje DNAME, hledá použitelný žolíkový záznam. Budeme se jin věnovat za chvíli, ale pro úplnost zde rozepíšeme příslušné chování. (Použité pojmy vysvětlíme později.) Neexistuje-li jmenovka * a hledané jméno odpovídá původnímu jménu z dotazu, vloží do položky VýslKód chybový kód 3 ohlašující neexistující doménu (NXDomain). Jestliže hledané jméno vzniklo nahrazením původního podle záznamu typu CNAME, jednoduše skončí.
      Když existuje vhodný žolíkový záznam, chová se podobně jako ve variantě a. Je-li zdrojem syntézy zázanm typu CNAME a klient hledaj jiný typ, vloží žolíkový záznam CNAME do sekce Odpověď, nahradí hledané jméno kanonickým a vrátí se k bodu 1. V opačném případě vloží do sekce Odpověď všechny vyhovující žolíkové záznamy a následuje krok 6. V žolíkových záznamech vkládaných do odpovědí vždy nahrazuje jméno vlastníka hledaným jménem. Server tedy "tají", že se jedná o záznam vytvořený z žolíkového a tváří se, jako by v odpovědi posílal běžný záznam.

  4. Prohledá vyrovnávací paměť. Pokud v ní najde hledané jméno, vloží všechny záznamy vyhovujícího typu do sekce Odpověď. Nenajde-li jméno, ale jeho přeek obsahuje záznam DNAME, vloží tento zázanm do Odpovědi. Jestliže autoritativní data neobsahují žádnou delegaci, najde nejlepší použitelnou ve vyrovnávací paměti a přidá ji do sekce Autorita. Pokračuje bodem 6.

  5. oužije místní resolver (nebo jeho ekvivalent) k nalezení odpovědi. Uloží výsledky včetně všech mezilehlých záznamů CNAME a DNAME do sekce Odpověď.

  6. Do sekce Doplňky přidá záznamy, které by mohly být užitečné. V této fázi už nezasílá žádné další dotazy, využívá jen lokálně dostupné informace. Tím příprava odpovědi končí.

Důležitým požadavkem je, že server do sekce Odpověď musí vždy uložit celou sadu záznamů vyhovujících dotazu. Pokud klient shání adresu (záznam typu A) a pro dané jméno jich existuje deset, je povinností serveru vložit do odpovědi všech deset. Pouze pokud by tím došlo k překročení přípustné délky zprávy, může přikročit ke zkrácení a zařadit jen toli záznamů, kolik se vejde. V tom případě musí v hlavičce odpovědi nastavit příznak zkrácení TC. Zkrácené odpovědi jsou nekompletní a nelze je ukládat do vyrovnávací paměti. Resolver by je měl zahodit a dotaz zopakovat protokolem TCP, který umožní rozdělit odpověď do několika paketů a poslat kompletní informace.

Požadavek na kompletnosti sady záznamů je obecný a týká se i ostatních částí odpovědi. V jejich případě však není nastavován příznak zkrácení. Sady záznamů se do nich vkládají způsobem "všechno nebo nic". Například adresy jmenných serverů v sekci Doplňky mohou a nemusí být. Pokud se příslušný záznam nevejde do odpovědi, server ji jednoduše nevloží a klient — pokud je bude potřebovat — se na adresy zeptá samostatným dotazem. Není však povoleno, aby se z prostorových důvodů do Doplňků zařadila je část adres pro daný server. Kompletnost se týká vždy jen jedné sady. Pokud jsou servery tři, mohou doplňky obsahovat kompletní sady adresních záznamů pro první dva a třetí, který by se už nevešel bude chybět.

Všimněte si chování server, pokud klient požaduje neexistující informaci. Mohou nastat dva významně odlišné případy. Pokud hledané jméno vůbec neexistuje a není k dispozici ani žádný použitelný žolíkový záznam, definuje chování serveru bod 3c výše uvedeného algoritmu. Server v takovém případě pošleodpověď s chybovým kódem ohlašujícím neexistenci doménového jména. Druhý případ nastane, pokud hledané jméne sice existuje, ale není pro něj žádný záznam požadovaného typu. Řešení této situace spadá pod bod 3a — server pošle odpověď s návratovým kódem 0 (všechno v pořádku), ovšem sekce Odpověď bude prázdná, protože "vložení všech záznamů odpovídajícího typu" nevloží nic.

Zónové přenosy

Už jsme zmínili, jak je důležité, aby všechny autoritativní servery poskytovaly o zóně konzistentní údaje. Jakmile se jejich odpovědi rozcházejí, vznikají dost matoucí a nepříjemně dohledatelné stavy, kdy z různých částí Internetu začínají přicházet hlášení "ono to nejde", zatímco správce si při zběžné kontrole snadno ověří, že "to funguje". Příčinou bývá, že různí klienti se obracejí na různé servery a dostávají odlišné odpovědi.

Existuje několi alternativ, jak zajistit synchronizaci dat mezi primárním a sekundárními servery. Lze využít prostředky zcela mimo DNS. Některé implementace například ukládají DNS data do databází. Potom lze použít standardní databázové nástroje pro replikaci dat a přenášet data na sekundární servery jejich pomocí. Pro textové zónové soubory je také k dispozici řada programů zajišťujících synchronizaci adresářů a souborů v nich — rsync, Unison a další.

Zde se ovšem budeme zabývat prostředky, které pro řešení tohoto problému nabízí samotné DNS. Jejich hlavní výhodou je snadnost použití. Nemusíte se starat o další službu, konfigurovat pro ni servery či nastavovat pravidla ve firewallech, vše obstará prostá DNS komunikace. Navíc zpravidla jen s minimálními zásahy do konfigurace.

Základní a nejjednodušší varianta funguje tak, že každý sekundární server se v určitých intervalech (jejich délku určuje hodnota Interval aktualizací v záznamu SOA příslušné domény) obrací na primární server a zjištuje, zda nedošlo v zóně ke změně. Provede to zcela jednoduše — standardním způsobem poptá záznam SOA a porovná jeho Sériové číslo s verzí, kterou disponuje. Pokud záznam SOA primárního serveru obsahuje vyšší hodnotu, zónová data se změnila a je třeba získat aktuální verzi.

V takovém případě se sekundární server opět obrátí na primární s DNS dotazem, tentokrát ovšem protokolem TCP, protože odpověď skoro jistě přesáhne rozsah jedné zprávy. Je tedy vhodnější použít transportní protokol, který zajistí spolehlivé doručení všech dat. Jako typ poptávaného záznamu ve svém dotazu uvede AXFR. Jedná se o speciální hodnotu, kterou tazatel požaduje kompletní zónu, jejíž jméno je uvedeno v dotazu. odpovědí bude celá séria zpráv, z nichž první a poslední obsahuje data pro vrchol příslušné zóny (její záznam SOA) a zprávy mezi nimi nesou všechny zdrojové záznamy, které do zóny patří. Podle opakovaného SOA v poslední zprávě příjemce pozná, že data jsou kompletní.

Tento způsob přenosu zóny definuje již původní RFC 1034, později byl upřesněn v RFC 5936 DNS Zone Transfer Protocol (AXFR). Teoreticky může proběhnout i mezi dvojicí sekundárních serverů — každý autoritativní server musí být schopen zodpovědět dotaz AXFR popsaným způsobem. V praxi se však až na naprosté výjimky přenáší zóna z primárního serveru na sekundární server.

Metod amá dvě nevýhody. Novinky se šíří pomalu, protože obvyklý interval pro kontrolu změn bývá několi hodin, během nichž se sekundární server o nic nestará a poskytuje svou verzi dat. Druhou nevýhodou je zbytečně velký objem dat. Přenáší se celá zóna, přestože do ní třeba přibyl jediný záznam. Odstranění obou nevýhod nabídla dvojice RFRC 1995 Incremental Zone Transfer in DNS a RFC 1996 A Mechanism for Promp Notification of Zone Changes (DNS NOTIFY), která přinesla přenos rozdílů v zóně a upozornění na změny.

Rozdílový přenos může sekundární server použít, když má k dispozici určitou verzi zónových dat a zjistil, že primární server má novější. Naváže TCP spojení a položí dotaz, ve kterém ovšem místo typu AXFR požaduje (pseudo)záznam IXFR. Do sekce Autorita svého dotazu vloží zázanm SOA té verze zóny, kterou má k dispozici. Jestliže primární server nepodporuje rozdílové přenosy, odpoví kompletní zónou obklopenou dvojicí aktuálních záznamů SOA, úplně stejně jako při odpovědi na AXFR. Pokud server podporuje rozdílové přenosy, bude odpověď také začínat a končit aktuální verzí záznamu SOA pro poptávanou zónu. Mezi nimi však nebude celá zóna, ale posloupnost změnových sekvencí. Každá změnová sekvence popisuje, jak je potřeba upravit zónu mezi svěma verzemi SOA. Má tvar:

  • starší SOA

  • smazané záznamy

  • novější SOA

  • přidané záznamy

Jestliže v některém záznamu dojde ke změně, projeví se jako smazání původního záznamu a přidání jeho nového znění.

Podívejme se na příklad. Řekněme, že sekundární server má verzi zóny nic.cz, jejíž SOA mese sériové číslo 0053. Na serverumezitím došlo ke dvěma navýšením sériového číla — ve verzi 0054 přibyl záznam typu A pro pc5 s adresou 10.1.2.3 a ve verzi 0055 došlo ke dvěma změnám: adresa pc1 byla změněna z 10.9.8.7 na 10.6.5.4 a pc5 se zóny zase zmizelo. Když sekundární server pošle dotaz na záznam typu IXFR doprovázený SOA se sériovým číslem 0053, dostal by odpověď vidíte na obrázku.

Kompletní rozdílový přenos

IXFR prenos komplet

Tato data jsou zcela vyčerpávající a umožńují příjemci postupně rekonstruovat jednotlivé verze zóny. To ale většinou nebývá nutné, sekundární server jen potřebuje sestavit aktuální verzi. Odesílající server je proto oprávněn shrnout několik změn do jedné a popsat úpravu, která přesokčí několik generací a posune sérivé číslo o několik hodnot dál. V našem případě my mohl poslat jednu sekvenci, která změní verzi 0053 rovnou na 0055. Stroj pc5 z ní zcela vypadne, protože se objevil jen dočasně, verze 0053 ani 0055 jej neobsahují. Jediným rozdílem mezi nimi je změna adresy pc1.nic.cz. Odpověď by mohla vypadat tak, jak vidíte na dalším obrázku.

Komprimovaný rozdílový přenos

IXFR prenos komprimovany

Je samozřejmě starostí primárního serveru, zda a jak si uchovává informace o jednotlivých verzích zónového souboru a změnách mezi nimi. Většina sekundárních serverů dnes poptává zónu pomocí IXFR a nechává na primárním, zda odpoví rozdílově či kompletním přenosem.

Pro rychlejší šíření změn zavedlo RFC 1996 mechanismus upozornění, jímž může primární server informovat ostatní, že v zóně došlo ke změně. Postup je jednoduchý, jakmile dojde k zásahu do zónových dat, primární server se postaví do role klienta a každému ze sekundárních serverů pošle DNS dotaz se speciální hodnotou OpKódu NOTIFY. Do sekce Dotaz vloží jméno zóny a jako požadovaný typ informace SOA.

Tímto způseobem předá sekundárnímu serveru informaci, že v zóně je cosi jinak. Oznámení o změně neposkytuje žádné podrobnosti, co se změnilo, jen prostou informaci, že došlo ke změne. Odpověď sekundárníh serveru na dotaz není podstatná, v zásadě jen potvrzuje, že informaci přijal. Následně by se měl chovat, jako by vypršel aktualizační interval — poptá se primárního serveru SOA a přenese si aktuální verzi zóny. Díky tomu získá sekundární server aktuální data prakticky okamžitě, jak byla změněna.

Celý proces aktualizací zónových dat je postaven na porovnávání sériových čísel v záznamech SOA. Jiná verze dat je rozpoznána podle odlišného sériového čísla. Zapomenete je při změně zvýšit a problém je za humny — sekundární servery si zachovají svou stávající verzi zóny a budou nerušeně poskytovat odpovědi odlišné od serveru primárního.

Existují dva jednoduché přístupy, jak volit hodnotu sériového čísla. Jeden je zcela minimalistický, kdy začnete od jedničky a pokračujete sekvenčně, v každé verzi hodnotu o jedničku zvětšíte. Podobný přístup jsme použili v našich zdejších příkladech. Obvyklejší a autoritami doporučované je vyjít v sériovém čísle z data, kdy došlo ke změně zóny. Číslo má pak tvar RRRRMMDDnn — prvních osm číslic obsahuje datum změny (rok, měsíc, den). Zbývající dvě číslice představují pořadové číslo změny v daný den. Dokážete tedy rozlišit sto změn denně, což bohatě stačí pro běžně spravované zóny. Jakmile byste povolili dynamické DNS a počítače si samy automaticky vkládaly své záznamy, stovka verzí denně zdaleka nemusí stačit. Pak by bylo lepší přejít na sekvenční číslování.

Za drobnou kuriozitu lze považovat, že existuje RFC 1982 definující aritmetiku pro práci se sériovými čísly.

Kompletní informace o obsahu zóny jsou všeobecně považovány za choulostivé a jejich poskytování komukoliv je považováno za bezpečnostní riziko. Není dramaticky vysoké, ale naprsotá otevřenost vůči požadavkům na zónové přenosy přinejmenším usnadňuje případnému útočníkovi zahlcení serveru. Odpověď AXFR server zatěžuje mnohem víc než běžné dotazy a pokud se na něj sesypou tisíce takových požadavků zároveň, nemusí to dopadnout dobře.

Bývá proto zvykem poskytovat zónové přenosy jen těm, kteří to opravdu potřebují — autoritativním serverům dané domény. Jednoduchou variantou je omezení IP adres, z nichž server přijímá tento typ požadavků. Pokud pro zónu neexistují tajné autoritativní servery, lze jednoduše povolit přenosy těm strojům, jež jsou v jejich záznamech NS. Tento způsob konfigurace podporuje většina implementací DNS serverů, u kterých se jedná o implicitní chování.

Jeho nevýhodou je, že falšovat adresu odesílatele paketu není nijak obtížné a adresy autoritativních serverů jsou v DNS volně k mání. Pro paranioky je k mání silnější alternativa, digitální podpis, kterým žadatel doprovodí svůj dotaz.

Žolíkové záznamy

Dříve jsme se v textu zmínili o existenci žolíkových záznamů či možnosti určité libovůle v dotazech. Tyto prvky jsou obsaženy již v původní specifikaci DNS, nicméně jejich původní popis nechává určitý prostor čtenářově tvořivosti. Proto v roce 2006 (bezmála dvacet let později) vyšlo RFC 4592 The Role of Wildcards in the Domain Name System, které vše upřesňuje.

Základní myšlenkou je, že v zónách se mohou vyskytovat záznamy s universálním jménem, které mohou zastoupit libovolné neexistující jméno. Používá se pro ně označení žolíkové záznamy (wildcards records) a jako první jmenovku obsahují hvězdičku. Pokud klient poptává jméno, které sice neexistuje, ale příslušná doména obsahuje použitelný žolíkový záznam, dotázaný autoritativní server vytvoří záznam s hledaným jménem a vrátí tazateli jako úspěšnou odpověď. Důležité je, že žolíkové záznamy zastupují jen neexistující jména. Jakmile určité jméno existuje, žolíkový záznam na jeho úrovni (nebo vyšší) pro ně a jeho potomky nemá žádný účinek.

Tolik hrubý nástin a teď se podívejme na podrobnosti. Jednotlivé mechanismy si budeme ilustovat na konkrétních příkladech. Pro potřeby této sekce předpokládejme, že obsah zóny tul.cz je následující:

@               SOA     a.ns.tul.cz.   ...
                NS      a.ns.tul.cz.
                NS      tul.cesnet.cz.
                MX      0   mail.tul.cz.
a.ns.tul.cz.    A       147.230.1.1
cosi.tul.cz.    A       147.230.1.100
mail.tul.cz.    A       147.230.1.2
*.tul.cz.       MX      0   mail.tul.cz.
www.*.tul.cz.   CNAME   cosi.tul.cz.

Odpovídající výřez doménového stromu znázorňuje obrázek, ve kterém vidíte kromě jednotlivých jmen i typy záznamů, které pro ně existují. Všimněte si, že hvězdička v posledních dvou záznamech představuje jednu a tutéž doménu.

Příklad části doménového stromu

prikad casti domenoveho stromu

RFC 4592 zavádí pojem hvězdičková jmenovka (asterisk label), což je jednoznaková jmenovka tvořená hvězdičkou. Žolíkové doménové jméno je jméno, jehož nejlevější jmenovkou je právě hvězdička. Například *.tul.cz je žolíkové jméno, zatímco www.*.tul.cz nikoli, protože hvězdičková jmenovka není v jeho nejlevější části. Poněkud to připomíná žolíkové znaky v názvech souborů či regulární výrazy. V porovnání s nimi jsou však možnosti žolíků v DNS velmi omezené — hvězdičku ve jmenovce nelze s ničím kombinovat a definovat tak třeba jména začínající na "a".

žolíkové záznamy zaskakují za neexistující jména. Ale kdy vlastně jméno existuje? Odpověď je jednoduchá: pokud pro ně existuje alespoň jeden zdrojový záznam nebo pokud má alespoň jednoho existujícího potomka. Takže v našem příkladu existuje doménové jméno ns.tul.cz, přestože se k němu neváže žádný záznam. Existuje však záznam typu A pro a.ns.tul.cz, tedy má existujícího potomka. Doména ns.tul.cz v našem příkladu představuje tak zvaný prázdný neterminál (empty non-terminal). Naproti tomu neexistují třeba jména www.tul.cz či www.obed.tul.cz.

Pojem nejbližší obsahující (closest encloser) je pro hledané jméno označeno takové existující jméno v doménovém stromě, která má s hledaným největší počet shodných jmenovek. A konečně zdroj syntézy (source of synthesis) pro hledané jména je žolíkové doménové jméno, které je přímým potomkem nejbližšího obsahujícího. Pochopitelně za předpokladu, že takové žolíkové jméno existuje. Prakticky řečeno: Pokud poptávané jméno neexistuje, postupně se z něj zleva odebírají jednotlivé jmenovky. Jakmile se dorazí k existujícímu jménu, byl nalezen nejbližší obsahující. K němu se doleva přidá hvězdičková jmenovka a pokud tento záznam existuje, jedná se o zdroj syntézy pro poptávané jméno.

Toto je důležitý princip. Při hledání použitelného žolíkového záznamu (zdroje syntézy) se nezkoumá, zda kdekoli výše v zóně existuje nějaký žolíkový záznam, jehož konec se shoduje s poptávaným jménem. Hledá se vždy právě na jednom místě: Vyhledá se nejbližší obsahující a pokud obsahuje jako přímého potomka hvězdičkovou jmenovku, máme zdroj syntézy. Jinak zdroj syntézy neexistuje.

Takže například pro robot.tul.cz bude nejbližším obsahujícím tul.cz a zdrojem syntézy *.tul.cz. Pro b.ns.tul.cz je nejbližším obsahujícím ns.tul.cz. Zdroj syntézy pro něj neexistuje, protože ns.tul.cz neobsahuje jako přímého potomky hvězdičku. Aby existoval, museli bychom do zóny přidat záznam pro *.ns.tul.cz:. Existence záznamu *.tul.cz zde nemá žádný vliv, protože hvězdička není potomkem nejbližšího obsahujícího jména, do doménového stromu je zapojena výše.

Zbytek je popsán v bodě 3c algoritmu pro činnost serveru. Dorazí-li dotaz na neexistující jméno, vyhledá se pro něj zdroj syntézy. Pokud existuje, nahradí se hvězdičková jmenovka příslušnou částí hledaného jména a výsledný záznam se vloží do odpovědi. V opačném případě bude odpovědí chyba "neexistující doména". Podívejme se na pár příkladů.

Dotaz: Záznam MX pro www.tul.cz.

Odpověď: NoError, sekce Odpověď obsahuje

www.tul.cz. MX  0   mail.tul.cz.

Poptávané jméno neexistuje, nejbližší obsahující je tul.cz. Zdrojem syntém je *.tul.cz a pro něj existuje záznam typu MX. Dojde k aplikaci tohoto žolíkového záznamu, která povede k uvedené odpovědi.

Dotaz: Záznam A pro www.tul.cz.

Odpověď: NoError, sekce Odpověď je prázdná.

Zdraj syntézy je stejný jako v předchozím příkladě, ovšem neexistuje pro něj záznam typu A. Odpověď proto bude prázdná — jméno "existuje" (přesněji řečeno existuje žolíkový záznam, který je vytvoří), ale není pro něj k dispozici poptávaný typ záznamu.

Dotaz: Zázanm A pro www.obed.tul.cz.

Odpověď: NoError, sekce Odpověď je prázdná.

Zdrojem syntézy je opět *.tul.cz, pro který neexistuje záznam typu A. Na první pohled by se mohlo zdát, že zafunguje "přesnější" záznam www.*.tul.cz, ale pokud jste v textu výše nepřeskakovali, víte, že to není žolíkový záznam a nemůže se z něj cokoli generovat.

Dotaz: Záznam MX pro www.obed.tul.cz.

Odpověď: NoError, sekce Odpověď obsahuje

www.obed.tul.cz.    MX  0   mail.tul.cz.

Zdroj syntézy je stále stejný: *.tul.cz. Hvězdička tentokrát bude nahrazena dvojicí www.obed. Jelikož jedna hvězdička poskytuje libovolně dlouhý řetězec jmenovek, nemá valný smysl vkládat do zóny žolíkový záznam *.*.tul.cz. Druhá hvězdička v něm nefunguje jako žolík a na dotat z příkladu se nevztahuje.

Dotaz: Záznam MX pro cosi.tul.cz.

Odpověď: NoError, sekce Odpověď je prázdná.

Poptávané doménové jméno existuje, k uplatnění žolíkových záznamů prot vůbec nedojde (postupuje se podle bodu 3a). Jelikož pro cosi.tul.cz neexistuje záznam typu MX, odpověď bude prázdná. Žolíkovými záznamy nelze doplnit informaci pro všechny, jako například universální záznam MX pro celou doménu. Uplatní se jen pro neexistující jména.

Dotaz: Záznam MX pro muj.*.tul.cz.

*Odpověď: * NXdomain

Jelikož existuje doménové jméno *.tul.cz, je toto jméno nejbližším obsahujícím a pro dotazované jméno neexistuje zdroj syntézy. Tím by byl žolíkový záznam *.*.tul.cz, který však v zóně není. Odpovědí proto bude chyba "neexistující doména".

Žolíková jmenovka se může vyskytnout i v dotazu, jak jste viděli v posledním příkladu, jak jste viděli v posledním příkladu. V tom případě ale nepředstavuje obecný dotaz "pošli mi všechny záznamy", ale cílený dotaz "pošli mi tento žolíkový záznam". Zpracování odpovědi nevyžaduje žádné speciální kroky, vyhoví mu pouze záznam s žolíkovým jménem shodným se jménem v dotazu. Pokud by tedy v našem příkladu dorazil dotaz na záznam typu A pro *ns.tul.cz, odpovědí by byl chybový kód ohlašující neexistující doménu. Naopak dotaz pro záznam A pro www.*.tul.cz by skončil úspěšnou odpovědí:

www.*.tul.cz        CNAME   cosi.tul.cz.
cosi.tul.cz.        A       147.230.1.100

Dodejme, že žolíkové záznamy se v něm nijak neuplatnily, protože jméno www.*.tul.cz existuje.

Stejně tak nemá žolíkové jméno žádný speciální význam, pokud se objeví v datech záznamu. Server je prostě odešle beze změny tazateli. Tyto dva případy — dotaz obsahující hvězdičkovou jmenovku nebo její nepřítomnost v datové části záznamu — jsou jediné, kdy se hvězdička objeví v odpovědi. Dojde-li k použití žolíkového záznamu, je hvězdička z něj nahrazena tak, aby odpověď obsahovala poptávané jméno.

Tolik k principům fungování žolíkových záznamů. Jejich prostřednictvím lze opravovat překlepy v doménových jménech a například směrovat všechny WWW požadavky adresované neexistujícím strojům na centrální server. Takový přístup ale spíše nedoporučujeme. Dobrým příkladem může být pokus společnosti VeriSign zavést toto chování v doménách com a net. 15. září 2003 do nich vložila žolíkové záznamy, které zavedly návštěvníky neexistujících domén druhé úrovně na jejich servery. Tento krok vzbudil obrovskou nevoli a po necelých třech týdnech byl "dočasně odvolán". Vypadá to, že jednotkou dočasnosti bude u nás dobře známý 1 furt. Podrobně se dočtete na adrese:

Napravovat uživatelské či autorské chyby na straně DNS serveru je krajně problematické. Mají ošklivou tendenci kvasit pod povrchem a později vyhřeznout na povrch s horšími důsledky, než kdyby se hned na začátku opravily. Pokud nemáte velmi specifické potřeby, doporučujeme držet se od žolíkových záznamů co nejdál.

Vyrovnávací paměť

Vyrovnávací paměť hraje hlavní roli ve zvyšování efektivity DNS a zrychlování jeho odezev. Nejvýznamější jsou samozřejmě sdílené paměti poskytované lokálními rekurzivními servery v jednotlivých sítích, na nichž se schází místní klienti.

Každý záznam má přidělenou životnost (TTL, Time to Live) omezující dobu jeho možnosti uložení. V odpovědích se její hodnota přenáší jako počet sekund, které zbývají do vypršení doby platnosti daného záznamu. Po uložení do vyrovnávací paměti by měla být životnost každou sekundu snižována o jedničku a pokud tím dojde k jejímu vynulování, záznam se odstraní. V praxi servery řeší životnost záznamů zpravidla méně zatěžujícím způsobem, který nevyžaduje pravidelné průchody vyrovnávací pamětí. Například převodem na absolutní čas, který u každého uloženého záznamu říká, kdy jeho platnost vyprší.

Pokud server odesílá neautoritativní odpověď (tedy přeposílá dříve získané záznamy), přidělí jejím záznamům životnost, která jim podle aktuálního stavu vyrovnávací paměti zbývá. Pokud například posílá záznam, který získal před hodinou a tehdy měl životnost 4 hodiny, odešle je s tříhodinovou životností.

Nulovou životností lze zakázat uložení záznamů do vyrovnávací paměti. Dorazí-li odpověď s životností rovnou nule, znamená to, že je použitelná pouze pro dotaz, na nějž odpovídá. Příjemce si ho nesmí uložit do vyrovnávací paměti a používat pro jiné dotazy.

Postupem času se rozšířila praxe využívat do určité míry i prošlé záznamy. Stává se totiž, že autoritativní servery domény jsou po určitou dobu nedostupné, například když se staly cílem útoku. Dostane-li rekurzivní server dotaz, na který má uloženou odpověď s prošlou životností, musí se obrátit na autoritativní servery příslušné domény a pokusit se ji zaktualizovat. Pokud vše proběhne normálně, uloží si nově získanou odpověď s novou životností a pokračuje jako obvykle.

Jestliže ale žádná odpověď nedorazí, může tazateli poslat novou uloženou odpověď s prošlou životností podle hesla "lepší prošlá než žádná". Pravděpodobnost, že se v datech nic nezměnilo a odpověď stále platí, je poměrně vysoká. Nastaví jí nenulové, ale krátké TTL (doporučeno je 30 s). Současné implementace DNS serverů většinou umožňují takové chování nastavit. Oficiálně je připustilo RFC 8767 Serving Stale Data to Improve DNS Resiliency.

Skutečnost, že záznamy se posílají v sadách, ale životnost má každý z nich vlastní, otevírá prostor pro určité nesrovnalosti. Co když dorazí pro hledané jméno tři záznamy typu A s různou životností? To by znamenalo, že některé vyprší dříve s do vypršení zbývajících by vyrovnávací paměť poskytovala nekompletní informace — jedne nebo dva záznamy ze tří existujících. Mechanismy DNS se proti vzniku těchto nekonzistencí brání dvěma požadavky:

  • životnost všech záznamů v sadě musí být stejná. Pokud vytvoříte sadu s odlišnými hodnotami TTL, vaše data jsou chybná. Měnit životnost je třeba u všech sady stejně.

  • Když klient obdrží sadu záznamů s různými TTL od autoritativního serveru, změní si jejich životnosti na nejmenší z hodnot. Jestliže takto nekonzistentní odpověď dostal od neautoritativného serveru a má k dispozici alternativu, měl by odpověd ignorovat a získat ji z jiného zdroje. Není-li alternativa k dispozici, zkrátí životnost jako u autoritativní odpovědi.

Zajímavou kapitolou představuje také ukládání záporných odpovědí — tedy chyb ohlašujících neexistující doménu nebo prázdných odpovědí, které znamenají nepřítomnost požadovaného typu záznamu. RFC 1034 zavedlo toto chování jako nepovinné, navíc s omezením, že záporné dopovědi slouží jen pro vlastní potřebu, ale nelze je neautoritativně posílat dál. Praxe však ukázala, že ukládání a přeposílání záporných odpovědí citelně přispívá ke zrychlení činnosti DNS. Proto v roce 1998 vyšlo RFC 2308 Negative Caching of DNS Queries (DNS NCACHE) s novou definicí tohoto mechanismu.

Podle něj se negativní odpovědi ukládají do vyrovnávací paměti stejně jako odpovědi kladné a stejně se přeposílají dál. Je tu však drobný zádrhel s životností. Záporná odpověď nemá v sekci Odpověď žádný záznam, který by určoval, jak dlouho ji uložit. Problém se řeší obchvatem. Když autoritativní server posílá zápornou odpověď, musí do sekce Autorita vložit záznam typu SOA pro odpovídající zónu. Právě životnost tohoto záznamu bude použita jako životnost záporné dopovědi ve vyrovnávací paměti. Teké při přeposílání záporné odpovědi z vyrovnávací paměti odesílající server musí přibalit uložený záznam SOA s příslušně upravenou hodnotou TTL. U záporných odpovědí, jež nejsou doprovázeny záznamem SOA, nelze určit životnost, protby neměly být ukládány.

K dalšímu upřesnění pravidel ohledně negativních odpovědí došlo v RFC 8020 NXDOMAIN: There Really Is Nothing Underneath. Zdůrazňuje se v něm, že je třeba rozlišovat prázdné odpovědi (s výsledkovým kódem NoError a prázdnou sekcí Odpověď) a odpovědi s výsledkovým kódem NXDoomain, které oznamují neexistenci daného jména a čehokoli pod ním.

Prázdná odpověď znamená, že doménové jméno existuje, ale DNS pro ně neobsahuje záznam poptávaného typu. Možná pro ně dokonce neexistuje vůbec žádný zdrojový záznam, ale existuje nějaký jeho potomek. Prázdné odpovědi se ukládají do vyrovnávací paměti s výše uvedenou životností a dále se s nimi zachází stejně jako s uloženými pozitivními odpověďmi.

Odpověď NXDomain naproti tomu signalizuje neexistenci daného uzlu i čehokoliv pod ním v doménovém stromě. RFC 8020 doporučuje tyto negativní odpovědi ukládat do vyrovnávací paměti aposílat v odpovědích, kdykoli dorazí dotaz na jméno z podstromu jimi začínajícího. Pokud je například z dřívějšího řešení uložena ve vyrovnávací paměti odpověď NXDomain pro cosi.tul.cz a rekurzivní server dostane dotaz na záznamy typu A pro www.kdesi.cosi.tul.cz, nebude se nikde na nic ptát a rovnou odpoví, že doménové jméno neexistuje (NXDomain).

Ještě intenzivněji se s informací o chybějících záznamech může pracovat, pokud je doména podepsána pomocí DNSSEC. Pak totiž tazatel dostane elektronicky podepsanou informaci o tom, jaké typy záznamů existují pro poptávané jméno a rozsah jmen, mezi nimiž žádné jiné není. Tyto údaje může po dobu jejich životnosti využívat a generovat z nich záporné odpovědi.

DNS z pohledu klienta

V předchozí části jsme představili DNS klienta neboli resolver. Uvedli jsme, že jednoduchý resolver je součástí operačního systému a místním aplikacím nabízí své služby v podobě API. Uživatel s ním přichází do styku jen nepřímo, prostřednictvím síťových aplikací. Většina oparačních systémů nabízí nástroje, jimiž můžete s resolverem komunikovat a zjišťovat, jaké informace obsahuje DNS z pohledu daného počítače. Tyto služby oceníte především při testování a hledání problémů. Klasickými představiteli programů pro přístup k resolveru jsou host, nslookup a dig. [1] Pokud vám některý mimořádně přiroste k srdci, můžete mít na kterémkoliv z běžných operačních systémů libovolný z nich. Jejich přítomnost ve výchozí konfiguraci shrnuje následující tabulka:

Tabulka 5. Programy pro dotazování DNS
host nslookup dig

MS Windows

*

Linux

*

*

*

MacOS X

*

*

*

Podrobněji se jim budeme věnovat v následujících částech této kapitoly. Jednoduchý způsob použití zda DNS funguje, mají ovšem všechny společný. Jednoduše napíšete na příkazový řádek název některého z programů a jako parametr uvedete jméno, k němuž má nalézt IP adresu. Například

nslookup www.nic.cz

Pokud je vše v pořádku, dostanete odpověď s příslušnou IP adresou. Její tvar a především množství poskytnutých informací závisí na použitém programu. nslookup v našem případě poskytuje představuje zlatou střední cestu a měl by zobrazit zhruba následující výstup:

Server:		127.0.0.53
Address:	127.0.0.53#53

Non-authoritative answer:
Name:	www.nic.cz
Address: 217.31.205.50
Name:	www.nic.cz
Address: 2001:1488:0:3::2

Stručně řečeno: odpověděl neautoritativní server 127.0.0.53 a hledaná IP adresa je 217.31.205.50 ve verzi 4 a 2001:1488:0:3::2 ve verzi 6. Možnosti všech tří zmiňovaných programů jsou pochopitelně mnohem větší a zanedlouho se jimi budeme podrobně zabývat. Nejprve se ale podívejme, jak se DNS klient konfiguruje, protože žádný z uvedených programů nebude rozumně fungovat, pokud nejsou nastaveny základní parametry ovlivňující jeho činnost.

Konfigurace

Jednotlivé resolvery se pochopitelně významně liší v závislosti na operačním systému (či obecné platformě, protože DNS klienta obsahují i hardwarová zařízení) a velmi se liší i způsoby jejich konfigurace. Ta může obsahovat různé jemnůstky [2], důležité jsou však dva údaje:

  • Místní rekurzivní server (či několik serverů). Na něj se má resolver obracet se svými dotazy. Tato informace je životně důležitá — pokud klient nemá k dispozici žádnou adresu DNS serveru, nemůže fungovat a nedokáže nic najít.

  • Doménu (nebo několik domén) k prohledávání. Díky ní klient usnadňuje uživateli život, protože může zadávat nekompletní (relativní) jména a resolver za ně automaticky doplní tuto doménu. Jak konkrétně se chová je poměrně komplikovaná otázka a budeme se jí věnovat dále.
    Pokud mu zadáte několik domén k prohledávání, bude postupně zkoušet jednu po druhé. Není vhodné nastavovat mu jich mnoho, protože tím zpomalíte odezvy resolveru a budete DNS zbytečně zatěžovat. Obvykle se nastavuje místní doména, takže například počítače na Technické univerzitě v Liberci mají nastaveno, aby prohledávaly tul.cz.

Dobrou zprávou je, že pokud je stroj konfigurován automaticky protokolem DHCP, zpravidla jeho konfigurace zahrnuje i DNS. Většinou tedy nemusíte nad ničím příliš hloubat a DNS jednoduše funguje oblíbeným způsobem plug and play. Informace zde uvedené vám v takovém případě poslouží ke kontrole, jak je systém ve vašem případě nastaven.

Podívejme se teď, jak si prohlédnout, případně změnit konfiguraci DNS resolveru v nejznámějších operačních systémech.

Microsoft Windows 11

Ve Windows 11 Microsoft docela významně změnil uživatelské rozhraní pro konfiguraci systému. Je teď hezčí, jednodušší a přinejmenším v oblasti síťových parametrů i logičtější. Nastavení DNS je součástí konfigurace sítě, z panelu Start proto zvolte Nastavení, v něm Síť a internet a z tabulky síťových připojení vyberte to, jehož parametr hodláte upravovat.

Síťové parametry připojení ve Windows 11

network w11

Zobrazí se rozsáhlý dialog, obsahující informace o konfiguraci daného rozhraní. Ukázku vidíte na obrázku. Pro DNS jsou zásadní adresy serverů (položka Servery DNS IPv4 a Servery DNS IPv6, anglicky IPv4 DNS servers a IPv6 DNS servers) a přípona, kterou má přidávat k neúplným doménovým jménům (Primární přípona DNS, anglicky DNS suffix search list)_

Chcete-li jejich hodnoty změnit, použijte tlačítko Upravit (Edit) u položky Přiřazení serveru DNS (DNS server assignment) v horní části dialogu. Vy výchozím stavu zde najdete hodnotu Automaticky (DHCP), která znamená, že systém nastavuje konfiguraci DNS podle údajů získaných automatickým konfiguračním protokolem DHCP, stejně jako ostatní síťové parametry. To je dnes standardní způsob a nemáte-li k tomu vážné důvody, doporučujeme jej ponechat.

Pokud důvody máte, přepněte na přiřazování DNS serverů na Ruční. Dialog se rozšíří do podoby, kterou vidíte na dalším obrázku. Konfiguruje se odděleně IPv4 a IPv6. U každého z protokolů je třeba samostatně zapnout ruční konfiguraci a následně nastavit adresy jednoho až dvou serverů, na které se má váš stroj obracet se svými dotazy. Můžete si také vybrat, jestli má komunikaci s jednotlivými servery šifrovat nebo ne. Používá se protokol DNS over HTTPS.

Ruční nastavení DNS ve Windows 11

w11 manual dns

Veřejně dostupné rekurzivní nameservery dostupné na IPv4 adresách 8.8.8.8 nebo 8.8.4.4 vás mohou spasit, pokud je místní lokální rekurzivní server rozbitý. IPv6 se adresy již tak dobře nepamatují: 2001:4860:4860::8888 2001:4860:4860::8844. Tyto servery provozuje Google.
Nebo se dají použít servery: 76.76.2.0 a 76.76.10.0 (Control D),
9.9.9.9 a 149.112.112.112 (Quad9),
1.1.1.1 a 1.0.0.1 (Cloudflare) nebo
208.67.222.222 a 208.67.220.220 (OpenDNS Home).
Podrobněji o veřejných DNS serverech naleznete na Lifewire: The Best Free and Public DNS Servers (December 2023)

Kromě popsaného způsobu máte k dispozici i starší variantu nastavení, která sice není tak hezká, ale umí toho o něco více. Například nastavit více než dva dotazované servery nebo příponu přidávanou k neúplným jménům. Budete ji potřebovat spíše ve vzácných případech. Pokud k tomu dojde, otevřete Ovládací panely, v nich Síť a internet, dále centrum síťových připojení a sdílení a v levém menu Změnit nastavení adaptéru. Vyberte adaptér, klepněte na tlačítko Vlastnosti a ividíte okno velmi podobé tomu na obrázku. Dále pak postupujte jako u Windows 10.

Jednoduchý vestavěný resolver si udržuje vyrovnávací paměť, aby zbytečně neopakoval své dotazy. Dokumentace pro ni používá pojem "mezipaměť DNS". Její Aktuální obsah lze zobrazit z příkazového řádku pomocí:

ipconfig /displaydns

Pokud ji z jakéhokoli důvodu chcete vymazat, použijte:

ipconfig /flushdns

Vymazat se dá jen celý obsah, nikoli konkrétní záznamy. Vzhledem k tomu, že takové operace je potřebná opravdu vzácně a že absence údaje ve vyrovnávací paměti znamená jen to, že se klient obrátí na lokální rekurzivní server s jeho společnou vyrovnávací pamětí není toto omezení nijak bolestivé.

Pokud se chcete z jakéhokoliv důvodu obejít bez lokální vyrovnávací paměti pro DNS, sáhněte po příkazu:

net stop dnscache

který ji vypně. Později ji můžete opět aktivovat pomocí:

net start dnscache

Microsoft Windows 10, 8 a 7

Nastavení DNS klienta v operačnícj systémech MS Windows 10, 8 a 7 je prakticky totožné. Liší se jen vzhled konfiguračních dialogů, a to ještě nijak dramaticky. Proto všechny tři systémy popíšeme ve společné kapitole, ukázky konfiguračních obrazovek pocházejí z Windows 10, v ostatních se liší jen drobnosti.

Pro rychlou kontrolu aktuálního nastavení DNS klienta zadejte na příkazovém řádku:

ipconfig -all

Výpis vypadá asi takto (pro větší přehlednost jsme jej poněkud zkrátili a u pravili formátování):

Windows IP Configuration

   Host Name . . . . . . . . . . . . : DESKTOP-5A8VJPS
   Primary Dns Suffix  . . . . . . . :
   Node Type . . . . . . . . . . . . : Hybrid
   IP Routing Enabled. . . . . . . . : No
   WINS Proxy Enabled. . . . . . . . : No
   DNS Suffix Search List. . . . . . : chorche.net                                      (1)

Ethernet adapter Ethernet:

   Connection-specific DNS Suffix  . : chorche.net
   Description . . . . . . . . . . . : Intel(R) Ethernet Connection (3) I218-LM
   Physical Address. . . . . . . . . : 20-47-47-DB-76-5E
   DHCP Enabled. . . . . . . . . . . : Yes
   Autoconfiguration Enabled . . . . : Yes
   IPv6 Address. . . . . . . . . . . : 2a0e:5340:4:1:94bf:81f8:2fe:9f42(Preferred)
   Temporary IPv6 Address. . . . . . : 2a0e:5340:4:1:395e:3ed3:bfd:51c2(Preferred)
   Link-local IPv6 Address . . . . . : fe80::e5f8:9de1:2375:3f82%10(Preferred)
   IPv4 Address. . . . . . . . . . . : 192.168.120.195(Preferred)
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Lease Obtained. . . . . . . . . . : neděle 10. prosince 2023 22:16:40
   Lease Expires . . . . . . . . . . : neděle 10. prosince 2023 23:16:41
   Default Gateway . . . . . . . . . : fe80::76d4:35ff:fe84:e5e3%10
                                       192.168.120.1
   DHCP Server . . . . . . . . . . . : 192.168.120.1
   DHCPv6 IAID . . . . . . . . . . . : 102778695
   DHCPv6 Client DUID. . . . . . . . : 00-01-00-01-2A-F4-32-0D-20-47-47-DB-76-5E
   DNS Servers . . . . . . . . . . . : 192.168.120.1                                 (2)
                                       2a0e:5340:4:1::1                              (3)
   Primary WINS Server . . . . . . . : 192.168.120.17
   NetBIOS over Tcpip. . . . . . . . : Enabled
   Connection-specific DNS Suffix Search List :
                                       chorche.net
1 Prohledávací seznam přípon
2 IPv4 adresa rekurzivního nameserveru v lokální síti.
3 IPv6 adresa rekurzivního nameserveru v lokální síti.

Obsahuje nejprve společnou sekci s parametry platnými pro všechna síťová připojení. V ní je důležitý seznam prohledávaných domén (Prohledávací seznam přípon DNS — DNS Suffix Search List) — tato doménová jména bude systém zkoušet přidávat k relativně zadaným jménům, pokud neuspěje při hledání samotného jména. Oslovované servery pak najdete u jednotlivých síťových rozhraní. Vyhledejte tedy část odpovídající používanému síťovému připojení a v ní by měla být obsažena aspoň jedna hodnota pro Servery DNS (DNS Servers). V našem případě najdete ke konci údajů rozhraní Ethernet adapter (Připojení k místní síti) dvojici adres reprezentující IPv4 a IPv6 adresy dvou lokálních rekurzivních serverů.

Pokub byste rádi konfiguraci změnili, použijte ovládací panel síťových připojení. Nejjednodušší cestou k němu je nechat si vyhledat panel Zobrazit síťová připojení. Pokud se k němu chcet raději proklikat, cesty se poněkud liší.

Ve Windows 10 otevřete Nastavení, v něm Síť a Internet. Dále vyberte v levé části okna Wi-Fi nebo Ethernet a následně v pravé části Změnit možnosti adaptéru.

Nastavení resolveru ve Windows 10 (IPv4)

w10 dns settings ipv4

Nastavení resolveru ve Windows 10 (IPv6)

w10 dns settings ipv6

Dále je postu pro všechny verze stejný. V ovládacím panelu najděte připojení k místní síti a otevřete si jeho Vlastnosti. V seznamu využívaných položek vyhledejte Protokol IP verze 4 (TCP/IPv4) nebo Protokol IP verze 6 (TCP/IPv6) a opět otevřte jeho vlastnosti.

Nastavení DNS se věnuje spodní část dialogu. Implicitně je zapnuto automatické získání potřebných informací protokolem DHCP a s touto variantou ve většině případů vystačíte. Pokud ne, přepněte se na mauální konfiguraci (Použít následující adresy serverů DNS) a vyplňte IP adresy upřednostňovaného, případně i náhradního serveru. Úplnou kontrolu nad nastavením resolveru získáte, pokud stisknete tlačítko Upřesnit a v dialogu, který se otevře, přejdete na kartu DNS.

Pomocí tlačítek Přidat, Upravit a Odebrat můžete v horní částli libovolně měnit složení dotazovaných serverů. Jejich pořadí lze také jednotuše upravovat šipkami napravo od seznamu prohledávaných domén. Implicitně je nastavena na poměrně kryptickou variantu Připojit primární příponu DNS a příponu DNS specifickou pro připojení. Dané přípony najdete ve výpisu příkazu ipconfig zmiňovaného na začátku — primární příponu obsahuje úvodní společná část a u každého připojení pak najdete jeho specifickou příponu. Opět lze přepnou na ruční nastavení a prohledávané domény zadat podle libosti.

Ve spodní částu si všimněte položky Zaregistrovat adresy tohoto připojení v systému DNS. Určuje, zda se má systém snažit pomocí dynamických aktualizací zaregistrovat své jméno a adresu u primárního serveru. Obvykle se dynamické DNS nepoužívá, takže doporučujeme registraci vypnout.

Také starší verze Windows mají lokální vyrovnávací paměť. Pro práci s ní pomocí obvyklých příkazů ipconfig a net z příkazového řádku platí totéž, co pro Windows 11. Podrobnosti najdete v předchozí části.

Linux a systémy odvozené z Unixu

Zde je konfigurace resolveru uložena v souboru /etc/resolv.conf, kde si ji můžeme jak prohlížet, tak měnit. Stejně jako ostatní systémy, soudobé distribuce Linuxu obvykle využívají automatickou konfiguraci síťových parametrů protokolem DHCP, které mimo jiné vytvoří i soubor /etc/resolv.conf a naplní je odpovídajícími údaji. Každá konfigurační položka je v něm umístěna na samostatném řádku ve tvaru:

název_položky       hodnota

Těmi nejvýznamějšími jsou:

  • nameserver obsahuje IP adresu místního serveru, na který se má resolver obrace se svými dotazy. Pokud je serverů několik, uvádí se každý na samostatném řádku.

  • domain sděluje místní doménu daného stroje.

  • search určuje pořadí prohledávaných domén při neúplném zadání jména. V souboru se vyskytuje pouze jednou, prohledávané přípony prohledávaných jmen se v něm oddělují mezerami. Jestliže chybí, použije se přípona uvedená v domain.

Dostupných voleb existuje více, ale s jinou než některou z výše uvedených se pravděpodobně nikdy nesetkáte. Obsah /etc/resolv.conf může vypdat třeba takto:

domain tul.cz
search nti.tul.cz tul.cz
nameserver 147.230.22.1
nameserver 147.230.22.2

A to je vše. Víc v Linuxu a spřízněných systémech nebudete potřebovat. Konkrétní distribuce samozřejmě nabízejí různé grafické nadstavby, jimiž můžeme do /etc/resolv.conf zasahovat uživatelsky přítulným způsobem. Navzájem se ale dost liší a těžko můžeme na jednom místě popsat. Nahlédněte do dokumentace svého systému, obecně tyto vlastnosti obvykle nastavuje nástroj pro konfiguraci sítě.

Mějte na paměti, že pokud se síťové parametry nastavují pomocí DHCP, ruční změny souboru /etc/resolv.conf se při příštím použití DHCP přepíší. Způsob, jak jej změnit s trvalou platností, se může lišit podle konkrétní distribuce. Typicky bude vyžadovat úpravu konfiguračního souboru dhclient.conf, obvykle umístěného v adresáři /etc/dhcp.

Základní linuxový resolver neobsahuje vyrovnávací paměť. Pokud ji chcete svému systému dopřát, aby se při každém dotazu neobracel na lokální DNS server, spusťte na něm Name Server Cache Server (nscd). Jeho působnost je ve skutečnosti širší a kromě DNS poskytuje vyrovnávací paměť také pro další systémové mechanismy, jako jsou informace o uživatelích a skupinách.

Chování vyrovnávací paměti řídí konfigurační soubor nscd.conf, obvykle umístěný v adresáři /etc. Jeho nejčastěji používané řádky mají obecný tvar:

parametr    služba  hodnota

DNS se týkají ty, jejichž služba má hodnotu hosts. Mezi parametry je pochopitelně nejvýznamější enable-cache, který vyrovnávací paměť zapne či vypne. Lze řídit, jak dlouho mají mají být položky uchovávány (TTL v DNS záznamech se zde ignoruje), a to samozřejmě pro úspěšné (positive-time-to-live) a neúspěšné (negative-time-to-live) výsledky. Doporučejeme abyste také nechali server hlídat případné změny v souboru /etc/hosts, které mají na jeho činnost vliv. Sekce nscd.conf řídící vyrovnávací paměť pro jména počítačů by mohla vypadat třeba takto:

enable-cache            hosts   yes
positive-time-to-live   hosts   10800
negative-time-to-live   hosts   300
check-files             hosts   yes

Další dostupné parametry, jimiž lze například řídit počet vlákem programu, logovat jeho činnost a nařídit pravidelné restarty, najdete v manuálové stránce pro nscd.conf.

nscd není příliš komunikativní. Nedá se například vypsat aktuální obsah jeho vyrovnávací paměti, můžete jej pouze spustit s volbou -d (případně --debug) a sledovat, co dělá. Chcete-li, aby zahodil stávající obsah své paměti pro určitou službu a začal s čistým stolem, zavolejte jej s volbou -i služba. Jistotou pak samozřejmě je restart celého nscd.

Některé Linuxové distribuce používají program dnsmasq, obvykle ve spojení s NetworkManagerem, dnsmasq je takový brouk Pytlík mezi programy — nabízí jednoduchý server pro DNS, DHCP, TFTP, PXE či ohlašování směrovače, avšak v ničem příliš neoslňuje. Ostatně byl navržen především pro malé sítě a má běžet i na miniaturních počítačích. Přednost má proto nízká spotřeba zdrojů před bohatstvím funkcí.

My ponecháme ostatní služby stranou a budeme se dnsmasq věnovat pouze z pohledu DNS. Především je třeba konstatovat, že se nejedná o plnohodnotný resolver. DNS dotazy jednoduše přeposílá resolveru, který má nastaven ev své konfiguraci. V podstatě přidává pouze vyrovnávací paměť a umožňuje případné konfigurační extravagance, pokud je vaše prostředí nestandardní.

Jak poznat, zda váš systém dnsmasq používá? Spolehlivou cestou je podívat se, zda je připojen na standardní DNS port 53. Spusťte jako superuživatel (root):

# netstat -untap | grep udp | grep ':53 '
udp        0      0 192.168.122.1:53        0.0.0.0:*                 2101/dnsmasq
udp        0      0 127.0.0.53:53           0.0.0.0:*                 1134/systemd-resolv

Dalšími příznaky jsou server 127.0.0.1 v /etc/resolv.conf a přítomnost dnsmasq ve výpisu běžících programů. Napište jako normální uživatel:

$ ps axf | grep dnsmasq
   2101 ?        S      0:00 /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper   (1)
   2102 ?        S      0:00  \_ /usr/sbin/dnsmasq --conf-file=/var/lib/libvirt/dnsmasq/default.conf --leasefile-ro --dhcp-script=/usr/lib/libvirt/libvirt_leaseshelper
 145775 pts/1    S+     0:00  |   |           \_ grep --color=auto dnsmasq
1 Tady je běžící dnsmasq.

Pokud dojdete k závěru, že pro vás není přínosem a dávaté přednost čistému systémovému resolveru, můžete jej samozřejmě vypnout. Jelikož jej typicky spouští NetworkManager, znamená to zasáhnout do jeho konfiguračnímu souboru /etc/NetworkManager/NetworkManager.conf a vymazat z něj řádek

dns=dnsmasq

Ve zbytku této části budeme pozitivně předpokládat, že jste dnsmasq nechali běžet a podívame se na to, jak se dá ovlivňovat jeho činnost. Konfigurační soubor standardně najdete v /etc/dnsmasq.conf, ovšem pokud je volán NetworkManagerem, stěhuje se konfigurace do adresáře /etc/NetworkManager/dnsmasq.d. Veškeré konfigurační direktivy lze předat i na příkazovém řádku, v tom případě jejich jménu vždy předřaďte dvojici pomlček (např. --interface).

Má-li dnsmasq sloužit jen lokálnímu počítači, je záhodno omezit síťová rozhraní, na nichž naslouchá. Implicitně jsou to všechna, v tomto případě ale stací místní smyčka lo, protože má obsluhovat jenom místní programy. Omezení zajistí:

interface=lo

Druhým podstatným parametrem je vnitřní vyrovnávací paměť pro ukládané záznamy. Zadává se počet záznamů. Chcete-li zvýšit implicitních 150 záznamů řekněme na 500, vložte do konfigurace:

cache-size=500

Jak již bylo řečeno, musí spolupracovat s plnohodnotným resolverem, kterému přeposílá dotazy k řešení. Jeho adresu (a případně port oddělený znakem #) zadejte do direktivy server. Můžete jich uvést několik a můžete i určit, že na některé domény se má ptát konkrétních serverů. V tom případě doménu uveďte před adresou serveru uzavřenou do lomítek. Řekněme, že bychom chtěli obecně používat server 1.1.1.1, ale dotazy na doménu tul.cz a její poddomény má řešit server 10.0.0.1. Takové chování by zajistila dvojice direktiv:

server=/tul.cz/10.0.0.1
server=1.1.1.1

dnsmasq standardně načte soubor /etc/hosts a v něm má uvedená jména. Kromě toho může poskytovat i celou řadu dalších záznamů, které do jeho konfigurace vložíte pomocí host-record, mx-host, ptr-record a dalších. Pokud se máte rádi, raději se jim vyhněte. Prostředí prošpikované výjimkami tohoto typu se obtížně spravuje.

Potencionálně zajímavou vlastností dnsmasq je jeho schopnost ověřovat DNSSEC. Díky němu si můžete autentičnost informací v DNS ověřovat přímo na svém koncovém stroji, což je nejbezpečnější varianta. Tuto schopnost zapnete direktivou dnssec. Pro svou činnost potřebuje ještě veřejný klíč kořenové zóny, resp. otisk pro jeho ověření. Dodáte jej pomocí trust-anchor, jehož čárkami oddělované parametry postupně určují doménu, značku klíče, algoritmus, typ otisku a vlastní otisk. Příslušná část konfigurace by vypadala přibližně takto:

dnssec
trust-anchor=.,20326,8,2,E06D4...8EC8D

Nechcete-li ověřovat DNSSEC sami a necháte to za sebe dělat resolver, jejž dnsmasq využívá, vystačíte si s direktivou proxy-dnssec. Zajistí, že program bude aplikaci předávat informaci o tom, zda byla data resolverem ověřena (příznak AD).

macOS

macOS v principu patří mezi systémy odvozené z Unixu, nicméně vnitřní mechanismy DNS v něm doznaly nemalých změn. Soubor /etc/resolv.conf zde sice existuje, ale systémový resolver jej ignoruje. Chcete-li se podívat v textovém režimu na konfiguraci DNS, použijte:

scutil --dns

Systém samozřejmě nabízí i příjemný grafický obal, jehož prostřednictvím si můžete zobrazit nebo nastavit síťové parametry, včetně DNS. Dostanete se k němu, když v Nastavení systému vyberete Síť. Z nabídky existujících rozhraní si vyberte to pravé (pravděpodobně Ethernet nebo Wi-Fi) a zobrazí se aktuální nastavení.

Konfiguraci DNS najdete na kartě DNS. Jsou zde adresy místních rekurzivních serverů, na které se má obracet s dotazy a doménové přípony, které má případně přidávat za vyhledáváná jména. Síťové parametry se obvykle konfigurují automaticky pomocí DHCP. Takto získanými údaji je nastavení předvyplněno. Pomocí tlačítek + a - ve spodní části dialogu můžete přidávat a odebírat další položky. Pokud vám automatické nastavování nevyhovuje, můžete na kartě TCP/IP přepnout způsob konfigurace z Pomocí DHCP na Ručně a následně zadat síťové parametry podle libosti.

Obvykle byste ale neměli nic takového potřebovat, protože automatické nastavení protokolem DHCP poskytne hodnoty platné pro místní síť. Valná většina počítačů potřebuje právě tohle.

Systém obsahuje lokální vyrovnávací paměť, která urychluje DNS operace. Přístup k ní řídí démon lookupd a kromě DNS zahrnuje do své péče i různé další informace, jako jsou informace o uživatelích a tiskárnách a podobně. Z pohledu DNS je asi nejpodstatnější službou možnost vymazat obsah vyrovnávací paměti pomocí:

lookupd -flushcache

Pokud by vás zajímaly statistické údaje o využívání vyrovnávací paměti, sáhněte po:

lookupd -statistics

iOS

Nastavení klienta DNS v iOS je podobné jako u Windows, najdeme Nastavení celého přístroje, v něm Wi-Fi a v něm příslušnou síťovou kartu (ethernetové karty s RJ-45 koncovkou tablet s iOS nemá).[3] Ťukneme u Wi-Fi karty na modré písmeno i v kolečku (i jako informace).

Nastavení DNS v iOS — výběr síťové karty

ios dns settings1

Objeví se dialog s nastavením IP adres pro obě verze protokolu IP a ťuknutím na Nakonfigurovat DNS můžeme upravit místní resolver.

Nastavení DNS v iOS — nastavení IPv4, IPv6 a DNS

ios dns settings3

V sekci Nakonfigurovat DNS pak máme k dispozici změnu z Automaticky na Ručně, modrá fajfka označuje naše aktuální nastavení. Pokud ji přepneme na Ručně můžeme pak měnit rekursivní resolvery a přípony domén k prohledávání.

Nastavení DNS v iOS - nastavení DNS serverů

ios dns settings2

Programy pro dotazování DNS

V druhé části této kapitoly se podrobněji podíváme na nejznámější programy, které uživateli umožňují klást DNS dotazy a zobrazovat zjištěné výsledky.

host

Program host je z nástrojů pro zkoumání nejstarší a nejvíce se snaží myslet za vás. Díky tomu jsou jeho výstupy nejsnadněji stravitelné pro laického uživatele. Použijete jej v základním tvaru:

$ host nic.cz

dostanete následující odpověď:

nic.cz has address 217.31.205.50
nic.cz has IPv6 address 2001:1488:0:3::2
nic.cz mail is handled by 10 mail.nic.cz.
nic.cz mail is handled by 20 mx.nic.cz.

Obsahuje jen to nejpodstatnější. Iniciativně obstará kromě obvyklé IPv4 adresy (záznam typu A) i adresu IPv6 (záznam AAAA) a informace pro odesílání pošty (záznam MX). Výsledek zobrazí ve zcela minimalistické formě. Nedozvíte se, zda je odpověď autoritativní, ani od kterého serveru pochází. Pokud chcete podrobnosti, použijte na příkazovém řádku volbu -v (verbose) nebo -d (debug). Účinek obou je stejný, zobrazí se kompletní informace o datech získaných z DNS:

$ host -v nic.cz
Trying "nic.cz"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40727
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;nic.cz.				IN	A

;; ANSWER SECTION:
nic.cz.			1800	IN	A	217.31.205.50

Received 40 bytes from 127.0.0.53#53 in 32 ms
Trying "nic.cz"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40348
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;nic.cz.				IN	AAAA

;; ANSWER SECTION:
nic.cz.			974	IN	AAAA	2001:1488:0:3::2

Received 52 bytes from 127.0.0.53#53 in 0 ms
Trying "nic.cz"
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 22857
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;nic.cz.				IN	MX

;; ANSWER SECTION:
nic.cz.			974	IN	MX	20 mx.nic.cz.
nic.cz.			974	IN	MX	10 mail.nic.cz.

Received 64 bytes from 127.0.0.53#53 in 0 ms

Všímněte si, že pokládá tři dotazy — poptává standardně záznam A, AAAA a MX. Každý z nich má ve výstupu svou samostatnou část, která začíná textem "Trying" a končí statistikou — kolik bajtů, od kterého serveru a za jak dlouho váš klient obržel odpověď. Konkrétní dotaz je uveden v QUESTION SECTION, jádro odpovědi pak obsahuje ANSWER SECTION. Doplňující informace jsou uvedeny v AUTHORITY SECTION a ADDITIONAL SECTION. Ještě upovídanější výstup obstará volba -a, která také nic neskrývá a navíc pro zadané jméno všechny typy záznamů. Chcete-li se dozvědět vše o www.nic.cz použijte:

$ host -a www.nic.cz

Stejně přirozeně se host chová pro reverzní dotazy. Jednoduše mu zadejte jako parametr IP adresu (podporuje IPv4 a IPv6) a dozvíte se, na jaké jméno vede:

$ host 217.31.205.50
50.205.31.217.in-addr.arpa domain name pointer www.nic.cz.

Pokud si chcete dupnout a získat jen určitý typ záznamů, použijte volbu -t typ. Díky ní lzenapřiklad zjišťovat jen IPv4 adresu (ale upřímně řečeno host pravděpodobně stihne dotazy na AAAA a MX dříve, než napíšete -t A), častěji se ovšem používá, pokud vás zajímá jiný než jeden ze standardně poptávaných typů. Například:

$ host -t NS nic.cz

vydá:

nic.cz name server a.ns.nic.cz.
nic.cz name server b.ns.nic.cz.
nic.cz name server d.ns.nic.cz.

Kromě typu dotazů lze omezovat i koho a jak se ptát, host standardně používá jak IPv4 tak IPv6, které vybírá automaticky podle adresy dotazovaného serveru a síťové politiky daného stroje. Volbou -4 (případně -6) mu nařídíte, aby se držel pouze IPv4 (resp. IPv6). Daleko obvyklejší je ale potřeba směřovat dotaz na určitý konkrétní server, abyste zjistili, co si o obsahu DNS myslí. V takovém případě jednoduše připojte na konec příkazu jméno či adresu serveru, jemuž má být dotaz odeslán. Pokud se zeptáme na adresu www.nic.cz přímo jednoho z autoritativních serverů pro nic.cz:

$ host www.nic.cz a.ns.nic.cz

může odpověď vypadat třeba následovně:

Using domain server:
Name: a.ns.nic.cz
Address: 2001:678:f::1#53
Aliases:

www.nic.cz has address 217.31.205.50
www.nic.cz has IPv6 address 2001:1488:0:3::2

Ze zobrazené adresy osloveného serveru vidíte, že host použil pro svůj dotaz protokol IPv6. Volbou -r lze serveru zakázat rekurzi. Ovšem pokud není autoritativní, znamená to, že program nezobrazí jako výsledek nic, protože záznamy typu NS, které klient v takovém případě dostane, standardně nezobrazuje. Je proto záhodno kombinovat -r s některou z voleb pro kompletní výstup -v nebo -d.

Každý, kdo někdy řešil problém s nekonzistencí mezi autoritativné servery pro stejnou doménu, ocení volbu -C. Díky ní host projde všechny autoritativné servery zadané domény a zobrazí záznamy SOA, které od mich získá. Tak lze snadno a rychle získat přehled, zda všechny servery mají stejnou verzi zónového souboru. Tato volba má pochopitleně smysl je v kombinaci se jménem domény, nikoli koncového stroje. Podíváte-li se tímto způsobem na doménu nic.cz

$ host -C nic.cz

uvidíte následující:

Nameserver 194.0.12.1:
	nic.cz has SOA record a.ns.nic.cz. hostmaster.nic.cz. 1702544428 14400 3600 1209600 7200
Nameserver 2001:678:1::1:
	nic.cz has SOA record a.ns.nic.cz. hostmaster.nic.cz. 1702544428 14400 3600 1209600 7200
Nameserver 2001:678:f::1:
	nic.cz has SOA record a.ns.nic.cz. hostmaster.nic.cz. 1702544428 14400 3600 1209600 7200
Nameserver 193.29.206.1:
	nic.cz has SOA record a.ns.nic.cz. hostmaster.nic.cz. 1702544428 14400 3600 1209600 7200
Nameserver 194.0.13.1:
	nic.cz has SOA record a.ns.nic.cz. hostmaster.nic.cz. 1702544428 14400 3600 1209600 7200
Nameserver 2001:678:10::1:
	nic.cz has SOA record a.ns.nic.cz. hostmaster.nic.cz. 1702544428 14400 3600 1209600 7200

Správce domény ocení také volbu -l, která požádá o transfer celé domény a vypíše její kompletní obsah. Standardně vypisuje záznamy typu NS, A, AAAA, a PTR. V kombinaci s volbou -a zobrazí skutečně vše. Ovšem zdaleka ne každý server takovému požadavku vyhoví, zpravidla skončíte s chybovým hlášením "Transfer failed".

Pokud se vám host zalíbí a teskníte, že chybí v MS Windows, nezoufejte. Jedná se o otevřený program a můžete si jej snadno pořídit. Je součástí ditribuce serveru BIND, stejně jako později popsaný dig. U něj také najdete popis, jak jej nainstalovat do MS Windows. Pro host platí totéž.

nslookup

Program nslookup dlouhá léta sloužil jako standardní nástroj pro zkoumání DNS a v operačních systémech firmy Microsoft to platí dodnes. V Linuxu a příbuzných systémech se místo něj doporučuje používat dig. Výsledkem je nemalá roztříštěnost — někde jej najdete v původní formě, jinde zcela chybí a dalšísystémy jej sice obsahují, ovšem v upravené či pozměněné podobě.

Programu je vyčítáno, že používá svého vlastního DNS klienta a obchází systémový resolver, jeho výstupy proto nemusí být konzistentní s tím, co dostanou od systému ostatní programy. Neumožňuje získat kompletní informace z odpovědi a navíc existuje v řadě různě upravených verzí, které se liší právě způsobem zpracování výstupů. To vše problematizuje jeho použití jako diagnostického nástroje. Nicméně vzhledem k tomu, že MS Windows v základní instalaci nic jiného nenabízejí, dost dobře nemůžeme tento program přeskočit.

Interaktivní režim

Do interaktivního režimu vstoupíte, když program nslookup spustíte bez parametrů. Spustí se cosi jako interpret DNS, ketrý zobrazí svou výzvu v podobě většítka a čeká na vaše příkazy:

> nic.cz

Odpovědí bude výsledek dotazu, v tomto případě:

Server:         147.230.36.140
Address:        147.230.36.140#53

Non-authoritative answer:
Name:   nic.cz
Address: 217.31.205.50
Name:   nic.cz
Address: 2001:1488:0:3::2

a okamžitě následuje výzva programu, který očekává váš další příkaz. Porovnáte-li výstup s předchozím příkazem host, jsou na první pohled zřetelně dva rozdíly: nslookup poptává jen záznamy typu A a AAAA (to lze samozřejmě změnit, jak uvidíte zanedlouho) a zobrazuje více informací o odpovědi — od koho ji získat a zda je autoritativní. Zcela přirozeně a bezproblémově program vyřeší i reverzní dotaz, jednoduše mu zadejte IP adresu (podporuje obě verze internetového protokolu):

> 217.31.205.50
Server:         147.230.36.140
Address:        147.230.36.140#53

non-autoritative answer:
50.205.31.217.in-addr.arpa      name = www.nic.cz

Až vás dotazování omrzí, ukončete program příkazem exit. Nebo se zahloubejte do jeho rozšířených možností. V takovém případě doporučujeme vaší pozornosti příkaz help (nebo kratší ?), který vám podá stručný přehled vašich možností. Pokud se chcete ptát určitého konkrétního serveru, použijte příkaz server a jako argument mu zadejte jméno nebo IP adresu cílového serveru. Informace o nic.cz přímo od autoritativního serveru c.ns.nic.cz bychom získali pomocí:

> server a.ns.nic.cz
Default server: a.ns.nic.cz
Address:  2001:678:f::1#53
Default server: a.ns.nic.cz
Address: 194.0.12.1#53

> nic.cz
Server:         a.ns.nic.cz
Address:        2001:678:f::1#53

Name:   nic.cz
Address: 217.31.205.50
Name:   nic.cz
Address: 2001:1488:0:3::2

Příkaz server funguje jako přepínač — od okamžiku jeho použití bude nslookup oslovovat zadaný server, dokud jej znovu nezměníte. Existuje i varianta lserver, která má stejný účinek. Liší se tím, že ke zjistění adresy požadovaného serveru (v našem případě k převodu c.ns.nic.cz na IP adresu) použije výchozí server podle konfigurace systému, zatímco příkaz server používá aktuální server nastavený v nslookup. lserver poskytuje "krabičku poslední záchrany" pro situace, kdy nevhodně nastavený server způsobí, že program nic nenachází.

Poměrně často často se potřebujete zeptat na určitý typ záznamu. V interaktivném režimu to znamená přepnout nastavení programu pomocí set type=typ. Stejný účinek má set query=typ, jedná se o jiné jméno téhož příkazu. Název volby lze zkrátit na set ty= resp. na set q=. INformace o poštovních serverech získáme pomocí:

> set q=mx
> nic.cz
Server:         a.ns.nic.cz
Address:        2001:678:f::1#53

nic.cz  mail exchanger = 10 mail.nic.cz
nic.cz  mail exchanger = 20 mx.nic.cz

Změna typu poptávaných záznamů opět platí pro všechny následující dotazy, dokud jí dalším použítím příkazu set nenastavíte jinou hodnotu. Chcete-li vědět úplně všechno, vsaďte na set q=any. set slouží obecně k nastavení celé řady parametrů ovlivňujících obsah dotazů i prezentaci dorazivších odpovědí. Pro zkoumání detailů vnitřního života DNS se hodí set debug, který poskytuje podrobnější a lépe strukturované informace o obsahu dotazů a odpovědí, a set d2, díky němuž vidíte i jaké operace nslookup interně provádí. V obou případech se jedná o přepínače, které můžete později vypnout předřezením no jejich jménu (např. set nodebug). Velice užitečný je příkaz set all, který zobrazí aktuální nastavení programu a všech jeho voleb.

Také nslookup dokáže požádat server o kompletní doménu a zobrazit celý její obsah. Slouží k tomu příkaz ls doména, ale obvakle očekávejte, že jen málokterý server vám bude ochoten odpovědět.

Režim příkazového řádku

Pro jednorázové dotazy můžete nslookup používat v příkazovém režimu, kdy mu vše potřebné sdělíte pomocí parametrů na příkazovém řádku. V nejjednodušším případě prostě zadáte hledané jméno či IP adresu a program sdělí, co našel. Pro jména vyhledává záznamy typu A, pro adresy (podporuje IPv4 i IPv6) záznamy typu PTR:

nslookup nic.cz

zobrazí:

Server:         147.230.36.140
Address:        147.230.36.140#53

Non-authoritative answer:
Name:   nic.cz
Address: 217.31.205.50

Dotaz lze adresovat konkrétnímu serveru, pokud jeho adresu či jméno uvedete za hledaným řetězcem jako poslední parametr. Stejný dotaz, ovšem adresovaný serveru c.ns.nic.cz, by vypadal takto:

nslookup nic.cz c.ns.nic.cz

Volby, jimiž lze v interaktivním režimu ovlivňovat chování programu, jsou k dispozici i pro řádkový řežim. Před jménem volby uveďte na příkazovém řádku pomlčku a pokud ji chcete přiřadit nějakou hodnotu, připojte ji za název volby oddělenou rovnítkem. Nejčastěji používanou volbou bude nepochybně typ dotazovaného záznamu, který zadáte prostřednictvím -querytype či -type. Zkratky tentokrát bohužel nejsou k mání. Poštovní servery pro nic.cz zjistíte dotazem:

nslookup -type=mx nic.cz

dig

Poněkud nezvyklý název vznikl z počátečních písmen plného jména, jež zní Domain Information Groper. Ze základních programů pro zjišťování obsahu DNS je nejmladší a má nejblíže k označení profesionální nástroj. To znamená, že autoři se snažili, aby dával přesné a vyčerpávající odpovědi, ve kterých naleznete úplně všechno, ale že se od uživatele předpokládají určité znalosti a program se nesnaží být přítulný nebo myslet za vás. Laik si práci s ním příliš neužije, už jen kvůli tomu, že výstupy jsou dost obsáhlé. To lze snadno demonstrovat jednoduchým dotazem:

$ dig nic.cz

který se odvděčí násleující myriádovou informací:

; <<>> DiG 9.16.1-Ubuntu <<>> nic.cz
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36861
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;nic.cz.				IN	A

;; ANSWER SECTION:
nic.cz.			1800	IN	A	217.31.205.50

;; Query time: 24 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: So pro 23 02:02:47 CET 2023
;; MSG SIZE  rcvd: 51

Rozhodující je samozřejmě ANSWER SECTION, která představuje jádro odpovědi. Kormě ní je zobrazen i dotaz (QUESTION SECTION) a v řadě odpovědí se objeví i doprovodné informace (AUTHORITY a ADDITIONAL SECTION), na začátku spousta vnitřních údajů (důležité jsou především příznaky, flags, kde například nenápadná přítomnost aa odlišuje autoritativní odpověď od neautoritativní) a na konci statistiky — od koho odpověď přišla, za jak dlouho a jak byla velká. Pokd se vám zdá, že je to snad příliš mnoho štěstí najednou, můžete volbou +short na příkazovém řádku oříznout prezentované informace na minimum:

$ dig +short nic.cz
217.31.205.50

Můžete i cíleně vypínat jednotlivé části zobrazené odpovědi volbami +nocmd, +nocomment, +noquestion, +noanswer, +noauthority, +noadditional a +nostats, ale kdo by se s tím psal. Tyto možnosti oceníte pouze v případě, kdy chcete výstup strojově zpracovávat a hodí se vám cíleně omezit jeho složení.

Reverzní dotazy nejsou tak přímočaré, jako u předchozích dvou programů. Nestačí zadat jako hledaný parametr IP adresy, musíte volbou -x výslovně sdělit, že požadujete reverzní dotaz, například:

dig -x 217.31.205.50

dig podporuje oba síťové protokoly, IPv4 i IPv6, které používá podle aktuální potřeby a síťové politiky počítače, na němž běží. Volbou -4 (resp. -6) mu nařídíte, aby se omezil pouze na IPv4 (resp. IPv6). Kromě nich máte k dipozici i několik dalších voleb, kterými můžete ovlivňovat použité komunikační protokoly — viz tabulka.

Tabulka 6. Volby dig určující komunikační protokoly
Volba Protokol

-4

IPv4

-6

IPv6

+tcp

TCP

+tls

TCP + TLS

+https

HTTPS metodou POST

+https-get

HTTPS metodou GET

Častěji než přenosový protokol budete nepochybně určovat adresu osloveného serveru. To zajistí konstrukce @server na příkazovém řádku, v níž server můžete zadat jak jménem, tak adresou (v takovém případě zároveň rozhodnete i o protokolu). Informace o nic.cz přímo od autoritativního serveru c.ns.nic.cz získá:

$ dig @c.ns.nic.cz nic.cz

; <<>> DiG 9.16.1-Ubuntu <<>> @c.ns.nic.cz nic.cz
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46423
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;nic.cz.				IN	A

;; ANSWER SECTION:
nic.cz.			1800	IN	A	217.31.205.50

;; Query time: 12 msec
;; SERVER: 2001:678:11::1#53(2001:678:11::1)
;; WHEN: So pro 23 07:17:54 CET 2023
;; MSG SIZE  rcvd: 51

Pro určení typu poptávaných záznamů jsou k dispozici dvě cesty. Buď můžete použít volbu -t typ nebo uvést jako další parametr za doménovým jménem. Seznam poštovních serverů pro doménu nic.cz tedy vydá příkaz:

$ dig -t mx nic.cz

nebo:

$ dig nic.cz mx

Rozdíl mezi oběma variantami se zvýrazní především v kombinaci s další schopností programu, který dokáže řešit několik dotazů najednou. Na příkazovém řádku můžete uvést více doménových jmen a dig postupně všechna vyřeší. Zadáte-li typ dotazu volbou -t vztahuje se na všechna poptávaná jména. Například:

dig -t mx nic.cz nix.cz

vyhledá MX záznamy pro domény nic.cz a nix.cz. Pokud byste chtěli zadávat typ záznamu jako další parametr za jménem domény, musíme je na příkazovém řádku střídat: doména typ doména typ …​. Tento přístup je vhodný, když sháníte záznamy různých typů MX pro doménu nic.cz a NS pro doménu nix.cz vyhledá příkaz:

$ dig nic.cz mx nix.cz ns

Pro hromadné dotazování dig nabízí ještě jednu možnost — dávkový režim zpracování. Uložte do textového souboru příkazy pro něj. Každý se zapisuje na samostatný řádek, jejich formát je totožný s příkazovým řádkem, jen chybí úvodní jméno programu. Následně pak zavolejte dig s parametrem -f soubor. Program postupně provede všechny příkazy v něm obsažené. Stejnou dvojici dotazů jako předchozí příklad by zajistil takto zpracovaný soubor obsahující třeba:

-t mx nic.cz
nix.cz ns
Lahůdky

Dosud popsané schopnosti představují celkem standardní sortiment, který zhruba odpovídá ostatním programům z této kapitoly a ocení jej i běžný uživatel. dig ovšem nabízí řadu dalších jemnůstek, jež se mohou hodit zejména správcům domén při hledání problémů. Oficiálně se jim říká "volby dotazu" a aktivují se konstrukcí +cosi na příkazovém řádku. Například +nssearch projde autoritativní servery zadané domény, získá od každého z nich SOA a vypíše je pěkně vedle sebe, abychom mohli porovnat:

$ dig +nssearch nic.cz
SOA a.ns.nic.cz. hostmaster.nic.cz. 1703236228 14400 3600 1209600 7200 from server 194.0.13.1 in 8 ms.
SOA a.ns.nic.cz. hostmaster.nic.cz. 1703236228 14400 3600 1209600 7200 from server 193.29.206.1 in 36 ms.
SOA a.ns.nic.cz. hostmaster.nic.cz. 1703236228 14400 3600 1209600 7200 from server 2001:678:f::1 in 36 ms.
SOA a.ns.nic.cz. hostmaster.nic.cz. 1703236228 14400 3600 1209600 7200 from server 194.0.12.1 in 36 ms.
SOA a.ns.nic.cz. hostmaster.nic.cz. 1703236228 14400 3600 1209600 7200 from server 2001:678:10::1 in 36 ms.
SOA a.ns.nic.cz. hostmaster.nic.cz. 1703236228 14400 3600 1209600 7200 from server 2001:678:1::1 in 36 ms.

Jinou zajímavou možnost nabízí +trace. Projde doménový strom od kořene až k zadanému jménu a vypíše seznam autoritativních serverů pro každou z domén na cestě:

$ dig +trace www.nic.cz

; <<>> DiG 9.16.1-Ubuntu <<>> +trace www.nic.cz
;; global options: +cmd
.			11603	IN	NS	d.root-servers.net.
.			11603	IN	NS	e.root-servers.net.
.			11603	IN	NS	f.root-servers.net.
.			11603	IN	NS	g.root-servers.net.
.			11603	IN	NS	h.root-servers.net.
.			11603	IN	NS	i.root-servers.net.
.			11603	IN	NS	j.root-servers.net.
.			11603	IN	NS	k.root-servers.net.
.			11603	IN	NS	l.root-servers.net.
.			11603	IN	NS	m.root-servers.net.
.			11603	IN	NS	a.root-servers.net.
.			11603	IN	NS	b.root-servers.net.
.			11603	IN	NS	c.root-servers.net.
;; Received 262 bytes from 127.0.0.53#53(127.0.0.53) in 4 ms

cz.			172800	IN	NS	c.ns.nic.cz.
cz.			172800	IN	NS	a.ns.nic.cz.
cz.			172800	IN	NS	b.ns.nic.cz.
cz.			172800	IN	NS	d.ns.nic.cz.
cz.			86400	IN	DS	20237 13 2 CFF0F3ECDBC529C1F0031BA1840BFB835853B9209ED1E508FFF48451 D7B778E2
cz.			86400	IN	RRSIG	DS 8 1 86400 20240105170000 20231223160000 46780 . ewCkJz/rloNNLrDrlcQJ2jkoB6Q+9fUKtcB03oTjj5XgjsG604u6b9kE me5y5KKln4Qp2tKpmt7S5MVtU17uAx1UfhYHaEC5pNXqdkSVA2bhh8BH 22xUCMbzPawWNSJnfSZw+ZA/BhokEBEad8GrPLU6uZORXaftomqsht4n x+HCjzbssPmjZr6vBzwl4pqa8W/Lh1WvRcRNdcpsfwUbGTvMJ2p+E3ML weiX1wOhU0VMGFygT+5VBj7w33ad5/V4aWLBRYitYWVtF3XRMX4GA49w nJK6RsCKJ6SywCAzsZ4A9SvOgM+YULZxg3YaCJG54DgFlvGxFIcZoY3C EY5a9g==
;; Received 653 bytes from 2001:500:2::c#53(c.root-servers.net) in 8 ms

www.nic.cz.		1800	IN	A	217.31.205.50
www.nic.cz.		1800	IN	RRSIG	A 13 3 1800 20240102012553 20231218235553 62596 nic.cz. I92ord4OoQOhtpgUPxiylPoL4JGqzD/FouweH/AAlLooIREo6IKmdanZ YQobwHyjXZtIOUAoRpxwrwcDTQaSrg==
;; Received 157 bytes from 193.29.206.1#53(d.ns.nic.cz) in 4 ms

Na začátku jsme psali, že uživatelská přívětivost nestála při vzniku digu nijak vysoko na žebříčku priorit. Je to vidět, pokud byste si rádi řekli o celou doménu. dig pro tento účel nemá žádný speciální příkaz ani volbu, řeší se typem dotazu AXFR. Tedy:

dig -t axfr nic.cz

požádá o přenos celé domény nic.cz (a nejspíš skončí chybou Transfer failed, protože server odmítne). Na rozdíl od ostatních dig podpporuje i přenos přírůstků v doméně. Pokud zadáte typ svého dotazu ve tvaru -t ixfr=verze, získáte přehled, co je v doméně nového od uvedené verze (měřeno podle SOA). Samozřejmě jen v případě, že server dotazy tohoto typu podporuje, jinak pošle jednoduše vše.

Program poskytuje široké možnosti pro ovlivňování dotazu. Především si podrobnosti o něm můžete nechat zobrazit díky volbě +qr, abyste přesně věděli, co se vlastně děje. Sada voleb +recursive, +aaflag, +edflag, +cdflag a +dnssec (případně s předponou no) nastavuje (resp. vypíná) odpovídájící bity v odeslaném dotazu. Dá se ovlivňovat i řada dalších parametrů — časové intervaly, počty opakování a další. Detaily nadete v dokumentaci digu.

Resolver a relativní jména

Opakovaně jsme se zmínili o relativních doménových jménem. Jejich použití v zónových souborech je jednoduché a jednoznačné — nekončí-li jméno v zónovém souboru tečkou, připojí se za ně aktuální doména (lze změnit direktivou $ORIGIN).

V koncovém resolveru v operačním systému se uplatňuje podobně jednoduchá myšlenka. Pokud dostane k řešení relativní jméno (například když uživatel zadal webovému prohlížeči jako cílovou adresu jen www nebo spustil z příkazového řádku ssh server), připojuje za ně postupně jednotlivé domény k prohledávání podle své konfigurace a v DNS hledá takto sestavená jména. Komplikace se skrývají v detailech, je třeba zodpovědět dvě otázky:

  1. Jak rozlišovat absolutní a relativní doménová jména?

  2. Jak se má resolver konkrétně chovat, pokud je jméno relativní?

Odpověď sice existuje, ale prodělala určitý historický vývoj a ne každý operační systém se drží aktuální verze. Reálné chování resolveru bohužel závisí na konkrétním prostředí. Přístupy jednotlivých systémů podrobně zkoumal Geoff Huston a výsledky publikoval ve svém článku, ze kterého nyní vycházíme.

Podle původních představ autorů DNS se při běžném používání měla basolutní jména rozlišovat od relativních stejně jako v zónových souborech — tečkou na konci. Podle RFC 1034 jméno končící tečkou je absolutní a klient je při dotazování nebude nijak měnit. Jestliže jméno tečkou nekončí, považuje se za relativní a připojí se za ně místní domény (resp. doména nastavená jako prohledávaná).

V praxi se tato představa neuchytila. Přítomnost/nepřítomnost tečky na konci jména je příliš nenápadná, uživatelé jsou roztržití a líní. Proto se programy využívající DNS resolver snažily uplatňovat různé heuristiky a považovat za absolutní i řadu jmen bez tečky. Obvyklým indikátorem byla složitost zadaného jména, tedy počet jeho jmenovek.

Tuto běžnou praxi kodifikovalo RFC 1123 a doporučilo, aby jméno poptávané v DNS obsahovalo vždy alespoň tři jmenovky.[4] Takové jméno by mělo být považováno za absolutní, i když nekončí tečkou. Naproti tomu jméno s menším počtem jmenovak, které nekončí tečkou, bude chápáno jako relativní. RFC 1536 tento princip ještě zjednodušilo — relativní je jen jméno neobsahující tečku. Jakmile jméno končí tečkou, nebo je rozděleno na dvě či více jmenovek, má být považováno za absolutní. Tento přístup převzalo i RFC 3397, které představuje zatím poslední slovo v této oblasti. Podle něj by se resolver měl chovat následovně:

  1. Pokud jméno obsahuje alespoň jednu tečku, měl by resolver nejprve zpracovat jako absolutní a použít v DNS dotazu v nezměněné podobě. Bude-li dotaz neúspěšný, připojí za ně prohledávanou doménu a bude poptávat upravené jméno.

  2. Když jméno žádné tečky neobsahuje, rovnou se za něj připojí prohledávaná doména.

Šedivá je teorie, praxe si ovšem žije po svém. Ilustruje to tabulka, jejíž data vycházejí z článku [4]. Najdete v ní dotazy, které položí resolvery jednotlivých operačních systémů, když dostanou k řešení jména www (s tečkou na konci), www (bez tečky) a www.ns (bez tečky na konci), když mají jako prohledávanou doménu nastaveno nic.cz.

www. www www.ns

OS X 10.9

www

www.nic.cz

www.ns

MS Windows XP

www

www.nic.cz

www.ns

novější MS Windows

www

www.nic.cz

www.ns, www.ns.nic.cz

FreeBSD 9.1

www

www.nic.cz, www

www.ns, www.ns.nic.cz

Ubuntu 13.04

www

www.nic.cz, www

www.ns, www.ns.nic.cz

Jak vidíte, podle doporučení se chovají jen MS Windows XP. Počínaje verzí Vista už Microsoft opustil připojování prohledávané domény, pokud poptávané jméno obsahuje tečku a dotaz na ně byl neúspěšný. Stejně se chová i OS X. Systémy odvozené z Unixu jdou nad rámec RFC 3397 a dotáží se i na samotné jméno s jedinou jmenovkou, pokud neuspěl předchozí dotaz s přidanou prohledávanou doménou.

Aby situace byla ještě veselejší, zasahují do DNS jmen i konkrétní aplikace, zpravidla ve snaze usnadnit uživateli život a opravovat běžné chyby. Geof Juston ve zmiňovaném článku testoval webové prohlížeče a zjistil, že jsou velmi kreativní. Složení DNS dotazu ve stejném systému při stejném vstupním jméně ses znatelně lišilo v závislosti na tom, který konkrétní prohlížeč byl použit.

Co z toho plyne? Stručně řečeno, na relativně zadáváná jména není spolehnutí. Pokud se vůbec rozhodnete používat prohledávanou doménu a nastavovat ji svým místním strojům (obvykle prostřednictvím DHCP), raději se omezte jen na jednu. čím delší bude seznam prohledávaných domén, tím bizardnější výsledky lze očekávat.

DNS přímo z aplikace

V principu je možné, aby aplikace nevyužívala systémový resolver a veškerou DNS komunikaci si obstarávala sama. Může si otevřít UDP port, sama formulovat DNS dotazy, přijímat a analyzovat odpovědi. Tento postup se ale nedá doporučit. Nabízí v podstatě jen dvě výhody

  • Můžete sami řídit, koho se aplikace bude ptát.

  • Pokud Má systémový resolver nějaké potíže nebo nedostatky, dá se jim vyhnout.

Zato nevýhod je celá řada:

  • Tento přístup je pracnější, autor vše musí programovat sám. Základ DNS je jednoduchý, ale jakmile se začnou řešit speciální případy, chybové stavy nebo ověřovat DNSSEC, vše se dramaticky komplikuje.

  • Chování aplikace nebude konzistentní s ostatními. Vyskytnou-li se u ní problémy s DNS, velmi obtížně se hledají a odstraňují, protože diagnostické nástroje využívají systémový resolver.

  • Je třeba obstarat konfiguraci základních DNS parametrů, především adresu serverů, na které se má obracet.

  • Vylepšení či opravy systémového resolveru aplikaci nic nepřinesou, autor si vše musí odpracovat sám.

S trochou kreativity by se dalo pokračovat, ale nemá to valný smysl. Řešit si DNS "na koleně" v rámci aplikace obecně není dobrý nápad a dlouho to nikdo nedělal. Smysl by mohlo mít snad jen při mimořádných nárocích dané aplikace.

Existuje ovšem aktivita z této oblast, která smysl má. Google přišel se službou, která poskytuje přístup k jeho veřejným rekurzivním serverům protokolem HTTPS. Původně ji pojmenoval DNS over HTTPS, později byl ale tento název použit pro standardní přenosový protokol. a služba se jmenuje JSON API for DNS over HTTPS. Hlevní motivace je bezpečnost — komunikace klienta s rekurzivním serverem je šifrována, takže je chráněna proti podvrhování odpovědí a zároveň zachovává soukromí.

Využití se očekává především ze strany weboivých aplikací. Prohlížeč umí HTTPS, takže není třeba vymýšlet nic nového. rozhraní je navíc velmi jenoduché. Služba je k dispozici na adrese https://dns.google.com/resolve?

Dotazy se posílají metodou GET a poptávaná data se kódují do URL v podobě několika parametrů. Nejdůležitější je name (poptávané doménové jméno) a type (typ záznamu). Například dotaz na IPv6 adresu serveru www.nic.cz by vypadal takto:

Odpovědi přicházejí ve formátu JSON, jehož jednotlivé položky odpovídají součástem DNS zprávy.[5] Ty části, které mohou obsahovat více záznamů se řeší polem. Konkrétně odpověď ba výše uvedený dotaz obsahuje:

{
    "Status":0,
    "TC":false,
    "RD":true,
    "RA":true,
    "AD":true,
    "CD":false,
    "Question":
        [
            {
                "name":"www.nic.cz.",
                "type":28
             }
        ],
     "Answer":
        [
            {
                "name":"www.nic.cz.",
                "type":28,
                "TTL":949,
                "data":"2001:1488:0:3::2"
             }
        ]
}

Všimněte si, že většina z výše uvedených nevýhod zde neplatí. Je to dáno tím, že aplikace si ve skutečnosti neřeší DNS sama, spíše používá alternativní API — místo volání lokálního resolveru používá prostřednictvím HTTPS resolver vzdálený. Krkolomnosti ponechá na něm, sama si interpretuje výsledky. Konfigurace není potřeba, je dána adresou této služby. V podstatě zůstává jediný vážný problém — chování DNS nemusí být konzistentní s aplikacemi využívajícími lokální resolver. Ovšem právě kvůli potenciálnímu omezení lokálního resolveru (např. chybějící podpoře DNSSEC) se tato služba využívá.

Podrobnější popis najdete na adrese:

Jak jsme již naznačili, služba Google byla první vlaštovkou při koketování s HTTPS. Později byl standardizován protokol DNS over HTTPS (DoH), který používá HTTPS jen jako komunikační kanál a posílá po něm standardní zprávy. Tím se ovšem otevřely dveře k řešení DNS přímo z aplikací dokořán.

Transportní vrstva

Z pohledu internetové architektury je DNS protokol aplikační vrstvy a své zpracování přenáší pomocí protokolů vrstev nižších. V té transportní jsou k dispozici dva základní: jednoduchý UDP a spolehlivý TCP. Valná většina aplikačních protokolů jednoznačně stanoví, který z nich používá. S DNS to od začátku nebylo úplně jednoduché a jak to bývá, postupem času se situace více a více komplikuje.

Původní koncept počítal s tím, že primárně bude využívat UDP a v ojedinělých případech, kdy se přenášejí větší objemy dat, se sáhne po TCP. V valné většiny takto funguje DNS dodnes. Ovšem velikost záznamů postupně roste a navíc se projevují některé bezpečnostní nedodtatky UDP,především snadné podvržení adresy. Úměrně tomu narůstá role TCP, včetně varianty dlouhodobě udržovaných spojení mezi klientem a serverem.

Důraz na ochranu soukromí pak rozkošatil přenosovou vrstvu o několik variant šifrování, které mají skrýt DNS transakce před odposlechem. Přehled současných možností pro přenos DNS poskytuje tabulka. Postupně je rozebereme podrobněji.

Tabulka 7. Varianty pro přenos DNS
Varianta Transport Port Šifrování Kde

DNS po UDP

UDP

53

ne

DNS po TCP

TCP

53

ne

DNS po TLS (DoT)

TCP

853

ano

DNS po DTLS (DoD)

UDP

853

ano

DNS po HTTPD (DoH)

TCP

443

ano

DNS po QUIC (DoQ)

UDP

853

ano

UDP

Jádro DNS je jako dělané pro použití UDP. Transakci tvoří výměna dvou krátkých paketů: dotaz a odpověď. Zatímco TCP by ještě navazoval spojení, UDP už má hotovo. Další dotaz bude pravděpodobně kladen jinému serveru, není tedy důvod udržovat spojení. Spolehlivost není třeba řešit v transportní vrstvě. Když klient nedostane včas odpověď, jednoduše se zeptá znovu, pokud možno jiného serveru.

Návrh DNS proto počítal s UDP jako se základním protokolem. Tazatel podle RFC 1035 vždy nejprve poslel dotaz po UDP a jen když dorazila odpověď s příznakem zkrácení TC, navázal jednorázově TCP spojení se stejným serverem, dotaz v něm zopakoval, přijal kompletní odpověď a spojení zase ukončil. Výjimkou z tohoto obecného principu představovaly zónové přenosy, kde se rovnou navazovalo TCP spojení, protože celá zóna se do jednoho paketu obvykle nevejde.

Původně se počítalo s maximální velikostí zpráv 512 bajtů, pozdější rozšiřující mechanismus EDNS(0) umožnil přenášet po UDP i delší zprávy. Je to jednoduché a efektivní. Bohužel také choulostivé. Protokolem UDP může kdykoli odkudkoli dorazit paket a sever nemá od tazatele žádnou zpětnou vazbu, nemůže si být jist, že paket spolehlivě odeslal ten, kdo je uveden ve zdrojové adrese.

To činí z UDP lákavý cíl pro různé švindly. Nejvážnější jsou nepochybně zesilované útoky, kdy se díky falešné zdrojové adrese a volbě takových dotazů, na které přicházejí co největší odpovědi, sesypena oběť hromada DNS zpráv a zahltí cílový stroj nebo síť k němu vedoucí.

Druhý problém UDP také souvisí s rostoucí velikostí paketů. Je jím fragmentace, tedy rozdělení příliš dlouhého paketu, který daná linka nedokáže přenést najednou, na několik menších. Nejdená se o nic specifického pro DNS nebo UDP, fragmentace je součástí IP a je s námi už od jeho počátků. Podívejme se nejprve, jak funguje. Později vysvětlíme, v čem je problematická a proč se jí snažíme vyhýbat.

Příčinou fragmentace je skutečnost, že v Internetu se používají různé technologie, které dokáží přepravovat různě velké pakety. V IP se pro tento limit používá termín MTU — Maximum Transmission Unit. Například Wifi pojme do jednoho rámce až 2304 B dat, zatímco Ethernet nanejvýš 1500 B. Pokud byste po Wifi odeslali 2000 B dlouhý paket a ten by dorazil do místa, kde podle směrovací tabulky má pokračovat po Ethernetu, vznikne problém: prostě se do odchozí linky nevejde. Pro tyto případy je určena fragmentace. Datagram se rozdělí na několik menších, které se přenesou samostatně a příjemce si je poskládá do původní podoby.

Aby bylo možné fragment opět složit, nese v sobě trojici informací:

  • Identifikátor, podle kterého se poznají fragmenty pařící k sobě. Jedná se o číslo dlouhé 32 bitů v případě IPv4, resp. 64 bitů v IPv6, které je unikátní pro každý odeslaný datagram.[6] Dojde-li k fragmentaci, všechny fragmenty nesou stejný identifikátor.

  • Posun fragmentu obsahující pozici v původním datagramu, na níž začínají data nesená tímto fragmentem.

  • Příznak, zda následuje další fragment.

Datagram vždy skládá až příjemce. Dá si dohromady všechny fragmenty se stejným identifikátorem, seřadí jejich data podle posunů a pokud má vše od začátku až po fragment, jehož příznak oznamuje, že žádný další za ním už nenásleduje, podařilo se mu rekonstruovat původní dlouhý datagram.

Detaily se liší v závislosti na verzi internetového protokolu. V IPv4 jsou fragmentační údaje součástí základní hlavičky a fragmentovat zde může kterýkoli stroj na cestě od odesílatele k příjemci. IPv6 se snaží fragmentaci omezovat, fragmentovat zde může pouze odesílatel. Jestliže se po cestě datagram nevejde do odchozí linky, inkriminovaný stroj jej zahodí a pošle odesílateli ICMPv6 zprávu oznamující tuto událost a MTU linky, které zahození způsobilo. Odesílatel pak bude datagram odpovídajícím způsobem fragmentovat, nebo rovnou pošl kratší datagram. Jelikož je fragmentace v IPv6 spíše vzácná, byly její údaje přesunuty ze základní hlavičky do jednoúčelové rozšiřující hlavičky nazvané Fragmentace.

Zní to logicky, takže v čem je problém? Stručně řečeno v tom, že Internet je protkán prvky, které se chovají nestandardně. V důsledku toho framentace způsobuje řadu problémů. Například firewally při posuzování přípustnosti datagramu často pracují s údaji z hlavičky transportního protoklu, zejména s čísly portů. Touto hlavičkou začínají nesená data, je proto k dispozici pouze prvním fragmentu. Nejsou vzácné situace,kdy komunikace nefunguje, protože firewall po cestě zahazuje všechny pokračovací fragmenty. Podobné problémy mohou způsobovat prvky pro rozkládání zátěže nebo NATy. Celkem běžně se dnes blokuje ICMP, klíčový zdroj informací pro fragmentaci v IPv6.

Důsledkem je, že fragmentace významně snižuje spolehlivost přepravy. Podle některých měření v RFC 7872 jen dva ze tří fragmentovaných IPv6 datagramů dorazí úspěšně do cíle. Proto se snažíme, aby k fragmentaci pokud možno nedocházelo. Jenže při použití UDP a povolení velkých odpovědí pomocí EDNS(0) jsou šance vyhnout se jí jen omezené.

TCP

Popsané problémy UDP jsou jedním z rostoucích zájmů o TCP. Při jeho použití zesilovaný útok není možný, protože se před odesláním jakýchkoliv dat nejprve navazuje pojení. Dorazí-li serveru žádost o navázání spojení z falešné adresy, reaguje na ni vstřícně. Jenže jeho odpověď dorazí k cíli útoku, který o spojení nežádal a jeho navazování okamžitě zruší, aniž by se přenášely jakékoli DNS zprávy.

Také fragmentace je v TCP ošetřena. Povinně obsahuje mechanismus objevování cesty podle RFC 1191, resp. RFC 1981. Snaží se o co největší velikost datagramů, které projdou k příjemci bez fragmentace, Dělá to tak, že oděšle datagram o velikosti MTU odchozího rozhraní (v IPv4 navíc zakáže fragmentaci). Dorazí-li ICMP zpráva ohlašující jeho zahození, zmenší velikost podle údaje z ní a opakuje pokus. Podobně se chová i v případě, že nedojde zpráva ani odpověď. V tom případě zkrácení odhadne. Pokračuje, dokud nedorazí odpověď od adresáta. Tím zjistí velikost, která prochází celou trasou bez fragmentace. Té se následně bude držet (a v IPv4 stále všem datagramům zakazovat fragmentaci).

Důsledkem postupně rostoucího významu TCP pro DNS je i RFC 7766 DNS Transport over TCP — Implementation Requirements, které mimo jiné deklaruje podporu TCP jako povinnou. Zároveň umožňuje jeho okamžité použití. Tezatel už nemusí nejprve poslat svůj dotaz po UDP, ale je čistě na jeho uvážení jaký protkol použije.

Navazovat TCP spojení pro jediný dotaz není zrovna ideálem efektivity. Proto je v RFC 7766 věnována značná část trvalým (persistentním) spojením, kdy je jedno TCP spojení využito pro větší počet dotazů. To bude zajímavé zejména v případech, kdy klient očekává, že se jeho komunikace neomezí na jediný dotaz. Typickým příkladem je koncový resolver a jeho místní rekurzivní server, na nějž se obrací se všemi svými DNS dotazy.

Aby bylo spojení využito co nejefektivněji, klient nemusí čekat na odpověď a může daným spojením posílet jeden dotaz za druhým. Analogicky server není vázán pořadím dotazů a posílá odpovědi, jakmile má data k dispozici. Pokud tedy řešení některého dotazu trvá déle, může se stát, že odpověď na pozdější dotaz pošle dříve, například ze své vyrovnávací paměti. Musí ale odpověď poslat vždy stejnou cestou, kterou dorazil dotaz. Pokud například má otevřeno TCP spojení a ze stejné IP adresy mu dorazí dotaz protokolem UDP, musí na něj odpovědět po UDP a nesmívyužít existující TCP spojení.

Párování odpovědí a dotazů na straně klienta probíhá výlučně podle jejich Identifikátorů, pořadí zpráv nehraje roli. Proto klient nesmí po stejném spojení zopakovat stejný Identifikátor.

Otevřená TCP spojení server samozřejmě zatěžují, proto by měl klient jejich počet udržovat na minimu, typicky jedno k danému serveru. Server je oprávněn omezit počet současně otevřených spojení ze stejnéadresy, ovšem neměl by to dělat příliš restriktivně, protože za jednou adresou NATu se může skrývat větší počet klientů. Jako ochrana před přetížením v případě serveru spíše připadá v úvahu zavírání existujících pojení. RFC 7766 doporučuje dělat to, pokud spojení během dvou minut nevykazuje žádnou aktivitu.

Trvalás pojení jsou poměrně nová a ne každý program pro DNS je podporuje. Aby se obě strany mohly dohodnout na jejich použití, zavedlo RFC 7828 The edns-tcp-keepalive EDNS0 Option potřebnou signalizaci — volbu edns-tcp-keepalive pro EDNS(0). Pokud ji klient vloží do svého dotazu (smí se přidávat jen k dotazům zaslaným protokolem TCP), dává najevo, že by rád zachoval spojení otevřené.

Server podporující trvalá spojení pak ve své odpovědi prostřednictvím této volby oznámí limit pro dobu nečinnosti daného spojení ve stovkách milisekund. Pokud klient během této doby nepoloží žádný další dotaz, měl by spojení zavřít. Server samozřejmě dobu nečinnosti určuje podle svého vytížení a může ji v dalších dotazech měnit v závislosti na aktuální situaci. Může ohlásit i nulu, což je výzva klientovi, aby spojení co nejrychleji uzavřel. Kromě toho samozřejmě každá ze stran může TCP spojení kdykoli uzavřít, pokud to potřebuje.

Provoznímio záležitostmi přenosu DNS po TCP se zabývá RFC 9210 DNS Transport over TCP — Operational Requirements, které je zárověň doporučením BCP 235. Obsahuje především shrnutí problematiky a korekce několika starších RFC, která brala TCP jako doplňkový protokol. Zajímavá je příloha A, kde najdete přehled všech RFC relevantních pro tuto problematiku.

Stavové DNS

Dlouhodobá spojení otevřela pro DNS nové možnosti. Dosud aktivita vycházela výlučně ze strany klienta, protože server nevěděl, kdy se na něj kdo obrátí s jakým dotazem. Jestliže je ale klient trvale připojen, mohl by i server aktivně zasáhnout do konverzace — například upravit parametry spojení nebo ohlásit změnu, ke které u něj došlo.

Základní rámec pro takovou komunikaci zavedlo RFC 8490 a pojmenovalo ji stavový provoz DNS (DNS Stateful Operations, DSO). Nejedná se o náhradu klasického DNS, ale o jeho možný doplněk. Hlavní novinko DSO je, že umožňuje dlouhodobé operace, aby se klient třeba přihlásit k odběru novinek v zóně.

Předpokladem pro použití DSO je dlouhodobé spojení obou stran zachovávají pořadí, jako je DNS po TCP nebo TLS. Tímto spojením si komunikující strany budou vyměňovat standardní DNS zprávy jako dříve, ale vedle nich si mohou posílat i zprávy protokolu DSO.

Jejich formát vychází z DNS zpráv a poznají se podle OpKódu s hodnotou 6. Neobsahují žádné zaznamy, proto jsou délky všech čtyř částí zprávy nulové. Místo toho přenášejí data v jednotkách označovaných typ—​délka—​hodnota (Type—​Length—​Value, TLV), ze kterých si poskládají tělo zprávy podle potřeby. První TLV je primární a určuje význam zprávy. Za ním mohou následovat doplňková TLV s dodatečnými imformacemi.

Formát TLV

format TLV

DSO počítá jak s tradičním komunikačním schématem požadavek — odpověď, tak s jednosměrnými zprávami, která druhá strana přijme, ale nijak na ně nereaguje. Komunikační kanál zaručuje soplehlivý přenos, na úrovni DNS proto není třeba zprávy potvrzovat.

Po navázání spojení se klient pokusí vytvořit takzvanou DSO seanci (DSO session). Jednoduše pošle libovolný DSO požadavek a dostane-li na něj úspěšnou odpověď, znamená to, že i server podporuje DSO a seance byla vytvořena. V opačném případě musí vzít na vědomí, že server DSO neumí, a přestat je používat. Jednosměrné DSO zprávy lze posílat až po vytvoření seance.

Základní specifikace definuje jen tři TLV:

  • Vycpávka pro šifrování (Encryption Padding, typ=3) nemá žádný skutečný obsah a slouží jen k umělému prodloužení zprávy pro potřeby šifrování. Analogická forma existuje i pro EDNS(0).

  • Odklad opakování (Retry Delay, typ=2) použije server při ukončení spojení. Důvodem může být například jeho přetížení nebo chybné chování klienta. Obsahuje čas, jak dlouho klient musí počkat, než se může pokusit znovu připojit. Toto TLV lze také připojit k neúspěšné odpovědi na požadavek, v tomto případě se týká jen daného požadavku a sděluje klientovi, za jak dlouho jej smí opakovat.

  • Údržba spojení (Keepalive, typ=1) má dva účely. Klient ji může kdykoliv poslat jako neutrální zprávu, když je spojení dlouho nečinné a hrozilo by vapršení jeho záznamů v zařízeních po trase (NAT, firewall a podobně). Druhou fuknkcí je nastavení časových intervalů pro dané spojení. Jejich změny může kdykoliv klient navrhnout nebo server jednosměrně oznámit.

Časové intervaly určují míru trpělivosti při využívání spojení. Jejich prostřednictvím lze upravit rovnováhu mezi zpožděním při navazování nového spojení a zátěží serveru způsobenou uchováváním nevyužívaného spojení. Jsou dva:

  • Interval nečinnosti (Inactivity Timeout) udává maximální dobu, po kterou může zůstat otevřeno neaktivní spojení. Za aktivitu se považuje přenos jakokoli DNS nebo DSO zprávy s výjimkou Údržby spojení. Za aktivní je spojení také považováno, když po něm probíhá dlouhodobá operace, přestože třeba zrovna není co hlásit, takže se dlouho neposílají žádné zprávy. Uplyne-li interval nečinnosti, je klient povinen spojení zavřít. Pokud to neudělá, po uplynutí dvojnásobku (minimálně 5 sekund) je zavře server.

  • Interval údržby (Keepalive Timeout) je nejdelší doba, kdy musí spojením projít paket, aby nebylo smazáno ze zařízení po trase. Uplyne-li tato doba od poslední přenesené zprávy, klient pošle DSO zprávu Údržba spojení. Tento interval bývá delší než interva nečinnosti, doporučenou hodnotou je jedna hodina. Slouží především pro dlouhodobé operace, kdy je spojení ktivní, ale pazy mezi zasílanými zprávami mohou být velmi dlouhé.

Popsaný mechanismus intervalů má přenost před výše popsanou volbou edns-tcp-keepalive. Je-li ba spojení provozováno DSO, nebere se na edns-tcp-keepalive ohled.

DSO samo o sobě mnoho nového nepřináší, ale dají se na něm postavit zajímavé služby.

Šifrované DNS

U prostého TCP se ale vývoj přenosového protkolu pro DNS nezastavil. Po Snowdenově odhalení masivních pasivních odposlechů datových komunikací se v Internetu začala velká pozornost věnovat ochraně soukromí a šifrování přenášených dat. DNS není výjimkou. IETF pro tuto problematiku založilo pracovní skupinu DNS PRIVate Exchange aneb dprive.

Skupina dprive se nejprve věnovala komunikaci mezi koncovým strojem a rekurzivním resolverem. Po vytvoření protokolů pro tento účel se začala orientovat na zabezpečení komunikace mezi rekurzivním resolverem a autoritativními servery. Řešení pro tuto část DNS světa ale teprve vznikají.

V polovině roku 2023 máme k dispozici několik alternativ pro šifrování prvního kroku, tedy přenosu mezi koncovým strojem a rekurzivním resolverem, který řeší jeho dotazy. DNS lze ochránit pomocí TLS, DTLS, HTTPS nebo QUIC. Nejprve se podívejme na společné vlastnosti všech těchto variant.

Všechny vytvářejí šifrovaný tunel, který znemožňuje odposlech klientových dotazů a příchozích odpovědí. Dá se říci, že odstaví útočníky z klientovy domácí sítě a případné další, kteří by dokázali odposlouchávat provoz po trase mezi klientem a jeho rekurzivním serverem. Díky šifrování jim zachycené pakety mnoho užitku nepřinesou. Od rekurzivního serveru dál už komunikace typicky probíhá otevřeně. Tady už se ovšem míchají dotazy všech klientů daného serveru a nemusí být snadné spojit si dotaz a tazatele.

Šifrovaný tunel mezi klientem a rekurzivním serverem

sifrovany tunel klient rekrz server

Velkou otázkou je, kam šifrovaný tunel vede. Rekurzivní server na jeho konci uvidí vaše dotazy a bude předávat dál. Důvěřujete jeho provozovateli? Resolverem může být domácí krabička typu "vše v jednom", která zajišťuje rekurzivní řešení DNS dotazů pro místní počítače. V takovém případě nejspíš provozovateli budete věřit — jste to vy sami. Ale za resolverem se skrývá jen pár strojů z vaší domácnosti. Pokud někdo bude odposlouchávat jim předávané otevřené dotazy, dost se o vás dozví. Ochrana soukromí zde není veliká.

Opačným extrémem bude, když se šifrovaným spojem propojíte s veřejným otevřeným serverem. Na něj se obracejí miliony uživatelů a po dešifrování vaše dotazy jednoduše zmizí v davu. Ochrana proti útočníkům je tu velmi silná. Ale resolver samotný o vás ví vše. Provozovatelé některých veřejně deklarují, že nevedou záznamy o kladených dotazech, nic se neukládá na disky a soukromí uživatelů je dokonale chráněno. Případně si nechávají své chování ověřovat pravidelnými audity. Je už jen na vás, zda jim budete důvěřovat.

Ti nedůvěřiví mohou svou pozici posílit pomocí prostředníka (proxy). Soukromí uživatele ohrožuje propojení IP adresy tazatele a obsahu dotazu. Pomocí přostředníka lze tuto dvojici rozdělit: použijete šifrované DNS, ovšem nebudete dotazy posílat přímo serveru, ale prostředníkovi. Ten sice zná vaši adresu, ale nedokáže dešifrovat zprávy, takže neví, na co jste se ptali. Naproti tomu resolver dokáže dešifrovat obsah dotazu, ale nezná odesilatele — jemu dotaz dorazil z prostředníkovy IP adresy a na ni odpovídá. Aby toto uspořádání mělo smysl, musí samozřejmě stejný prostředník předávat dotazy od většího počtu klientů. Lze k tomu využít dnscrypt-proxy, podrobnější informace najdete na adrese:

Standardizovanou verzi tohoto přístupu představuje tak zvané zapomnětlivé DNS (Oblivious DNS) definované v RFC 9230 Oblivious DNS over HTTPS. Používá přenosový protokol HTTPS, prostředník a rekurzivní server se v němurčují pomocí URI šablony.

Jestli to stojí za námahu už musíte zvážit sami. Teď se podívejme, jaké máme pro šifrování DNS technické možnosti.

DNS po TLS (DoT)

Jako první dovedla pracovní skupina dprive do podoby RFC použití populárního protokolu TLS, které je popsáno v RFC 7858 Specification for DNS over Transport Layer Security (TLS). Týká se komunikace mezi koncovým klientem a jeho rekurzivním serverem. V dalších fázích DNS komunikace by zřejmě byl použitelný též, nicméně ty leží už za hranicemi působnosti této specifikace.

Základní myšlenka je celkem jednoduchá — pro šifrované DNS je vyhrazen samostatný TCP port (konkrétně 853), na kterém server poslouchá, pokud službu podporuje. Klient, který má zájem o zachování soukromí, se nejprve zkusí připojit na port 853 a navázat TLS spojení. Pokud se nepodaří, může se vrátit ke standardnímu nešifrovanému DNS na portu 53. RFC 7858 výslovně zakazuje přenášet portem 853 nešifrované dotazy a odpovědi, je určen výlučně pro TLS. Na druhé straně pak zakazuje použití portu 53 pro TLS, tamní komunikace naopak musí být otevřená.

Zda se klient bude ochoten smířit s nešifrovanou komunikací, závisí na profilu použití TLS. RFC 7858 definuje dva základní:

  • Profil příležitostného soukromí odpovídá výše popsanému chování — klient zkusí TLS a při neúspěchu vycouvá k nechráněné komunikaci.

  • U přísného profilu klient vyžaduje autentizaci a šifrování. Má k dispozici materiál k ověření serveru (získaný jiným způsobem), trvá na použití TLS a ověřuje totožnost serveru. Pokud neuspěje, nebude server používat.

Stručně řečeno, první profil dává přednost funkčnímu DNS i za cenu ztráty soukromí, zatímco přísný profil trvá na soukromí, i kdyby to znamenalo zůstat bez DNS. Podrobnější informace k oběma profilům poskytuje RFC 8310 Usage Profiles for DNS over TLS and DNS over DTLS.

Jakmile se podaří navázat TLS spojení, může klient klást dotazy. Nemusí se vždy čekat na odpověď, jakmile má další dotaz k řešení, může jej okamžitě odeslat. Server přicházející dotazy řeší a odpovědi posílá TLS spojením zpět. Nemusí dodržovat pořadí, jakmile má odpověď k dispozici, může ji odeslat. Klient si ji spáruje s dotazem podle Identifikátoru DNS zprávy. Pokud se řešení některého dotazu zdrží, mohou jej předběhnout odpovědi na pozdější dotazy.

Nevýhodou této varianty je, že na začátku zdržuje. Musí se navázat TCP spojení a následně TLS seance, což vyžaduje výměnu několika paketů. Ovšem týká se komunikace klientů s místním rekurzivním serverem. Klienti mívají k dispozici často jen jeden taková server [7] a jemyslitelné, že navázané spojení nechají otevřené a posílají po něm jeden dotaz za druhým. Počáteční režie se díky tomu rozpustí do řady dotazů a její dopad se minimalizuje. Kromě toho lze při opakovaném navazování nasadit různé urychlovače typu TCP Fast Open, obnovení TLS seance a podobně.

Je-li serverů přece jen více, klient by si z předchozí komunikace měl po omezenou dobu pamatovat, který podporoval DoT a který nikoli. Následně by měl zahajovat komunikaci rovnou tím protokolem, který použil minule. Případně může tuto informaci využít i k výběru serveru a dávat přednost těm, které umí šifrovat.

DNS po DTLS (DoD)

Pro přenosy po UDP vznikl podobný přístup, ovšem založený na protokolu DTLS. Jeho definici najdete v RFC 8094 DNS over Datagram Transport Layer Security (DTLS). Jedná se o experimentální RFC a sami jeho autoři předpokládají, že bude využívána spíš výše popsaná ochrana pomocí TLS. DoD je navrženo jako záložní varianta, v praxi se nepoužívá.

Teoreticky by mělo vyhovovat charakteru DNS lépe než DoT. DNS ke své činnosti používá především UDP, zatímco TCP je pro něj jen doplňkový mechanismus k přenosu dlouhých odpovědí. Kombinace UDP a šifrování je ovšem z principu kočkopes. UDP je bezstavové, přenáší samostatné datagramy, které mohou dorazit víceméně kdykoli. Naproti tomu šifrování potřebuje stavové informace — přinejmenším algoritmy a klíče, jimiž se zpráva šifrují a dešifrují. Používá se pro ně pojem kryptografický kontext a typicky se mezi partnery dohaduí na počátku komunikace. Nebezpečně to připomíná spojení, nicméně v DTLS se probíhající komunikaci říká seance (session).

Dorazí-li po UDP datagram, pro nějž příjemce nemá kryptografický kontext, typicky jej musí zahodit, protože jej nedokáže dešifrovat. Informuje o tom odesílatele a ten obvykle reaguje pokusem o vytvoření či obnovení kryptografického kontextu.[8] Partneři používající DTLS proto musí být stále připraveni začít se šifrováním de facto znovu od začátku Kryptografie zkrátka velmi jednoduchý protkol UDP výrazně komplikuje a výsledné DTLS není v kolektivu příliš oblíbeno. Nicméně existuje a pro DNS se dá použít.

Základní principy jsou podobné předchozímu DoT: šifrovaná komunikace opět probíhá na (tentokrát UDP) portu 853, chování klienta je opět řízeno jeho bezpečnostním profilem. Počítá se s analogickými základními profily — příležitostným a přísným. RFC 8310 s definicí profilů je společné pro oba protkoly.

Odlišná je transportní vrstva a její šifrování. Hlavní výhodou DTLS je menší počáteční zdržení a rychlejší obnovení seance po přerušení. Stejně jako u TLS se počítá s tím, že odpovědi mohou přicházet v jiném pořadí než odchozí dotazy.

Významnou komplikací je, že specifikace DoD požaduje, aby se celá DNS zpráva včetně všech prvků DTLS vešla do jenoho datagramu. Jeho maximální velikost bývá 1500 B, což pro zprávy obsahující DNSSEC nemusí stačit. Navíc jestliže stroj nezná maximální velikost dtagramu na dané cestě (PMTU), musí podle RFC 8097 použít 1280 B.

Nevejde-li se odpověď, je server povinen ji zkrátit a opatřit příznakem zkrácení TC. Klient je tím nucen přejít ke spojové variantě — pokud možno DoT, případně i nešifrovanému TCP, pokud to jeho bezpečnostní profil připouští. Proto každá implementace DNS po DTLS musí podporovat i DNS po TLS. Zatím se implementace nijak nehrnou.

DNS po HTTPS (DoH)

Zatím jedoznačně nejkontroverznější varianta ochrany DNS dotazů a odpovědí přišla s využitím protokolu HTTPS jako přenosového kanálu. U kolébky stála myšlenka, že současné sítě jsou protkány firewally a dalšími zařízeními, které omezují procházející pakety. DNS po TLS nebo DTLS může snadno narazit, pokud jeho vyhrazený port 853 nebude povolen. Naproti tomu web je de facto nutností a je dostupný všude. Jestliže se DNS zabalí do šifrovaného HTTP, uživatelé se k němu dostanou odkudkoli.

Druhou výhodou je, že nebude rozpoznatelné od běžné webové komunikace. Bude proto obtížné je filtrovat a případně se snažit přesměrovat na "jediné pravé servery", pokud by se někdo snažil s DNS manipulovat. Až dosud dobré. Problém spočívá v tom, že po vzniku definice DoH se přiřítili autoři webových prohlížečů a s elegancí slonů v porcelánu prohlásili, že umí HTTPS, takže po tomto mechanismu rádi sáhnou a budou si DNS řešit po svém, zcela mimo operační systém.

Tahounem je zejména Firefox, který v roce 2019 začal zavádět DoH s otevřeným serverem 1.1.1.1 jako výchozí mechanismus DNS. Začal v USE a postupně přidával další země. Při přechodu na tento způsob řešení DNS je uživatel upozorněn a může jej odmítnout. Kromě toho jej samozřejmě lze kdykoliv zapnout nebo vypnout v Nastavení. Ostatní prohlížeče jsou o něco umírněnější, nicméně DoH jejich aktuální verze už většinou umí. Na rozdíl od Firefoxu jej netlačí jako výchozí a vyžadují zapnutí, ale pokud by měly pocit, že Firefox díky němu získává body, rychle do toho vlaku naskočí.

Prvním problémem je, že DoH vedoucí na veřejný server jako výchozí mechanismus poskytuje jeho provozovateli hromadu soukromých dat. Společnost Cloudflare, která provozje server 1.1.1.1, veřejně deklaruje maximální ochranu uživatelských adt a nechává své postupy auditovat. Není důvod ji nevěřit, ale špetka nejistoty tam je. Navíc to silně podpoří centralizaci řešení DNS, valná většina uživatelů bude využívat několik málo veřejných otevřených serverů.

Druhá potíž spočívá v tom, že hrozí naprosté roztříštění obsahu DNS. Webový prohlížeč si bude řešit DNS po svém a ptát se jiných serverů než operační systém. Může proto dostávat jiné výsledky. Například pokud organizace používá neveřejné IP adresy a rozdělené DNS, kdy tazatelům z vnitřní sítě poskytuje jiné odpovědi, než dotazům zvenčí. Aplikace, která pomocí DoH využívá veřejný server, bude dostávat "venkovní odpovědi", zatímco systémový resolver bude poskytovat odpovědi určené pro místní tazatele.

Jestliže stejný přístup zvolí i další aplikace a vyberou si odlišné DNS servery, může vzniknout naprostá bramboračka. Pesimisté předpovídají vznik soukromých DNS stromů stavěných na míru konkrétním aplikacím, či službám. Řešit případné problémy s DNS v takovém případě bude za trest.

Z těchto důvodů je DoH považováno za velmi kontroverzní protokol. Žádnou výjimkou nejsou názory, že ochranu soukromí uživatelů ve skutečnosti zhorší. Jeden takový s rozsáhlou argumentací obsahuje například článek Hubert B.: Centralised DoH is bad for Privacy, in 2019 and beyond. Nicméně džin už je z láhve venku, musíme se s ním vypořádat. Podívejme se jak to pracuje.

Předskokanem byla stejnojmenná služba, kterou zavedl Google. S ní komunikuje protokol HTTPS, ovšem dotaz zakóduje do URL a odpověď přichází ve formátu JSON. Jedná se vlastně o webovou službu pro řešení DNS.

Výsledná specifikace DoH, kterou definuje RFC 8484 DNS Queries over HTTPS (DoH). je jiná. Ponechává formát DNS zpráv beze změny v původní binární podobě a HTTPS používá výlučně jako přepravní protokol. Využívá k tomu HTTP hlavičku:

Content-Type: application/dns-query

Nesou ji dotazy i odpovědi. Resolver je identifikován sým URL, stejně jako běžná stránka. Například zmiňovaný otevřený resolver 1.1.1.1 je pro DoH k dispozici na adrese:

Pokud je na stejném stroji provozován i běžný web, nedá se poznat, zda klient řeší DNS nebo poptává běžnou stránku. Rozhodující pro rozlišení požadavků je cesta, která je ovšem zašifrována diky HTTPS. Charakter provozu by se dal rozpoznat jen podle vnějších příznaků, jako je velikost zpráv, jejich časování a podobně.

Každý DNS dotaz je reprezentován jedním HTTP požadavkem. Klient jej může položit metodami GET i POST. Použije-li GET, přidá za cestu jediný parametr dns=, jehož hodnotou bude DNS dotaz zakódovaný podle base64url. Při použití metody POST cesta neobsahuje žádné parametry a DNS dotaz se vkládá do těla HTTP požadavku. Je v binárním tvaru, tudíž kratší. Metoda GET je pro změnu vstřícnější k vyrovnávacím pamětem (HTTP cache). Server musí podporovat obě, volba je čistě na klientovi.

Odpověď se posílá jako standardní HTTP odpověď na příslušný požadavek. Na první pohled mohou být trochu matoucí stavové kódy — HTTP má svůj a DNS také. Ten v HTTP se týká výlučně HTTP transakce, DNS do něj nijak "neprosakuje". Jestliže řešení DNS skončí nějakým výsledkem, pošle se tazateli s HTTP kódem 2xx (úspěch), i kdyby DNS odpověď signalizovala chybu. HTTP se na situaci dívá tak, že posílá nějakou odpověď, tudíž transakce skončila úspěšně. Obsah odpovědi je pro ně irelevantní. Jen kdyby klient zadal chybnou cestu nebo nebyl oprávněn službu použít, odpovědel by server chybovým kódem na úrovni HTTP.

Součástí HTTP infrastruktury mohou být vyrovnávací paměti (HTTP cache). Ty samozřejmě nerozumí DNS, nicméně jejich obecný mechanismus poskytování uložených odpovědí na opakující se dotazy může využit i pro DoH. Vztahuje se jen na dotazy pokládané metodou GET, protože odpovědi POST se standardně neukládají. DNS dotaz obsahuje identifikátor trnasakce, který prakticky vylučuje opakování stejného dotazu. DoH proto požaduje, aby klient při jeho použití posílal nulový identifikátor. Párování DNS dotazů a odpovědí zajistí HTTP server.

Oříškem je doba životnosti odpovědí ve vyrovnávacích pamětech. Určuje ji odesílající server v HTTP hlavičce Cache-Control a nesmí být delší než životnost záznamů v DNS odpovědi. RFC 8484 doporučuje použít nejkratší životnost zdrojového záznamu z DNS odpovědi jako životnost HTTP odpovědi. Zasílá-li odpověď odpověď vyrovnávací paměť, přidá hlavičku Age obsahující její stáří — jak dlouho byla uložena. DoH klient musí její hodnotu odečíst od životnosti DNS záznamů v odpovědi. Jestliže je TTL záznamu 600 s a v HTTP bylo uvedeno stáří odpovědi 120 s, klient bude se záznamem pracovat, jako by měl TTL=480.

Specifikace dopporučuje používat HTTP verze alespoň 2, které umožňuje jedním spojením klást ze současně různé dotazy, aniž by se vzájemě blokovaly. Tato verze protokolu umožňuje serveru odesílat i data, která klient přímo nepožadoval, ale server předpokládá, že je bude potřebovat (server push). Tím lze rychlost odezvy ještě o něco zvýšit.

Navzdory výše zmiňovaným sporům, zda je DoH dobrý nápad, se protokol těší značnému zájmu ze strany vývojářů. O webových prohlížečích jsme se zmiňovali, v roce 2018 Microsoft oznámil, že se jej chystá zařadit do Windows. Od verze Windows 10 a Windows Server 2022 se skutečně dá DoH zapnout. Je třeba v konfiguraci síťového rozhraní vypnout automatické nastavení DNS serveru, zvolit jej ručně a přepnout na šifrovanou komunikaci. DoH se tak stalo prvním šifrovaným protokolem pro DNS v prostředí MS Windows.

DNS po QUIC (DoQ)

QUIC je dost složitý transportní protokol vyvinutý firmou Google pro potřeby webu. Standardizován byl v RFC 9000 QUIC: A UDP-Based Multiplexed and Secure Transport. Uvaříte jej podle násleujícího receptu:

  1. Vezměte 200g UDP.

  2. Přidejte 50g šifrování à la TLS a vypracujte do hladka.

  3. Za stálého míchání přidávejte podle chutí prody, které chováním připomínají TCP.

Zprávy QUIC se přenášejí protokolem UDP, u kterého je vyzkoušeno, že v Internetu jen málokdy narazí. Společným zájmem webu a DNS je co nejméně zdržovat uživatele, proto QUIC obsahuje řadu postupů z TLS 1.3 pro minimalizaci počtu přenášených paketů a zrachlení některých operací. Patří sem například schopnost rychle obnovit dříve uzavřené spojení (klient se prokáže hodnotou z dřívějšího spojení) a okamžitě jim poslat dotaz (0-RTT). Také počet paketů, jimiž se na začátku nastavuje šifrování, je minimalizován, aby se mohlo co nejdříve začít přenášet něco užitečného.

Šifrovaným UDP kanálem se následně přenášejí nezávisle proudy (stream), původně určené pro dotazy prohlížeče a odpovědi serveru. Každý dotaz má svůj vlastní proud, který vznikne jednoduše tím, že se použije nové číslo proudu. V rámci jednotlivých proudů pak probíhají operace podobné TCP — potvrzují se pakety a chybějící se opakují. QUIC také zahrnuje řízení toku dat, aby se přenášelo co nejrychleji, ale zároveň nedošlo k zahlcení sítě nebo protějšího stroje. Proudy se vzájemně neovlivňují. Pokud v některém dojde ke zdržení, ostatní mohou nerušeně pokračovat.

Celkově se spojení protokolem QUIC chová velmi podobně jako svazek nezávislých TCP+TLS spojení,[9] ovšem s podstatně menší režií. Společné šifrování a triviální zakládání proudů eliminují řadu výměn paketů a zrychlují komunikaci.

Popsané vlastnosti velmi vyhovují DNS. Počáteční inicializace spojení a nastavení parametrů šifrování, kvůli kterým jsou kritizovány protokoly TCP a TLS, je omezeno na minimum. Koncept nezávislých proudů je dobře využitelný pro jednotlivé dotazy. QUIC je zkrátka pro DNS dost vhodný protokol.

Teoreticky bychom pro jeho využití nic nepotřebovali. Definice DNS po HTTP už existuje a verze HTTP/3 přenáší své zprávy protokolem QUIC. Jenže balení DNS do HTTP znamená zbytečnou režii navíc. Proto vzniklo RFC 9250 DNS over Dedicated QUIC Connections, které zavádí jednodušší postup — přímočaré zasílání DNS zpráv protokolem QUIC.

Používá port 853, který byl přiřazen i DNS po DTLS. Tento konflikt v praxi příliš nevadí, protože se neočekává, že by se DoD významněji rozšířilo. Navíc QUIC dokáže sdílet společný port s jiným protokolem. Po dohodě obou stran lze použít i jiný port. Autoři zmiňují jako vhodný port 443, který používá HTTP/3 , takže bude všude povolen. Explicitně je zakázán port 53, aby nesváděl k nešifrované komunikaci.

Každý dotaz je kladen samostatným proudem. Má jej sám pro sebe, po zodpovězení se proud zavírá. Identifikátor v DNS zprávě musí být nulový, k párování dotazů a odpovědí slouží jen čísla proudů. Server na dotazy odpovídá v libovolném pořadí podle toho, jak má připraveny odpovědi. Například odpověď poskytnutá z vyrovnávací paměti může "předběhnout" odpověď na dřívější dotaz, kterou server teprve zjišťuje.

QUIC zahrnuje i zajímavý mechanismus jednoduchého ukončení spojení. Na začátku si obě strany dohodnou trpělivost — jak dlouho budou udržovat nečinné spojení. Jestliže po danou dobu není spojením přenesena žádná zpráva, automaticky se uzavře, aniž by si to komunikující strany dávaly nějak na vědomí. Díky jednoduchému obnovení spojení, kdy se pomocí 0-RTT dá položit rovnou další dotaz, to nic nestojí a dá se navázat, jako by spojení zůstalo aktivní. QUIC proto nemusí posílat žádné "udržovací" pakety, jejichž jediným cílem by bylo zachovat otevřené spojení.

DoQ vzniklo, stejně jako ostatní šifrovací varianty, zejména pro komunikaci koncových strojů s místními rekurzivními servery. Specifikace ale připouští i jeho použití mezi rekurzivním a autoritativním serverem nebo zónové přenosy. Malé režijní náklady QUIC činí takové využití myslitelným.

DNS v praxi

V této části se budeme věnovat praktickým otázkám provozování DNS a scénářům jeho použití. Necháme stranou otázky organizační, jako je získání domény a soustředíme se na záležitosti vlastního provozu serverů a klientů, vztahy mezi nimi a vybrané softwarové nástroje, které vám mohou být nápomocny.

Scénáře použití

Zkusme se nejprve podívat na několik typických situací pro nasazení DNS, jejich základní charakteristiky, vyplývající požadavky na vlastnosti DNS infrastruktury a doporučené postupy, jak je naplnit.

Pouze klienti

Velmi běžně se lze setkat s malými lokálními sítěmi obsahujícími několik DNS klientů. Typickým příkladem takové sítě je domácnost připojená k Internetu. Za přístupovým modemem se obvykle nachází bezdrátová a/nebo ethernetová síť s nepříliš velkým počtem komunikujících zařízení. Připojený uživatel obvykle nemá vlastní doménu a pokud ji má, provozuje její autoritativní servery jinde. Z pohledu DNS se připojení stroje chovají výlučně jako klienti.

Požadavky takového uspořádání nejsou nikterak velké — stačí, aby místní stroje dokázaly řešit DNS dotazy, pokud možno reychle a efektivně. V principu by nemusela obsahovat nic jiného než zmíněné koncové klienty, kteří by se obraceli na vnější DNS severy nabídnuté třeba poskytovatelem připojení. Takové uspořádání by ale jen stěží bylo rychlé a efektivní — rychlost odezvy DNS by závisela na vnějším připojení a jeho aktuální zátěži, efektivní by nebylo v žádném případě, protože dotazy by se neustále opakovaly.

Poku se má DNS chovat rozumně, je záhodno naplnit marketingové heslo "DNS cache do každé lokální sítě". Vřele doporučujeme umístit do této sítě jeden rekurzivní server s vyrovnávací pamětí a všechny místní klienty nasměrovat do něj. Díky tomu budou získané informace využívat opakovaně všechny místní stroje.

Otázkou je, kam tento rekurzivní server umístit. Hlavním požadavkem na něj je nepřetržitá dostupnost, proto nelze doporučit jeho běh na některém z běžných klientských počítačů, které bývají vypínány. Zbývají dvě základní možnosti — server může sídlit přímo v aktivním prvku, jímž je síť připojena k Internetu, nebo na vhodném serverovém stroji s nepřetržitým provozem.

Implementace rekurzivního DNS serveru v aktivním prvku je velmi běžná. Tuto funkci v sobě zpravidla zahrnuje přístupový modem, takže průměrná domácí síť instalovaná způsobem "koupil jsem si u poskytovatele tuhle krabičku, zapojil ji podle podle návodu a všechno funguje" používá přesně toto uspořádání. Přístupový modem pracuje jako rekurzivní DNS server a zároveň jako DHCP server, který místním strojům přiděluje (neveřejné) IP adresy a současně s nimi také instrukce, že s DNS dotazy se mají obracet na něj. To vše bývá obsaženo ve výchozí konfiguraci, takže se uživatel nemusí o nic starat a vše funguje "samo".

DNS server v aktivním prvku

dns v aktivnim prvku

Výhodou rekurzivního serveru v aktivním prvku je, že je k dispozici vždy, když prvek běží — tedy vždy, když je síť připojena. Také má ideální pozici z hlediska datových toků — dotazy a odpovědi beztak musí procházet tímto místem sítě. Na druhé straně se ale jedná o uzavřené řešení, o němž se mnoho neví a zpravidla nabízí jen minimální konfigurační možnosti. Chcete-li cokoli neobvyklého, pravděpodobně to jeho prostřednictvím nedokážete realizovat.

Podstatně bohatší možnosti vám nabídne rekurzivní server běžící na počítači, který místní síti poskytuje serverové služby. Můžete si vybrat program podle libosti a podle případných speciálních požadavků a máte jej daleko více pod kontrolou. Zaplatíte za to nutností provozovat v síti navíc serverový stroj a trochu datových přenosů navíc — dotaz je předán z klienta na server a následně ze serveru do Internetu.

Kterou z těchto základních cest zvolíte zpravidla záleží na velikosti sítě. Malé sítě (domácnost či kancelář) s pár počítači a třeba tiskárnou obvykle dají přednost jednoduššímu integrovanému řešení. Větší sítě nejspíš provozují server pro různé síťové služby a nebude je bolet, když přidají jednu navíc. Obvykle proto dají přednost flexibilnější variantě, kdy na něm zprovozní softwarový rekurzivní server.

Samostatný DNS server

samostatny dns server

Zcela speciální kategorii představují osamocené počítače. V době modemových připojení bylo takové uspořádání celkem běžné — v domácnosti či malé firmě byl jediný počítač připojený k internetu modemem po telefonní lince. Dnes počet solitérních instalací výrazně poklesl, přesto se s nimi lze stále setkat.

Zde odpodá sdílení vyrovnávací paměti mezi místními stroji — jakákoliv komunikace za hranice počítače musí projít (pomalou) linkou spojující jej s Internetem. Není proto nutností pořizovat lokální rekurzivní server, zato jevelmi cenná samotná vyrovnávací paměť. Tu si může spravovat samotný DNS klient — věnujte patřičnou pozornost nastavení DNS v operačním systému a ujistěte se, že používá vyrovnávací paměť. Pokud toho nelze dosáhnout, je na místě instalovat na koncový počítač alespoň jednoduchý rekurzivní server a resolveru jako adresu pro zasílání dotazu zadat odkaz na vlastní stroj (127.0.0.1 v IPv4 či ::1 v IPv6).

Klienti a autoritativní server

Pokud provozovatel koncové sítě zároveň drží doménu, někdy si ji chce spravovat sám a mít primární server pod kontrolou ve své síti. Server musí být z Internetu rozumně dosažitelný, což vyžaduje splnění dvou základních podmínek: musí mít veřejnou IP adresu a síť musí být připojena dostatečnou rychlostí.

Jestliže síť používá neveřejné IP adresy podle RFC 1918 a je celá viditelná pod jedinou veřejnou adresou přístupového prvku, který zároveň funguje jako NAT, na autoritativní server uvnitř raději zapomeňte. Teoreticky je samozřejmě možné nastavit v NAT pevná pravidla, že pakety přicházející na UDP či TCP port číslo 53 se předávají místnímu serveru, v praxi bychom ale takové řešení nedoporučili. Je nestandardní a choulostivé, pakety jsou během přenostu měněny, což nikdy není dobře, a navíc drobná konfigurační chyba může váš server znepřístupnit.

Druhým požadavkem je rozumná propustnost připojení k Internetu, a to v obou směrech. ADSL není v tomto případě šťastnou volbou, protože je výrazně asymetrické. Jeho přenosová rychlost ve směru z koncové sítě do Internetu je mnohem nižší — obvykle čtvrtinová až osminová — v porovnání s kapacitou směřující dovnitř sítě. Časté dotazy na autoritativní server a občasný přenos zóny na některý se sekundárních serverů mohou propustnost linky citelně zhoršit.

Když vaše síť nesplňuje tyto podmínky, doporučujeme na domácí autoritativní server rezignovat a raději jej postavit mimo koncovou síť. Jeho provoz můžete domluvit s poskytovatelem připojení nebo využít některý ze serverů specializovaných na hostování DNS. Zpravidla se dá dohodnout režim, kdy vlastní server provozuje jiný subjekt, data si však spravujete sami.

V síti s neveřejnými adresami či nepříliš rychlým připojením k Internetu lze nanejvýš uvažovat o neveřejném autoritativním serveru, kterému se budeme věnovat za chvilku. Pokud síť obsahuje veřejný autoritativní server, musí správce z hlediska DNS zajistit dvě funkce:

  • autoritativní server pro vlastní doménu,

  • rekurzivní server, který bude hrát roli sdílené paměti a řešit dotazy místních klientů.

Nároky na rekurzivní server odpovídají předchozí části, jež se věnovala čistě klientské síti. Pro autoritativní server nepadá příliš v úvahu možnost realizovat jej síťovým prvkem. Tyto implementace zpravidla autoritativní chování neumožňují. A upřímně řečeno, i kdyby umožňovaly, báli bychom se je pro podobný účel doporučit, protože se jedná o černé skříňky, o nichž kromě výrobce nikdo moc neví.

Nejrozumnější variantou je uhnízdit autoritativní server na stroj s nepřetržitým provozem, který obvykle kromě DNS poskytuje další síťové služby. Konkrétní software si vyberte podle libosti. BIND, NSD nebo Knot DNS to rozhodně zvládnou, ale v úvahu připaddají i jiné alternativy — základní informace o dostupných serverech najedete dále.

Zajímavou otázkou je, zda výše popsané dvě funkce DNS poskytovat jedním serverem, či zda je oddělit na samostatné zdroje. Autority se jednoznačně kloní k druhé variantě. Požadavky na autoritativní a rekurzivní server jsou jiné, obsluhují odlišnou skupinu klientů (autoritativní všechny, rekurzivní místní) a tomu odpovídá výrazně odlišná konfigurace. Pokud je zcela oddělíte, snížíte pravděpodobnost, že chybou v konfiguraci otevřete svůj rekurzivní server do světa nebo provedete něco podobného nešťastného. Ostatně většina implementací DNS serverů obě funkce ani nepodporuje. Třeba Knot DNS je čistě autoritativní, zatímco Knot Resolver je pouze rekurzivní.

O uspořádání "dva v jednom" byste měli uvažovat jen zcela výjmečně, například když máte všechny síťové služby realizovány jedním společným strojem a starat se o další by pro vás bylo z nějakého důvodu nepřijatelné. Například BIND dokáže pracovat jako rekurzivní i autoritativní server zároveň, příklad takové konfigurace je zde. Ještě jednou ale opakujeme, že ji vřele nedoporučujeme.

Příklad konfigurace smíšeného serveru
# místní počítače ####################################
acl doma_verejne {
    147.230.0.0/16;
    2001:718:1c01::/48;
};
acl doma_neverejne {
    10.0.0.0/8;
    fdd6:c246:22a9::/48;
};
acl doma { doma_verejne; doma_neverejne; };

# globální nastavení #################################

options {
    directory "/etc/dns";
    allow-query { doma; };
    recursion yes;              (1)
    notify primary-only;
    also-notify { 10.0.0.1; fdd6:c246:22a9::1; };
    rate-permit {
        responses-per-second 10;
    };
};

# primární zóny ######################################

zone "fm.tul.cz" {
    type primary;
    file "fm.tul.cz";
    allow-query { any; };
};

zone "nti.tul.cz" {
    type primary;
    file "nti.tul.cz";
    allow-query { any; };
};

# sekundární zóny ####################################

primaries tulserves { 147.230.16.1; };

zone "tul.cz" {
    type secondary;
    file "tul.cz";
    primaries { tulservers; };
    allow.query { any; };
};

zone "230.147..in-addr.arpa" {
    type secondary;
    file "230.147.in-addr.arpa";
    primaries { tulservers; };
    allow-query { any; };
}

# pomocné zóny #######################################

# localhost - neupozorňovat na změny
zone "localhost" {
    type primary;
    file "localhost";
    notify no;
};

# kořenové servery
zone "." {
    type mirror;
};
1 Tento řádek říká, že server je rekurzivní.

V každém případě je třeba věnovat patřičnou pozornost konfiguraci jednotlivých programů, na něž jsou kladeny odlišné požadavky. Autoritativní server musí odpovídat všem a musí být proto otevřený do celého Internetu. Naopak rekurzivní server by měl obsluhovat jenom místní stroje, ab znesnadňoval případné pokusy o podvržení falešných dat do vyrovnávací paměti a nedal se zneužít k zesilovaným útokům. Nastavení programů musí toto odlišné chování zajistit.

Neveřejný autoritativní server

Normální autoritativní server je odpovídajícím způseobem konfigurován, má k dispozici zónová data a je uveden v záznamech typu NS příslušné domény, aby se o něm všeobecně vědělo a klienti z celého internetu se na něj mohli obracet se svými dotazy. V některých případech může být žádoucí kromě těchto standardních serverů vytvořit také neveřejný autoritativní server. Takový server je ve své konfiguraci nastaven jako autoritativní pro vlastní doménu (či několik domén) a spolupracuje s ostatními autoritativními servery. Není však uveden v záznamech NS, takže se na něj neobracejí cizí stroje z dotazy — slouží jen těm, kteří o něm vědí a jsou odpovídajícím způsobem konfigurovány. Může se jednat jak o server primární, tak i sekundární.

Typickým kandidátem pro nasazení neveřejného sekundárního serveru je firma s několika pobočkami. Každá pobočka je připojena do internetu na jiném místě, dvě s nejlepší konektivitou provozují primární a sekundární server domény. Ostatní by v zásadě mohly být provozovány v čistě klientském režimu, jak je popsáno v první části této kapitoly. To by ale znamenalo, že v případě problémů s připojením přijdou o kompletní přístup k DNS. Jenže na DNS bývá závislá i vnitřní komunikace firmy a při jeho selhání třeba nepůjde tisknout na síťových tiskárnách nebo prohlížet informační systém, protože klientské počítače nedovedou převést odpovídající jména na IP adresy. Je velmi záhodno, aby vlastní doména fungovala dál i v případě, kdy je síť odříznuta.

Tuto vlastnosti nabídne právě neveřejný autoritativní server. Je nakonfigurován naprosto stejně jako regulérní sekundární server — obrací se na určený primární a stahuje si aktuální verzi zónového souboru, pokud došlo ke změně. Primární server o něm ví a je nastaven tak, aby mu dovolil zónové přenosy a upozorňoval na změny. Pokud by se přerušilo spojení této koncové sítě s Internetem, neveřejný autoritativní server v ní bude nadále poskytovat autoritativní odpovědi na dotazy směřující do vlastní domény.

Zárověň se bude opakovaně snažit navázat spojení s primárním, jak je definováno v záznamu SOA dané zóny. Pokud by odříznutí bylo dlouhodobé, nakonecc se přece jen vzdá a přestane DNS pro své zóny poskytovat. Než k tomu dojde, má správce sítě několik dní na vyřešení situace. Po celou dobu vlastní zóna pro místní klienty dostupná, jako by se nic nedělo. Jejich vzájemné komunikaci založené na jménech tedy nebude nic bránit. Kdyby lokální server byl pouze rekurzivní, bez autoritativního chování pro vlastní zónu, záznamy z ní by se z jeho vyrovnávací paměti postupně vytrácely v předem nepředvídatelném pořadí — záleželo by na jejich stáří v okamžiku výpadku.

Vzhledem k tomu, že v dané situaci hraje neveřejný autoritativní server roli určeného doplňku k vyrovnávací paměti pro DNS, nemá smysl uvažovat o jiném uspořádání, než jej provozovat společně s rekurzivním na jednom stroji, zpravidla jediným programem.

Další možné využití pro neveřejný autoritativní server je ukrytí primárního stroje. To může být zajímavé pro velmi zatížené zóny ne pro zóny velmi háklivé na svou bezpečnost. V takovém případě jsou v záznamech typu NS uvedeny jen sekundární servery, na než se obracejí všichni tazatelé. Naproti tomu primární server zůstává před veřejností ukryt v pozadí a jeho jedinou úlohou je poskytovat aktualizace serverům sekundárním. Jelikož zůstává ukryt v pozadí, je lépe chráněn před případnými útoky — z veřejně dostupných informací se o jeho existenci vůbec neví, firewall k němu po síti pustí jen sekundární servery.

Jinou situaci pro nasazení skrytého primárního server je použití specializovaného podepisovače pro DNSSEC. Pokud chcete svá doménová data podepsat, ale nemůžete či nechcete to dělat na primárním serveru, můžete jej ukrýt a mezi něj a veřejné DNS vložit program zajišťující automatické podepisování. Podrobnosti najdete v kapitole o DNSSEC. Jedná se o uspořádání podobné předchozímu, ovšem s jedním mezičlánkem navíc.

DNS hosting

Přinejmenším některé a někdy i všechny autoritativní servery pro vaše domény by měly být umístěny zcela mimo vaši síť. Důvodů pro takové rozhodnutí může být celá řada:

  • připojení vaší sítě nemá potřebné parametry, zejména propustnost a/nebo spolehlivost,

  • nemáte žádný vhodný server s nepřetržitým provozem a odpovídající systémovou péčí,

  • nemáte dostatečné znalosti ani odborný personál na provozování vlastního DNS serveru,

  • umístění serverů do zcela nezávislé části internetové infrastruktury zvyšuje robustnost.

Možnosti pro usídlení DNS serverů mimo vlastní síť bývají široké a je poměrně obtížné o nich psát obecně. Velmi často takovou službu nabízí poskytovatelé připojení či hostingových služeb. Jako první krok při průzkumu situace a rozhodování proto doporučujeme obrátit se na svého poskytovatele a zjistit, jaké možnosti a za jakých podmínek vám může nabídnout. Hostujete-li třeba svůj web server, často bývá k dipozici celý balíček služeb zahrnující také DNS.

Druhou základní možností je využít specializovaný DNS hosting. Takovou službu lze pořídit na komerční bázi (nebývá drahá), případně i zdarma. Nejjednodušší cestou k ní je porozhlédnout se v nabídkách registrátorů, kteří často kromě vlastní registrace domény umožňují i její hosting na svých serverech. Chcete-li ušetřit, případně své servery umístit zcela mimo českou republiku, zkuste se podívat na některý z přehledů DNS hostingových služeb zdarma, jako jsou:

Významnou výhodou těchto služeb je, že jsou umístěny zcela jinde v síťové topologii, vaše výpadky je neohrozí a pro vdálené uživatele mohou být dosažitelné významně rychleji. Za nevýhodu lze považovat, že jejich dlouhodobá podpora není jistá. Také dostupnost pro tuzemské uživatele nemusí být ideální.

Velmi důležitou otázkou je správa externího serveru. Věnujte dostatečnou péči průzkumu, jaká jsou omezení dané služby (Podporuje všechny typy záznamů? Komunikuje po IPv6? atd.), jakým způsobem lze server ovládat a spravovat jeho obsah, a to včetně zabezpečení těchto činností.

Pokud se rozhodnete využít pro sekundární server DNS hosting zdarma, doporučujeme raději vybudovat vybudovat dva u odlišných poskytovatelů. Primární server je samozřejmě ideální provozovat ve vlastní režii, případně umístit u některé domácí společnosti — regulátora, poskytovatele internetu či hostingu.

Otevřené rekurzivní servery

Podobně jako DNS hosting, řada společností provozuje otevřené rekurzivní servery, které odpoví na dotaz komukoli. Přesněji řečeno, otevřených resolverů jsou v Internetu miliony a jejichprovozovatelé o tom často ani neví, jen ledabyle nakonfigurovali své servery a umožnili jejich zneužití. Zde se ovšem budeme věnovat těm, které jejich správci provozují jako otevřené cíleně a s patřičnou péčí jako službu pro internetovou komunitu.

Otevřené servery jsou k dispozici široké komunitě uživatelů. Budete je potřebovat, pokud máte v síti jen samé klienty. Mohou se ale hodit, i když se v jednoduché koncové síti nachází místní rekurzivní server, třeba v přístupovém modemu. čsto bývá nastaven tak, aby neprovozoval plnohodnotné řešení dotazů, ale všechny přeposílal na pevně danou adresu. Funguje vlastně jako koncový resolver, ale přidává cache, kterou sdílí všichni místní klienti. Ke své činnosti potřebuje plnohodnotný rekurzivní server, kterému má své dotazy předávat. A konečně mohou se hodit i pro koncové klienty kdekoli pro experimenty nebo pro případy, kdy standardní řesšení DNS přestane fungovat, například kvůli technickým problémům nebo přetížení.

Tabulka 8. Vybrané otevřené rekurzivní servery
Provozovatel Ipv4 IPv6 Filtruje

Google

8.8.8.8

2001:4860:4860::8888

 — 

8.8.4.4

2001:4860:4860::8844

 — 

Cloudflare

1.1.1.1

2606:4700:4700::1111

 — 

1.0.0.1

2606:4700:4700::1001

 — 

1.1.1.2

2606:4700:4700::1112

nebezpečné

1.0.0.2

2606:4700:4700::1002

nebezpečné

1.1.1.3

2606:4700:4700::1113

nebezpečné a porno

1.0.0.3

2606:4700:4700::1003

nebezpečné a porno

OpenDNS

208.67.222.222

2620:119:35::35

nebezpečné

208.67.220.220

2620:119:53::53

nebezpečné

208.67.222.123

2620:119:35::123

porno

208.67.220.123

2620:119:53::123

porno

208.67.222.2

2620:0:ccc::2

 — 

208.67.220.0

2620:0:ccd::2

 — 

Quad9

9.9.9.9

2620:fe::fe

nebezpečné

149.112.112.112

2620:fe::9

nebezpečné

9.9.9.10

2620:fe::10

 — 

149.112.112.10

2620:fe::fe:10

 — 

Podle provozovatele lze otevřené rekurzivní servery rozdělit zhruba do tří skupin:

Poskytovatelé Internetu musí svým zákazníkům zajistit DNS, prot provozjí příslušné servery, případně si je nsamlouvají u vhodného partnera. Tyto servery budou nejspíš topologicky nejbližší a jejich odezvy tudíž nejrychlejší. Přístup může být omezen jen na zákazníky daného poskytovatele a jeho partnerů, jsou tedy otevřené jen částečně.

CZ.NIC od názvem ODVR (Otevřené DDNSEC Validující Resolvery) provozuje farmu volně přístupných serverů podporující bezpečnostní prvky (ověřování DNSSEC, šifrovaný přístup). Podrobnější informace a adresy pro nastavení najdete na adrese:

Globální otevřené resolvery jsou k dispozici celému Internetu. Nejpoužívanější z nich provozuje Google pod názvem Public DNS, existuje však několik dalších konkurentů. Mívají výběrové adresy, kdy pod jednou adresou vystupuje skupina serverů rozmístěných po celém světě. Lze proto očekávat rychlé odezvy. Nejznámější služby shrnuje tabulka výše, adresy dalších najdete na Wikipedii:

Některé z těchto služeb jsou prosté resolvery, které jednoduše zodpovídají dotazy, jiné nabízejí "přidanou hodnotu" a filtrují problematická doménová jména. Typicky taková, která byla zapojena do různých útoků (například falešné přihlašovací stránky) nebo nabízejí obsah pro dospělé (porno). Variantu služby si vybíráte sami podle IP adresy, kterou použijete. Například Cloudflare na adrese 1.1.1.1 nabízí čistý resolver, zatímco 1.1.1.2 filtruje nebezpečná doménová jména (v odpovědi posílá nulovou adresu) a 1.1.1.3 přidává navíc filtrování choulostivého obsahu (porna).

Návrh nasazení DNS

Než začnete instalovat a konfigurovat servery, je velmi záhodno si nejprve srovnat noty a udělat si jasno, co všechno budete od DNS chtít a jaké cesty pro dosažení těchto cílů opvažujete za nejlepší. Za samozřejmost lze považovat poskytnutí sdílené vyrovnávací paměti (tedy rekurzivního serveru) pro místní klienty. K němu však může přibýt celá řada dalších úloh.

V první řadě si sepište seznam domén, pro které hodláte provozovat autoritativní servery. U každé z nich rozhodněte, kde bude primární a kde sekundární server(y), zatím pouze v obecné rovině, zda na vlastním serveru či externě. Nezapomeňte na reverzní zóny pro adresní rozsahy IPv4 a IPv6, kterými disponujete. Do hry mohou vstoupit i sekundární servery pro cizí zóny, které se třeba rozhodnete vést pro spřátelené instituce.

Druhou zajímavou otázkou je, zda máte na DNS speciální požadavky. Hodláte provozovat dynamické DNS? Chcete vybrané či všechny zóny zabezpečit pomocí DNSSEC? Provozujete software pro správu počítačů a/nebo konfigurací, na nejž má být DNS napojeno? Chcete do vnitřní sítě poskytovat jiné záznamy než veřejnosti (například s neveřejnými adresami)? Všechny tyto aspekty mohou mít dopad na volbu softwaru, který hodláte pro své servery použít.

V ideálním případě by tato fáze měla skončit dokumentem, v němž shrnete všechny požadavky: Jaké domény a s jakými vlastnostmi hodláte autoritativně spravovat.

Následně navrhněte jejich rozdělení na konkrétní servery. Na základě seznamu požadavků a topologie své sítě si rozmyslete, kde a kolik DNS serverů bude záhodno provozovat a jaké úkoly z předchozího seznamu kterému přidělit. Tím si uděláte jasno, kolik strojů budete potřebovat a jaké schopnosti musí nabídnout.

Posledním rozhodnutím pak bude výběr konkrétního programu, který nasadíte. Požadavky z předchozích bodů mohou zúžit váš výběr a vyřadit nekteré potenciální kandidáty. Pokud bude serverů více, použijete pro všechny stejný program, nebo budete řešení diverzifikovat? V prvním případě si usnadníte správu, ve druhém zvýšíte robustnost celého systému. Svou roli mohou samozřejmě hrát vaše zkušenosti či přístup ke zkušenostem s provozováním toho či onoho konkrétního programu.

Vřele doporučujeme výsledný návrh zdokumentovat a dokument pokud možno konzultovat. Zejména pokud jste museli v některých bodech netriviálně rozhodovat, je rozumné poznamenat si pro a proti jednotlivých variant a důvody přijatého rozhodnutí. Usnadníte si tak situaci, pokud se po pár měsících či letech praxe rozhodnete svůj návrh přehodnotit a samýšlet se nad jeho případnou úpravou.

Teprve když máte jasno v rozdělení úkolů, pusťte se do instalace a konfigurace jednotlivých programů. Určitě nic nezkazíte, pokud si budete v dokumentu odškrtávat, co máte hotovo. A pokud se později rozhodnete své uspořádání DNS změnit, nezapoměňte připravit novou verzi jeho dokumentace.

Podpůrné programy

Úloha správce DNS je těžká a zodpovědná. (Předchozí větu zvýrazněte a doneste ukázat nadřízenému, až půjdete žádat o zvýšení platu.) Naštěstí existují různé programy a weby, kterými ji lze alespoň trochu usnadnit.

Než se do nich pustíme, zmiňme se o důležitém zdroji informací, kterými jsou záznamy (logy) o činnosti serverů. Oceníte je zejména při problémech a dohledávání jejich příčin. Doporučujeme ale sledovat je průběžně jako profylaxi. Najdete v nich časy důležitých událostí v životě serverů, jako jsou restarty, načtení zónového souboru, jeho přenost po síti, přijetí či odeslání upozornění na změnu v zóně. Za pozornost stojí i odmítnuté dotazy — pokud se jejich frekvence výrazně změní proti normálu, může to znamenat, že někdo zkouší na vaše severy útočit.

Za základní prostředek pro aktivní diagnostiku lze prohlásit obecné klienty, jimiž můžete zkoumat aktuální stav DNS a hledat příčiny problémů. Každý z nich umožňuje položit dotaz dotaz konkrétnímu serveru a ptát se na specifické záznamy, případně i s různými kombinacemi příznaků. V této souvislosti zmiňme RFC 8906 A Common Operational Problem in DNS Servers: Failure to Communicate, které rozebírá některé nešvary v chování DNS serverů. V kapitole 8 obsahuje sadu testů, jimiž zkontrolujete správnost chování svých serverů. Jsou zde uvedeny konkrétní příkazy s využitím programi dig, které zároveň poslouží jako ukázka jeho schopností a inspirace pro testování rafinovanějších dotazů.

Kromě obecných klientů existují i specializované nástroje. Mají na starosti diagnostiku a hledání chyb v datech či správu DNS dat, od níž si lze slibovat předcházení problémům. Ve zbývajících částech kapitoly se zkusíme podívat na vybrané kousky, které si podle nás zaslouží vaši pozornost. Lze je rozdělit do dvou základních kategorií, které z principuu mají odlišné přednosti a nedostatky:

  • Specializované programy je třeba nainstalovat, obvakle na některý z počítačů ve vaší síti, mohou ale vyžadovat instalaci přímo na testovaný DNS server. Díky tomu mají nadstandardní možnosti při přístupu k poskytovaným informacím a mohou kontrolovat i prvky, k nimž se veřejné stroje nedostanou. Nevýhodou je, že se o ně musíte starat — nainstalovat je, konfigurovat, aktualizovat a podobně.

  • Webové aplikace nabízejí velmi snadnou cestu ke kontrole DNS. Otevřete webovou stránku, zadáte do formuláře doménové jméno a za chvíli vidíte výsledky. Uživatelská přívětivost a snadnost použití jsou jejich hlavními devizami. Jejich možnosti jsou samozřejmě omezeny na informace, které vaše servery poskytují do Internetu — například si obvykle nemohou sáhnout na celou zónu a podrobit ji zevrubné analýze. Proto se on-line testy obvykle omezují na základní prvky domény — dostupnost a konzistenci jejich autoritativních serverů, případně elektronickou poštu a web. Máte-li paranoidní sklony, mohou vás trápit otázky, kdo všechno dostane k dispozici výsleky testování vaší domény a co s nimi dělá. Ale připoměňme, že vycházejí z veřejných informací, takže si je každý může opatřit sám a nezíská nic nadstandardního. Nicméne vřele doporučujeme případné odhalené problémy odstranit co nejrychleji.

Podívelme se na několik volně dostupných pomocníků.

Programy doprovázející server

Distribuce DNS serverů (budeme se jim podrobněji věnovat ve 4. části) obvykle obsahují i doprovodné programy, které pomáhají s jejich provozem. Zpravidla mezi nimi najdete tyto tři:

  • Pan řídící, který ovládá běh serveru a na váš pokyn nařídí třeba restart nebo nové načtení zónových dat.

  • Revizor konfigurace, který zkontroluje, zda je konfigurační soubor v pořádku.

  • Revizor zónových souborů, který prověřuje korektnost zónových dat.

První dva jsou specifické pro konkrétní server a pro tuto kapitolu nezajímavé. Formát zónových souborů je ovšem standardizován, takže program na jejich kontrolu lze používat univerzálně, bez ohledu na to, který konkrétní server provozujete.

Nejlepší podle našeho názoru je souputník server BIND nazvaný named-checkzone. Při spuštění mu povinně musíte předat dva parametry: název domény a cestu k jejímu zónovému souboru, který má zkontrolovat. Například:

$ named-checkzone nic.cz nic.cz.zone

Standardně kontroluje syntaktické chyby v zónovém souboru, jako jsou neznámé typy záznamů, neznámé třídy nebo chybně zapsané adresy. Upozorní také, pokud pro jméno existuje CNAME a zároveď jiný typ záznamu nebo kdzž se hvězdička vyskytuje jinde než jako nejlevější jmenovka. Navíc pomocí DNS ověřuje, zda ke jménům uvedeným v záznamech typu MX, NS a SRV existují adresy.

Má několik parametrů, kterými lze ovlivňovat jeho chování, nejspíš je ale nebudete potřebovat. Výstup je srozumitelný, je-li zóna v pořádku, skončí ohlášením jejího sériového čísla a strohým "OK". U odhalených problémů vypisuje název souboru, číslo řádku a popis nalezené chyby ve stylu:

nic.cz.zone:18: unknown RR type 'AHOJ'

U serveru NSD najete velmi podobný program nsd-checkzone. Volá se stejně, i prováděné kontroly jsou podobné. Nemá ale žádné volby a omezuje se čistě na syntaktickou kontrolu zónového souboru. Obsahují-li vaše zázanmy MX neexistující jméno, nepřijde na to. Chybové hlášení vypadá následovně:

error: tul-chyby.cz:18 syntax error
error: tul-chyby.cz:18: unrecognized RR type 'AHOJ'

A do třetice distribuce Knot DNS zahrnuje kzonecheck. Je chytřejší, pokud zónový soubor obsahuje $ORIGIN, převezme jméno testované domény z něj a na příkazovém řádku mu stačí název souboru. Chcete-li doménu zadat, použijte volbu -o. Ve výchozím stavu se omezí na strohé konstatovaná, zda byla kontrola úspěšná nebo ne. Volbou -v jej lze přepnout do podrobnějšího režimu, kdy vypisuje konkrétní varování a chyby, například:

error: [nic.cz.] zone loader, error in zone, file 'nic.cz', line 18
 (unsupported record type)

Obecně doporučujeme používat named-checkzone i v případě, že zvolíte jiný server než BIND. Umí toho nejvíc a jeho výstupy jsou přívětivější.

Zonemaster

Knihu vydává CZ.NIC, takže jistě nepřekvapí, že jako první z webových nástrojů popíšeme jím podporovanou službu. Jedná se o typického představitele webových aplikací, ke kontrole domény nepotřebujete nic jiného, než otevřít stránku:

zadat jméno domény, a stisknou tlačítko Start a chvíli počkat. Testy jsou poměrně zverubné, nicméně výsledek se dostaví obvykle během pár sekund.

Nejprve uvidíte stručný souhrn výsledků: Pokud je vše v pořádku, je příslušná sekce označena zeleným kolečkem. Obsahuje-li varování nebo chybu, změní barvu na žlutou nebo červenou. Klepnutí na kolečko nebo volba z menu pod přehledem zobrazí podrobnosti příslušné sekce — co se testovalo a s jakým výsledkem.

Výsledek kontroly webovou aplikací Zonemaster

zonemaster1

A co se vlastně testuje? Podívejme se podrobněji na jednotlivé sekce:

  • Systém: Informace o verzi a konfiguraci Zonemasteru.

  • Základ: Jsou autoritativní servery korektně uvedeny včetně odpovídajících slepujících záznamů?

  • Adresa: Jsou adresy serverů veřejné a korektně zavedeny do DNS včetně reverzních záznamů?

  • Konektivita: Testuje se dostupnost autoritativních serverů různými protokoly (IPv4, IPv6, UDP, TCP).

  • Konzistence: Jsou informace poskytované jednotlivými autoritativními server vzájemně konzistentní? Testuje shodu sériového čísla a parametrů zázanmů SOA a složení záznamů NS.

  • DNSSEC: Je zóna korektně chráněna DNSSEC s vhodnými parametry?

  • Delegace: Jsou autoritativní servery správně zavedeny do rodičovské zóny?

  • Jmenné servery: Chovají se jmenné servery korektně?

  • Syntaxe: Dodržují jména domény a jejich serverů pravidla?

  • Zóna: Analýza hodnot ze záznamu SOA a dostupnosti pro elektronickou poštu.

Zajímavou vlastností je prohlížení starších výsledků, které je k dispozici na kartě Výsledky. Najdete zde jména domén a časy předchozích testů a můžete si nechat zobrazit jejich výsledky. K dokonalosti chybí už jen možnost jejich vzájemného porovnání.

dnswalk

Program dnswalk je jednoduchý tesxtový nástroj v Perlu, který odvede obrovský kus práce. Kdybyste si na pustý ostrov směli vzít jen jeden program na kontrolu korektnosti DNS dat, doporučujeme tenhle. Program se bohužel již řadu let nevyvíjí, takže například nepodporuje IPv6, nicméně i ve stávající podobě je zdatným pomocníkem.

Pro jeho provoz budete potřebovat interpret jazyka Perl [10] a k němu modul Net::DNS. dnswalk má své stránky na adrese

kde najdete jeho distribuční soubor. Před spuštěním bude vyžadovat menší úpravu. dnswalk totiž stahuje k analýze celé zónové soubory, což autoritativní servery zpravidla nepovolují každému. Musíte proto v konfiguraci alespoň jednoho autoritativního serveru povolit zónové přenosy pro počítač, na němž hodláte program provozovat.

Základní použití je jednoduché — jako parametr mu na příkazovém řádku zadejte jméno domény, kterou má zkontrolovat. Musí být ukončeno tečkou, takže například:

$ dnswalk nic.cz.

Program si v DNS zjistí jména autoritativních serveů zadané domény a pokusí se od nich stáhnout zónový soubor. Pokud neuspěje ani u jednoho, skončí chybovým hlášením. Jinak se pustí do kontroly zóny. Testuje celou řadu prvků, některé nejběžnější chyby ilustruje následující příklad. Program upozorní, pokud záznamy obsahující v datech doménová jména (napr. CNAME či MX) vedou na neexistující jméno (badcname ve výpisu níže) nebo na jméno, ketré je samo odkazem na jiné (double v našem příkladu). Ozve se, pokud jméno obsahuje nepřípustné znaky (podrtžítko v raz\_dva), a prověřuje také existenci reverzních záznamů (u nás se provinil privat).

$ dnswalk nic.cz.
Checking nic.cz.
GEtting zone transfer of nic.cz. from a.ns.nic.cz...done.
SOA=a.ns.nic.cz contact=hostmaster.nic.cz
WARN: badcname.nic.cz SNAME neni.nic.cz: unknown host
WARN: double.nic.cz CNAME x.nic.cz: DNAME (to y.nic.cz)
WARN: raz_dva.nic.cz: invalid character(s) in name
WARN: privat.nic.cz A 10.11.11.10: no PTR record
0 failures, 4 warnings, 0 errors

Závěrečný řádek stručně shrnuje výsledky. Failures je počet serverů, u nichž se neúspěšně pokoušel získat zónový soubor. Ve výpisu jsou příslušné řádky označeny FAIL. Errors jsou vážné chyby, které ohrožují dostupnost DNS informací pro část doménového stromu nebo funkčnost některých služeb. Do této kategorie patří chybějící či vadné záznamy NS o autoritativních serverech, falešné delegace, chybějící záznam SOA a podobně. Jejich řádky jsou zahájeny BAD. Warnings pak zahrnuje méně podstatné problémy, které se typicky týkají je jediného záznamu. Příklady najete ve výše uvedeném výpisu, jejich řádky začínají WARN.

Tabulka 9. Nejvýznamější volby programu dnswalk
volba význam

-l

kontrolovat falešné delegace

-r

rekurzivně procházet podzóny

-a

kontrolovat duplicitní záznamy

-F

kontrolovat konzistenci reverzních záznamů

Činnost dnswalk lze ovlivňovat několika volbami. Ty nejdůležitější najdete v tabulce. Pokud se ve vaší doméně vyskytují vnořené zóny, určitě vás budou zajímat volby -l a -r. První z nich kontroluje falešné delegace (lame delegation) — ověří si, zda servery uvedené v záznamech NS poskytují autoritativní odpovědi pro danou doménu. Volba -r nařídí programu zkontrolovat i tyto vnořené zóny. Nemusíte se obávat, běh netrvá nijak extrémně dlouho. Například rekurzivní kontrola domény tul.cz (cca 200 zón zahrnujících dohromady 2 MB zónových dat) trvala 15 sekund.

Další dvě volby se týkají zostřené kontroly jednotlivých záznamů. -a hledá, zda se v datech nevyskytují duplicitní záznamy typu A. Po zapnutí -F už programu nestačí samotná existence reverzního záznamu pro adresu uvedenou v záznamu typu A, ale ověřuje, zda vede ke stejnému jménu, od kterého jste začali. Přísnější kontrola celého doménového podstromu by vypadala následovně:

$ dnswalk -r -l -a -F nic.cz.

Dále můžete volbou -i vypnout kontrolu nepřípustných znaků ve jménech, ale proč byste to dělali? -d zapne zobrazovací informaci o postupu programu, které dokonale zmatou jeho výstup. Lahůdkou je slibně znějící volba -m, která podle dokumentace kontroluje pouze záznamy změněné od minulého běhu dnswalk, ve skutečnosti ale nedělá vůbec nic. Program ji ignoruje.

Součástí ditribučního balíčku jsou i doprovodné programy makereports a sendreports. První zpracuje výstup programu dnswalk a připraví na jeho základě dopiy pro správce jednotlivých zón (adresy bere ze zánamů SOA). Druhý pak zajistí jejich odeslání. Můžete tedy připravit skript, kteý bude pravidelně kontrolovat stav jednotlivých zón a rozesílat správcům hlášení o problémech. Jeho příklad najdete v souboru do-dnswalk, který je součástí distribuce.


Ještě jeden ostrý test, tentokrát u sebe
$ dnswalk jr.lixis.cz.
Checking jr.lixis.cz.
Getting zone transfer of jr.lixis.cz. from dizzy2.chorche.net...failed
FAIL: Zone transfer of jr.lixis.cz. from dizzy2.chorche.net failed: REFUSED
Getting zone transfer of jr.lixis.cz. from dizzy.chorche.net...done.
SOA=dizzy.jr.lixis.cz	contact=jirka.lixis.cz.
BAD: jr.lixis.cz NS dizzy2.chorche.net: unknown host
WARN: basil.jr.lixis.cz A 46.253.99.42: no PTR record
WARN: foo.jr.lixis.cz A 46.253.99.39: no PTR record
WARN: kvm4.jr.lixis.cz A 46.253.99.41: no PTR record
WARN: lukas.jr.lixis.cz A 46.253.99.44: no PTR record
WARN: m1.jr.lixis.cz A 46.253.99.35: no PTR record
WARN: m3.jr.lixis.cz A 46.253.99.43: no PTR record
WARN: ordinace1.jr.lixis.cz A 192.168.106.25: no PTR record
WARN: ordinace1w.jr.lixis.cz A 10.17.19.4: no PTR record
WARN: ordinace2.jr.lixis.cz A 46.253.99.45: no PTR record
WARN: rtr-aero-nm.jr.lixis.cz A 46.253.99.41: no PTR record
WARN: rtr-aero-nm-wg.jr.lixis.cz A 10.18.25.1: no PTR record
1 failures, 11 warnings, 1 errors.

Tady je to katastrofa, BAD znamená, že neexistuje sekundární server nebo je špatně zapsán v nadřízené zóně. Omluvou je, že to je experimentální zóna pro pokusy, kde nedostupnost domény 3. řádu jr.lixis.cz z internetu nehraje příliš velkou roli.

dizzy2.chorche.net ve skutečnosti existuje, ale má jenom AAAA záznam a nikoli A, což program dnswalk nepozná, protože neumí IPv6.
Jirka Chráska.

Squish DNS Checker

Squish DNS Checker kontroluje konzistenci dat poskytovaných různými autoritativními servery . Je k dispozici jako volně použitelná služba s webovým rozhraním na adrese:

nebo si můžete stáhnout program dnstraverse [11] a provádět testy na vlastním stroji. Oba přístupy mají své klady — webová aplikace je pohodlnější, vlastní instalaci máte lépe pod kontrolou. Výsledky by měly být shodné.

Zadání dotazu pro Squish DNS Checker

squish

Squish DNS checker — výsledek kontroly

squish2

Nástroji zadáte doménové jméno a typ záznamu, který hledáte. On se následně pokusí získat odpověď a to všemi dostupnými cestami. Jestliže některá ze zón po cestě k řešení dotazu obsahuje čtyři autoritativní servery, zeptá se všech čtyř. Upozorňuje na případné nekonzistence v odpovědích a případné problémy, které se vyskytly při komunikaci s některým z nich. Je tedy užitečný zejména v situacích, kdy se DNS pro určité jméno chová nekonzistentně a potřebuje zjistit, odkud pochází chybné informace.

Na horním obrázku vidíte rozhraní této služby. Jednoduše zadáte doménové jméno, vyberete z menu typ záznamu a zakliknete, že nejste robot. Stisknutím tlačítka Create zahájíte kontrolu.

Základní podoba stránky s výsledkem je velmi jednoduchá — obsahuje přehled autoritativních serverů domény obsahující požadovaný záznam a u každého je uvedeno, jak na příslušný dotaz odpověděl. Zajímají-li vás podrobnosti, použijete nenápadný odkaz Traversal detail ve spodní části stránky. Příklad výstupu je na dolním obrázku.

Nad výsledky se objeví hierarchicky uspořádané grafické znázornění autoritativních serverů domén z dotazu. Na jednotlivých řádcích jsou uvedena jména dotazovaných autoritativních serverů. Ke každémuz nich je napravo připojena ikona. Zelené zatržítko znamená, že server dotaz zodpověděl a jeho odpověď je v tom případě zobrazena ve spodní části stránky. Takto se v příkladu na obrázku chovaly například server tul.cesnet.cz a bubo.tul.cz. Je-li u jména serveru zelená šipka, poslal pouze záznamy NS se servery podřízené domény. V tom případě zde grafické zobrazení stromu pokračuje jmény serverů, které dotyčný poslal. Příklady vidíte u serverů c.root-servers.net nebo b.ns.nic.cz a f.ns.nic.cz. Každý server je při zkoumání osloven jen jednou. Pokud se ve stromu objeví opakovaně, u pozdějších výskytů najdete informaci, že server byl testován dříve. Kliknutím na libovolnou z těchto ikon se otevře okno s kompletní informací o odpovědi dotyčného serveru.

Pomocí tlačítek show resolve a hide resolve si můžete otevírat a zavírat související větve stromu. Objevuje se u jmen pocházející z jiné domény, jako je například sekundární server tul.cesnet.cz. Dozvíte se z nich, jaké jsou cesty k odvození tohoto jména. Můžete tak zkontrolovat, zda nehrozí jeho nekonzistentní odvození.

Přes podrobné výsledky dotazu vede cesta i ke zobrazení geografickéo rozložení serverů a použitých programů. Slouží k tomu odkaz Server location and version information ve spodní části stránky s detaily průchodu doménovým stromem.

MX Toolbox

Mohli bychom ještě dlouho vypočítávat různé diagnostické nástroje pro kontrolu obsahu DNS, kterých je k dispozici opravdu mnoho, kvalita samozřejmě dost kolísá. Zmiňme ale jeden, který se trochu odlišuje. Jedná se o MX Toolbox, webovou aplikacu dostupnou na adrese:

Typ záznamu MX v názvu naznačuje, že kontrola se zaměřuje zejména na elektronickou poštu, nicméně není omezena jen na ni. V hlavním menu najdete dva relevantní nástroje: MX Lookup, který zkoumá především záznamy související s elektronickou poštou a obecnější DNS Lookup, který v základu vyhledá adresu k zadanému jménu. Výsledek vidíte na obrázku a nejspíš vás ničím neohromí.

Výsledek DNS Lookup z MX Tools

mxtoolbox1

Zajímavé to začne být po stisku tlačítka Find problems Provede se řada testů, rozdělených do několika tématických skupin. Kromě elektronické pošty se okntrolují záznamy důležité pro web i pro DNS samotné. Na konci vás čeká shrnutí podobné z obrázku dole. Zde odhalil (jako jediný), že kořenová zóna obsahuje jeden záznam typu NS pro zónu nic.cz navíc než zóna samotná. Také se mu nelíbí formát sériového čísla.

Problémy nalezené MX Tools pro www.nic.cz

mxtoolbox2

Obrázek obsahuje výsledky pro www.cstug.cz, které jsou o dost pestřejší. Je otázkou, zda chybějící záznamy pro SPF či DNMARC (více o nich dále) jsou považovány za chybu, nicméně MX Toolbox to tak dělá. Kliknutím na některou z kategorií v horní částí stránky si zobrazíte podrobné informace o jejich testech, včetně těch, kterými doména prošla úspěšně.

Problémy nalezené MX Tools pro www.cstug.cz

mxtoolbox3

DNSDiag

Předchozí programy se zaměřovaly na obsah DNS, jeho konzistenci a věcnou správnost. Sada nástrojů DNSdiag míří jinam, jejich cílem je klientská strana DNS. Umožňují jednoduše ověřit, zda a jak rychle vybrané servery odpovídají. I názvy jednotlivých nástrojů napovídají, že se jedná o analogie programů ping a traceroute, ovšem specializované na DNS. Najdete je na adrese:

Ke své činnosti potřebují Python a k němu dnspython a cymruwhois. Mnohé parametry jsou společné pro všechny programy a ovlivňují způsob komunikace s DNS servery. Například parametrem -e nařídíte, aby dotaz obsahoval rozšíření EDNS(0). Jelikož je valná většina současných klientů používá, doporučujeme přidávat -e automaticky a přiblížit tak tesovací dotazy co nejvíce reálnému provozu. Podobně pomocí -4 a -6 lze zvolit komunikační protokol IPv4 nebo IPv6 a -T umožní přejít na transportní protokol TCP.

Prvním z nástrojů je dnsping, který ověří dostupnost a rychlost odezvy DNS. Při nejjednodušším použití mu prostě zadáte doménové jméno, na které se má zeptat. Program použije výchozí DNS server podle konfigurace vašeho systému, desetkrát se zeptá na zázanm typu A pro zadané jméno a zobrazí, jak rychle dorazila odpověď. Vlastní odpovědi se nezabývá, jen parametry komunikace. Výsledek zobrazí zhruba následovně:

$ dnsdiag.py www.nic.cz
dnsping.py DNS: 127.0.1.1.:53.
hostname: www.nic.cz. rdatatype: A
35 bytes from 127.0.1.1: seq=0 time=3.116 ms
35 bytes from 127.0.1.1: seq=0 time=1.980 ms
35 bytes from 127.0.1.1: seq=0 time=1.670 ms
35 bytes from 127.0.1.1: seq=0 time=1.808 ms
35 bytes from 127.0.1.1: seq=0 time=1.730 ms
35 bytes from 127.0.1.1: seq=0 time=1.671 ms
35 bytes from 127.0.1.1: seq=0 time=1.614 ms
35 bytes from 127.0.1.1: seq=0 time=1.691 ms
35 bytes from 127.0.1.1: seq=0 time=1.689 ms
35 bytes from 127.0.1.1: seq=0 time=1.508 ms
--- 127.0.1.1 dnsping statistics ---
10 requests transmitted, 10 responses received, 0% lost
min=1.508 ms, avg=1.848 ms, max=3.116 ms, stddev=0.462 ms

Dotazy lze samozřejmě směrovat na konkrétní server, posluži k tomu parametr -s následovaný jménem nebo IP adresou DNS serveru. Typ dotazovaného záznamu lze změnit parametrem -t.

Upřímně řečeno, při základním použití není dnsping až taková výhra. K otestování, zda DNS funguje, poslouží obvyklé systémové nástroje jako dig nebo nslookup. Ale může se hodit pro rozsáhlejší měření, například pokud máte pocit, že spolehlivost DNS pokulhává nebo rychlost odezvy výrazně kolísá. V tom případě se vám bude hodit volba -c následovaná počtem opakování. Nechcete-li vidět výsledky jednotlivých dotazů, ale jen celkovou statistiku, přihoďte -q.

$ dnsping.py -c 100 -s 8.8.8.8 -q www.nic.cz
$ dnsping.py -c 100 -s 8.8.8.8 -q -T www.nic.cz

Program dnstraceroute zobrazuje, kudy vede cesta Internetem k výchozímu nebo vámi určenému DNS serveru. Funguje podobně jako traceroute — posílá DNS dotazy, kterým v IP omezuje počet "skoků" a z příchozích chybových hlášení o zahozených paketech, které toto omezení vyčerpaly, sestavuje trasu k danému cíli.

Rozdíl spočívá v tom, že traceroute posílá ICMP zprávy, zatímco dnstraceroute DNS dotazy. Zajímavé jsou především situace, kdy se výstupy těchto dvou programů rozejdou. To signalizuje, že DNS dotazy jsou sítí směrovány jinak než ICMP datagramy a může být příznakem nestandardního zpracování DNS. Ideální je tedy používat oba trasovací programy a znervóznět, pokud se nalezené trasy budou lišit.

Vyhledání cesty od vašeho stroje k 8.8.8.8 zajistí

$ dnstraceroute.py -s 8.8.8.8 www.nic.cz

Třetím nástrojem ze sady je dnsetval, jehož úkolem je vzájemné porovnání několika serverů- Každému z nich položí opakovaně zadaný dotaz (implicitně desetkrát, lze změnit parametrem -c) a zobrazí základní statistiky — průměrnou, minimální a maximaální dobu odezvy a poměr dotazů, které zůstaly bez odpovědi.

Adresy serverů mu připravíte do textového souboru v jednoduchém formátu — na každém řádku bude jedno jméno nebo adresa serveru, který chcete otestovat. Název souboru pak předejte za parametrem -f. Součástí distribuce je soubor public-servers.txt s adresami několika veřejných DNS serverů. Jejich srovnání pro běžný dotaz typu A by zajistil příkaz:

$ dnseval.py -f public-servers.txt www.nic.cz

Výstup dnseval je poměrně minimalistický. Lepší služby při měření rychlosti zajistí následující program.

DNS Benchmark

Sada DNSDiag popsaná v předchozí části obsahuje i jednoduchý srovnávač výkonu několika serverů. Podstatně velkorysejší služby v této oblasti nabízí DNS Benchmark, jehož cílem je proměřit výkon a doporučit vám servery, které odpovídají nejrychleji. Jedná se o volně šiřitelný program pro MS Windows, který získáte na adrese:

Příjemnou vlastností je, že se nemusí instalovat, stačí jej rovnou spustit. Také obsluha je jednoduchá. Přejděte na kartu Nameservers, kde se můžete podívat na seznam testovaných serverů a případně pomocí tlačítka Add/Remove upravit. Já jsem například přidal adresu svého domácího rekurzivního serveru unbound. Tlačítkem Run Benchmark pak spustíte měření, které trvá pár minut.

Výsledek vidíte na obrázku. Grafikou program sice uvízl v hluboké minulosti, ale je nadále udržován. U každého testovaného serveru zobrazuje trojici naměřených hodnot: červeně je doba odezvy pro záznamy, které měl ve vyrovnávací paměti, zeleně odpovědi, které v ní neměl a modře pro jména z domény com.

Uživatelské rozhraní programu DNS Benchmark (pod Wine na Linuxu)

dns bench2

Vidíte, že paradoxně vyhrál rekurzivní server unbound na OpenBSD routeru před lokálním
rekurzivním serverem na mnohem silnějším lokálním počítači a všemi ostatními otevřenými servery.

Servery řadí od nejrychlejších k pomalejším podle doby odezvy pro záznamy z vyrovnávací paměti. Servery, které váš systém používá, jsou zvýrazněny. Na předních místech nejspíš najdete obvyklé podezřelé, o nichž jsme mluvili v předchozí části. Velké otevřené servery se zkrátka snaží, aby byly dobře a rychle dostupné. Je to jejich hlavní konkureční výhoda.

Na kartě Conclusions najdete komentované výsledky pro počítač, ze kterého jste testovali. Dozvíte se, zda máte řešení DNS nastaveno dobře (více serverů, rychle dostupných a spolehlivých), případně doporučení, jak je vylepšit.

Pihou krásy programu je, že nepodporuje IPv6. Můžete sáhnout po konkurenčním programu namebench, který sice IPv6 umí a je kdispozici i pro Linux, ale jeho vývoj skončil v roce 2010. Některé významné otevřené servery v něm proto chybí, další mají neplatné adresy, zkrátka DNS Benchmark je podle našeho názoru lepší.

Programy pro správu DNS dat

V předchozích částech jsme popsali několik různých nástrojů pro testování a zkoumání DNS. Hodí se jak k řešení problémů, tak i k jejich včasnému odhalování, ještě než se projeví ve větší míře. Vůbec nejlepší variantou však je problémům předcházet a pokud možno mít zónová data stále správná a konzistentní.

Pokud je udržujete ručně, je bezchybnost dat obtížně dosažitelným ideálem. Máte šanci, jen pokud je zóna malá a konzervativní, takže se mění jen zřídka. Jestliže ji měníte řekněme jednou týdně, je jen otázkou času, kdy uděláte chybu. Jednou z možností, jak tomu předejít, je použít program pro spávu DNS.

Jeho základem je databáze informací o evidovaných počítačích. Program ji umožňuje měnit, a na základě provedených úprav pak generuje nové zónové soubory. Automaticka zajistí jejich správnou syntaxi či generování sériového čísla. Garantuje také vytvoření reverzních záznamů. Už jen díky těmto vlastnostem eliminuje valnou většinu chyb vznikajících při ručních úpravách. Zda provádí i sofistikované testy (například výskyt CNAME v datech záznamu) už záleží na schopnostech toho kterého konkrétního programu.

Jejich výběr je docela široký. Poměrně často bývají spojeny se správou DHCP, protože obě služby s výhodou využijí společnou databázi počítačů, ze které pak konzistentně generují data pro DHCP i DNS server. Tato problematika už dost výrazně přesahuje téma naší knihy a nemá cenu se tu rozepisovat o konkrétních vlastnostech či ovládání toho kterého programu. Odkážeme proto na příslušnou stránku Wikipedie, kde najdete přehled programů pro správu DNS dat a jejich vlastností:

Jako nejnadějnější se jeví NicTool (www.nictool.com) a Admin4 (www.admin4.org). Existují i hardwarová řešení, například Sapphire Appliance, jehož dodavatelem je Cygna Labs.

Prohlédněte si schopnosti dostupných nástrojů a pečlivě vybírejte. Předem upozorňujeme, že mají i své mouchy a různá omezení, která vám znepříjemní jejich používání či je dokonce zcela vyřadí z vašich úvah. Pokud je vaše síť velká a/nebo požadavky výrazně nestandardní, bude možná nejjednodušší cestou npsat si přísušný program vlastními silami. Je to sice pracné, ale můžete si jej vytvořit přesně podle vlastních potřeb.

DNS servery

Čtvrtá část je orientována zcela prakticky. Poskytuje úvod do konfigurace konkrétních programů, jimiž lze implementovat DNS servery. Po úvodní kapitole, která zahrnuje obecné principy a rozhodnutí, jež jsou univerzální, následují kapitoly věnované konkrétním programům.

Nebylo naším cílem — a v daném rozsahu to ani není myslitelné — poskytnout kompletní návody k popsaným programům. Většina z nich by vystačila na samostatnou knihu. Snažlii jsme se nabídnout bezbolestný úvod, shrnout stručnou historii a klíčové vlastnosti jednotlivých produktů. U každého z programů opisujeme vždy základní konfigurační kroky, tedy jeho použití v roli autoritativního, rekurzivního a případně smíšeného serveru. Navazuje popis náročnějších konfiguračních partií.

Doufáme, že vám tato část pomůže zorientovat se v dostupných produktech a udělat si základní obrázek, který by se mohl hodit pro vaši praxi. Všechny programy jsou volně šiřitelné, nic tedy nebrání jejich vyzkoušení. Pokud se rozhodnete po některém sáhnout, bude třeba dostudovat podrobnosti v jeho dokumentaci.

Obecně ke konfiguraci serveru

Než se pustíme do konkrétních programů pro implementaci DNS serveru, podíváme se na několik obecných témat, společných pro všechny. Vyžadují rozhodnutí nebo aktivitu správce, ale neváží se ke konkrétnímu programu. Patří mezi ně například struktura zónových souborů nebo obecná koncepce poskytování DNS. Jim se budeme věnovat v této počáteční kapitole.

Typ serveru a obsluhovaná komunita

V první ředě je potřeba si ujasnit, jaká bude vlastně role příslušného serveru, jaké informace má poskytovat a komu. Pokud stavíte DNS server pro koncovou síť, jež nemá žádnou vlastní doménu, je situace velmi jenoduchá — potřebujete rekurzivní server, který bude slloužit jako společná vyrovnávací paměť pro místní klienty. Bude poskytovat neautoritativní odpovědi do lokální sítě a nic víc.

Složitější situace nastává, pokud zárověň vlastníte svou doménu a potřebujete pro ni autoritativní servery. V takovém případě potřebujete zajistit následující:

  • Primární server by rozhodně měl být pod vaší přímou kontrolou. Zde budete editovat informace ve své zóně, je proto rozumné nechat si jej po ruce.

  • Sekundární server potřebujete aspoň jeden. Měl by být co nejnezávislejší na primárním, takže by se rozhodně neměl nacházet ve stejné síti. Zpravidla se dohodnout s poskytovatelem Internetu, že vám tuto službu zajistí, pokud možno v jiném uzlu sítě, než ke kterému jste připojeni. Jinou možností je vzájemná pomoc s jiným subjektem, kdy oni zajistí sekundární server vám a vy na oplátku zase jim. Tímto způsobem se dá relativně snadno umístit server i k jinému poskytovateli, ovšem tato cesta pravděpodobně nebude schůdná pro komerční subjekty. Třetím variantou je umístit svůj sekundární server u společnosti, která se věnuje cíleně DNS hostingu. Sečteno a podtrženo: svůj sekundární server spravovat nemusíte, je ale třeba najít pro něj vhodné umístění. Můžete také sami poskytovat sekundární server pro někoho jiného.

  • Rekurzivní server jako společná vyrovnávací paměť pro místní klienty bude potřeba v každém případě (ve větších sítích raději dva). Otázkou je, jestli jej spojit s autoritativním serverrem či nikoli. Obě varianty mají své přednosti a nedostatky. Rozdělení na dva servery umožňuje lepší zabezpečení služby a méně zatěžuje servery, ale zvyšuje náklady. Obecně lze doporučit pro menší sítě spíše řešení jedním serverem zajišťujícím všechny funkce, zatímco u větších sítí je lépe role rozdělit.

Rozhodně neuděláte chybu, když si jako výchozí krok připravíte inventuru úkolů pro vaše servery. Měla by zahrnovat seznam domén, pro které hodláte provozovat primární či sekundární server (nezapomeňte na reverzní), a přehled sítí, jimž mají poskytnout rekurzivní řešení dotazů.

Zónové soubory

Rozumná struktura zónových souborů s daty a s nimi souvisejících konfiguračních souborů může podstatně usnadnit orientaci správce a tím veškeré jeho snažení. Za samozřejmost lze považovat umístnění zónových souborů do samostaqtného adresáře, například /etc/dns nebo v podadresáři /etc vyhrazeném pro konfiguraci DNS serveru. Zda v zónových souborech vytvářet další adresářovou hierarchii závisí především na tom, kolik jich bude a jaké zóny representují. Někdo se přiklání k odlišení primárních a sekundárních dat rozdělením do podadresářů primary a secondary. Jinou strategií by bylo zavést pro každou doménu další úrovně samostatný podadresář, zejména v situaci, kdy jich obhospodařujete větší počet.

Pro vlastní jména zónových souborů naopak existuje universální a jednoduché doporučení: nejvhodnější je přidělit jim jména totožná se jménem zóny, popřípadě s vhodnou příponou. Zónový soubor pro tul.cz tedy ponese jméno tul.cz a reverzní zóna pro 147.230.0.0/16 bude uložena v souboru 230.147.in-addr.arpa.

Kromě zónových souborů, pro něž má váš server poskytovat autoritativní odpovědi, mu však musíme dát do vínku jména localhost a seznámit jej s kořenovými servery.

localhost

Jménem localhost je označovaná pevně daná adresa 127.0.0.1 (pro IPv4), respektive ::1 (pro IPv6), kterou počítač adresuje sám sebe. Používá se například pro služby, kde spolupracující programy vzájemně komunikují po síti, oba ale běží na stejném stroji. Převod jména localhost na tuto adresu by správně měl mít vyřešen každý počítač prostřednictvím /etc/hosts či analogického mechanismu. V reálném životě však dotazy na ně nebývají žádnou vzácností a server by je měl umět vyřešit. Proto je rozumné nastavit server jako autoritativní pro zónu localhost. Zónový soubor. obvykle pojmenovaný localhost nebo localhost.zone, obsahuje:

/etc/bind/pri/localhost.zone
$TTL 1W
@       IN      SOA     localhost. root.localhost.  (
                                      2008122601 ; Serial   (1)
                                      28800      ; Refresh
                                      14400      ; Retry
                                      604800     ; Expire - 1 week
                                      86400 )    ; Minimum
@		IN      NS      localhost.
@		IN	A	127.0.0.1

@		IN	AAAA	::1
1 Na těchto hodnotách příliš nezáleží, sekundární server pro localhost není.

Reverzní zóny pro localhost

Reverzní zóny se jménem localhost budou dvě, po jedné pro každý protokol. Pro IPv4 se jedná o zónu 0.0.127.in-addr.arpa

0.0.127.in-addr.arpa
$TTL    86400
$ORIGIN 0.0.127.in-addr.arpa.
@       SOA localhost.  root.localhost. (
            20200811500     ; na hodnotách příliš nezáleží,
            10800           ; žádný sekundární server neexistuje
            3600
            604800
            10800
            )
    NS  localhost.
1   PTR localhost.

Pro IPv6 by zónový soubor pro reverzní dotazy související s localhost mohl vypadat takto:

$TTL        86400
$ORIGIN     0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa.
@           SOA localhost. root.localhost. (
                2024012700  ; na hodnotách příliš nezáleží,
                10800       ; žádný sekundární server neexistuje
                3600
                604800
                108000
            )
        NS      localhost.
1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0     PTR localhost.

Kořenové servery

Zásadní úlohu v životě rekurzivního DNS serveru má znalost kořenových serverů. Soubor s informacemi o nich bývá pojmenován named.root, případně root.servers. Jeho obsah pochopitelně "přichází shora" — na adrese:

si můžeme ověřit, zda ve svém systému máme aktuální verzi. Pravda, změny jsou poměrně vzácné. Asi nejvýznamější za poslední roky je postupné přibývání IPv6 adres (záznamy AAAA).

Verze platná v době psaní měla následující obsah
;       This file holds the information on root name servers needed to
;       initialize cache of Internet domain name servers
;       (e.g. reference this file in the "cache  .  <file>"
;       configuration file of BIND domain name servers).
;
;       This file is made available by InterNIC
;       under anonymous FTP as
;           file                /domain/named.cache
;           on server           FTP.INTERNIC.NET
;       -OR-                    RS.INTERNIC.NET
;
;       last update:     January 24, 2024
;       related version of root zone:     2024012401
;
; FORMERLY NS.INTERNIC.NET
;
.                        3600000      NS    A.ROOT-SERVERS.NET.
A.ROOT-SERVERS.NET.      3600000      A     198.41.0.4
A.ROOT-SERVERS.NET.      3600000      AAAA  2001:503:ba3e::2:30
;
; FORMERLY NS1.ISI.EDU
;
.                        3600000      NS    B.ROOT-SERVERS.NET.
B.ROOT-SERVERS.NET.      3600000      A     170.247.170.2
B.ROOT-SERVERS.NET.      3600000      AAAA  2801:1b8:10::b
;
; FORMERLY C.PSI.NET
;
.                        3600000      NS    C.ROOT-SERVERS.NET.
C.ROOT-SERVERS.NET.      3600000      A     192.33.4.12
C.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:2::c
;
; FORMERLY TERP.UMD.EDU
;
.                        3600000      NS    D.ROOT-SERVERS.NET.
D.ROOT-SERVERS.NET.      3600000      A     199.7.91.13
D.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:2d::d
;
; FORMERLY NS.NASA.GOV
;
.                        3600000      NS    E.ROOT-SERVERS.NET.
E.ROOT-SERVERS.NET.      3600000      A     192.203.230.10
E.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:a8::e
;
; FORMERLY NS.ISC.ORG
;
.                        3600000      NS    F.ROOT-SERVERS.NET.
F.ROOT-SERVERS.NET.      3600000      A     192.5.5.241
F.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:2f::f
;
; FORMERLY NS.NIC.DDN.MIL
;
.                        3600000      NS    G.ROOT-SERVERS.NET.
G.ROOT-SERVERS.NET.      3600000      A     192.112.36.4
G.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:12::d0d
;
; FORMERLY AOS.ARL.ARMY.MIL
;
.                        3600000      NS    H.ROOT-SERVERS.NET.
H.ROOT-SERVERS.NET.      3600000      A     198.97.190.53
H.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:1::53
;
; FORMERLY NIC.NORDU.NET
;
.                        3600000      NS    I.ROOT-SERVERS.NET.
I.ROOT-SERVERS.NET.      3600000      A     192.36.148.17
I.ROOT-SERVERS.NET.      3600000      AAAA  2001:7fe::53
;
; OPERATED BY VERISIGN, INC.
;
.                        3600000      NS    J.ROOT-SERVERS.NET.
J.ROOT-SERVERS.NET.      3600000      A     192.58.128.30
J.ROOT-SERVERS.NET.      3600000      AAAA  2001:503:c27::2:30
;
; OPERATED BY RIPE NCC
;
.                        3600000      NS    K.ROOT-SERVERS.NET.
K.ROOT-SERVERS.NET.      3600000      A     193.0.14.129
K.ROOT-SERVERS.NET.      3600000      AAAA  2001:7fd::1
;
; OPERATED BY ICANN
;
.                        3600000      NS    L.ROOT-SERVERS.NET.
L.ROOT-SERVERS.NET.      3600000      A     199.7.83.42
L.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:9f::42
;
; OPERATED BY WIDE
;
.                        3600000      NS    M.ROOT-SERVERS.NET.
M.ROOT-SERVERS.NET.      3600000      A     202.12.27.33
M.ROOT-SERVERS.NET.      3600000      AAAA  2001:dc3::35
; End of file

Znalost adres kořenových serverů je nezbytným základem, bez ní rekurzivní server nemůže rozumně fungovat. Jejich adresy má ve své konfiguraci a při startu si je aktualizuje — poptává na adresách z konfigurace aktuální sadu záznamů NS pro kořenovou zónu. Pro tento krok se používá pojem inicializační dotazy (priming queries). Podrobněji se jim věnuje RFC 8109 Initializing a DNS resolver with Priming Queries.

Jeho vztah ale může být ještě bližší, může totiž i zastoupit a udržovat kopii kořenové zóny. Jedná se o jednu z cest, jak kořenovým serverům ulevit (tou další je například jejich poskytování na výběrových adresách). Statistiky totiž ukazují, že valná většina dotazů přicházejících na kořenové servery je nesmyslných. Poptávají se na neexistující domény nejvyšší úrovně, protože ty existující jsou ukládána do vyrovnávacíh pamětí a obslouženy rovnou.

Bude-li mít rekurzivní server kopii celé kořenové zóny, může i nesmyslné dotazy vyřídit sám.[12] Mechanismus popisuje RFC 8806 Running a Root Server Local to a Resolver. Rekurzivní server si podle něj udržuje aktuální kopii kořenové zóny. Získá ji například zónovým přenosem z vhodného zdroje a následně pomocí DNSSSEC ověří platnost všech záznamů. Jakmile má ověřenou kopii kořenové zóny, bude sáms sobě dělat kořenový server. Specifikace má dva základní požadavky:

  • server musí obsah zóny průběžně aktualizovat a

  • smí její záznamy poskytovat jen sám sobě, nikomu jinému.

V RFC 8806 najdete podrobnější popis, jak zónová data získat, i ukázky konfiguraci nejběžnějších serverů. Místní kopie kořenových serverů se stávají celkem populárními a lze očekávat, že konfigurace se bude zjednodušovat a některé servery budou toto nastavení obsahovat jako výchozí. Například program BIND od verze 9.14 umožňuje zcela minimalistickou konfiguraci popsaného mechanismu:

zone "." {
    type: mirror;
}

Ošetření nesmyslných reverzních dotazů

V různých zákoutích Internetu se používá řada IP adres, které nejsou "opravdovými" adresami a nemají sloužit ke směrování v rámci globální sítě. Typickými představiteli jsou privátní IPv4 adresy podle RFC 1918, unikátními lokální IPv6 adresy nebo třeba adresy používající dokumentační prefix pro IPv6 2001:db8::/32.

Tyto adresy nemají v globálním měřítku smysl a nedává proto žádný smysl klást veřejným DNS serverům dotazy na reverzní záznamy pro ně. Přesto je frekvence dotazů na záznamy PTR pro 1.0.0.10.in-addr.arpa a podobná jména znepokojivě vysoká.

Obranné mechanismy jsou popsányv trojici RFC, jimž se zde budeme věnovat. Začneme ale trochu od konce, protože se nacházíme v praktické kapitole. Pro správce běžného DNS serveru by neměly představovat žádnou zátěž navíc. Definované mechanismy jsou implementovány v soudobých rekurzivních serverech a implicitně zapnuty, takže by měly pracovat, aniž by se o to správce explicitně zasloužil. Doporučujeme jen provést jednoduchý test a položit stupidní reverzní dotaz, například:

# dig -x 10.0.0.1
# dig -x 2001:db8::1
Linux dig
$ dig -x 10.0.0.1

; <<>> DiG 9.16.1-Ubuntu <<>> -x 10.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 38535
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;1.0.0.10.in-addr.arpa.		IN	PTR

;; Query time: 0 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: So led 27 23:41:21 CET 2024
;; MSG SIZE  rcvd: 50

$ dig -x 2001:db8::1

; <<>> DiG 9.16.1-Ubuntu <<>> -x 2001:db8::1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 54098
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 65494
;; QUESTION SECTION:
;1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa. IN PTR

;; Query time: 0 msec
;; SERVER: 127.0.0.53#53(127.0.0.53)
;; WHEN: So led 27 23:41:45 CET 2024
;; MSG SIZE  rcvd: 101
OpenBSD dig
# dig -x 10.0.0.1

; <<>> dig 9.10.8-P1 <<>> -x 10.0.0.1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 55087
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;1.0.0.10.in-addr.arpa.		IN	PTR

;; AUTHORITY SECTION:
10.in-addr.arpa.	10800	IN	SOA	localhost. nobody.invalid. 1 3600 1200 604800 10800

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sat Jan 27 23:44:16 CET 2024
;; MSG SIZE  rcvd: 109

# dig -x 2001:db8::1

; <<>> dig 9.10.8-P1 <<>> -x 2001:db8::1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 26393
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.b.d.0.1.0.0.2.ip6.arpa. IN PTR

;; AUTHORITY SECTION:
8.b.d.0.1.0.0.2.ip6.arpa. 10800	IN	SOA	localhost. nobody.invalid. 1 3600 1200 604800 10800

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sat Jan 27 23:44:19 CET 2024
;; MSG SIZE  rcvd: 160

V obou případech byste měli dostat prázdnou odpověď (sekce Odpověď neobsahuje žádné záznamy) označenou jako autoritativní (příznak AA), přestože přichází od rekurzivního serveru. Pokud je tomu tak, vaše síť nebude generovat nesmyslné reverzní dotazy a zatěžovat autoritativné servery domény arpa.[13] V opačném případě bude třeba upravit konfiguraci vašich rekurzivních serverů. V této části se dočtete, jak by se měly chovat.

Základem kamenem ochrany proti nesmyslným reverzním dotazům je RFC 6303 (též BCP 163) Locally Served DNS Zones, podle nějž by tyto dotazy měly autoritativně zodpovídat přímo rekurzivní DNS servery obluhující místní klienty. Konkrétně se jedná o reverzní zóny pro:

  • privátní IPv4 adresy podle RFC 1918:

    • 10.in-addr.arpa

    • 16.172.in-addr.arpa31.172.in-addr.arpa

    • 168.192.in-addr.arpa

  • speciální IPv4 adresy podle RFC 6890:

    • 0.in-addr.arpa

    • 127.in-addr.arpa

    • 254.169.in-addr.arpa

    • 2.0.192.in-addr.arpa

    • 100.51.198.in-addr.arpa

    • 113.0.203.in-addr.arpa

    • 255.255.255.255.in-addr.arpa

  • IPv4 adresy pro sdílený adresní prostor (přidáno později v RFC 7793):

    • 64.100.in-addr.arpa127.100.in-addr.arpa

  • nedefinovaná IPv6 adresa a lokální smyčka:

    • 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa

    • 1.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.ip6.arpa

  • lokálně přiřazené ULA:

    • d.f.ip6.arpa lokální linkové IPv6 adresy:

    • 8.e.f.ip6.arpab.e.f.ip6.arpa

  • dokumentační IPv6 prefix:

    • 8.b.d.0.1.0.0.2.ip6.arpa

Jelikož budoucí standardy mohou definovat další speciální adresy, zavedla IANA registr:

kde najdete aktuální přehled zón, jež by měly být obsluhovány lokálně. Všechny tyto zóny by měly být místním rekurzivním serverem zodpovídány autoritativně (se zapnutým příznakem AA v odpovědi) tak, jako by byly prázdné. Přesněji jako by jejich zónový soubor obsahoval následující záznamy:

@ 10800 SOA @ nobody.invalid. 1 3600 1200 604800 10800
@ 10800 NS @

Aktuální implementace rekurzivních serverů mají většinou požadované chování vestavěno a implicitně zapnuto. To znamená, že nemusíte nic nastavovat ani vytvářet příslušné prázdné zóny, server požadované chování zajistí sám. Nijak vám to samozřejmě nebrání některou z dotyčných zón použít a vložit do ní obsah podle své potřeby, například když využíváte neveřejné IPv4 adresy. Nezapomeňte ale zajistit, aby tyto informace vyly poskytovány jen místním klientům a neunikly do veřejného internetu.

Jestliže váš server nezajišťuje popsané chování, měli byste uvedené prázdné zóny vytvořit a nastavit sami. Poznamenejme, že u některých implementací můžete narazit se záznamem NS. Doporučená hodnota @ představuje jméno dané domény, k němuž ovšem neexistuje žádná adresa (záznam typu A nebo AAAA). Pokud si server kontroluje korektnost obsahu záznamů typu NS, výsledkem načítání bude chyba. V takovém případě upravte hodnotu záznamu NS, použijte localhost, nebo doménové jméno svého rekurzivního serveru.

Bohužel, frekvence nesmyslných rekurzivních dotazů, na které nemůže existovat odpověď, je stále dost vysoká. Například as112.ripe.net, což je jeden ze serverů, které je řeší, jich v polovině roku 2014 dostával 1500 — 2000 za sekundu. Pro jejich zvládání vznikl projekt AS112 popsaný v RFC 6304 a později aktualizovaný v RFC 7534 AS112 NAmeserver Operations.

Základní princip je podobný obsluze kořenové zóny — využívá se výběrové adresování (anycast) k rozkládání zátěže na velké množství serverů. Jako autoritativní servery pro zóny:

  • 10.in-addr.arpa,

  • 16.172.in-addr.arpa31.172.in-addr.arpa,

  • 168.192.in-addr.arpa,

  • 254.169.in-addr.arpa (přidanou v RFC 7534)

slouží server blackhole-1.iana.org a blackhole-2.iana.org, které pro ně poskytují výše zmíněné záznamy SOA a NS a jinak nic. Mají přiřazeny výběrové adresy, za nimiž se skrývají desítky serverů rozptýlených všude po světě. Konkrétně v České republice tuto službu poskytuje peeringové sdružení NIX.CZ (server as112.nix.cz). Ostatně RFC 3604 uvádí peeringová centra jako velmi vhodná pro umístění serverů.

Jelikož výběrové adresy v globálním měřítku vyžadují samostatnou položku ve směrovacích tabulkách, byl pro tento účel vytvořen specializovaný autonomní systém 112. Jeho jedinou úlohou je šířit směrovací informace o dostupnosti sítě 192.175.48.0/24, v níž se tyto servery nacházejí. Číslo tohoto autonomního systému se zároveň stalo názvem celého projektu. Aktuální informace včetně zapojených serverů, najdete na adrese:

Všimněte si, že AS112 nepokrývá všechny zóny určené v RFC 6303, ale jen ty, které odpovídají reverzním záznamům pro privátní IPv4 adresy podle RFC 1918 a které generují zdaleka největší provoz. V budoucnu samozřejmě může dojít k rozšíření počtu obsluhovaných zón.

V DNS datech zón AS112 figuruje ještě třetí jméno — jako primární server ve svých záznamech SOA obsahují prisoner.iana.org, což je opět výběrová adresa skupiny DNS serverů, které odmítají pokusy o dynamické aktualizace dat v nich.

Některé sítě mohou zaznamenat čilý provoz se servery projektu AS112, který při nevhodně nastavených parametrech bezpečnostních prvků může vést až k falešným poplachům. Situaci a doporučení pro její řešení se věnuje RFC 6305 I’am Being Attacked by PRISONER.IANA.ORG!

RFC 7535 AS112 Redirection Using DNAME později doplnilo možnost "potopit" do AS112 libovolnou doménu. Stačí pomocí záznamu DNAME přesměrovat na k tomu určenou doménu empty.as112.arpa. Jelikož byla přidána do AS112 později a ne všechny autoritativní servery AS112 ji podporují, bylo jejímu serveru přiděleno jméno blackhole.as112.arpa. Chová se stejně jako výše zmíněné, ale má o něco slabší pokrytí.

BIND

Berkeley Internet Name Domain neboli BIND je široko daleko nejpoužívanější implmentací DNS serveru. Svého času poháněl drtivou většinu serverů a svět DNS byl téměř monokulturou. Internetová komunita cíleně podpořila vznik alternativních programů, protože dominance BINDu představovala riziko. Pokud by se objevila jeho závažná chyba, měla by zcela devastující dopad. V současné době již zastoupení BINDu kleslo podo 50%, ale stále pohání více serverů než kterýkoli z jeho konkurentů.

BIND může pracovat jako autoritativní i rekurzivní server a zvládá i obě role současně. Platí a dlouho ještě platit bude, že pokud vám stačí znát jeden program pro DNS server, s BINDem určitě neuděláte chybu. Jeho základní platformou jsou unixové systémy, k dispozici je zdrojový kód i balíčky pro různé distribuce. Program udržuje arozvíjí nezisková společnost ISC (Internet Systems Consorcium). BIND bývá součástí unixových a linuxových distribucí, kromě toho je volně ke stažení na webu:

Masového rozšíření se dočkaly tři verze: BIND 4, 8 a 9, z nichž v současné době je udržována jen ta poslední. Neznamená to, že by třikrát došlo k výraznému rozšíření schopností programu. To se v případě BINdu odehrává při změně první číslice za desetinnou tečkou (v době vzniku tohoto textu je aktuální verzí 9.18). Autoři programu mění hlavní číslo verze pouze při zásadní změně vnitřní struktury programu. V roce 2009 byl zahájen vývoj BINu 10, který nedopadl dobře. Klíčovou verzí zůstává BIND 9, na nejž se soustředíme. Instalací programu nemá smysl se příliš zabývat. U systémů odvozených od Unixu bývá součástí distribuce. Pokud není implicitně nainstalován, stačí postupovat obvyklým způsobem, například doplnit balíček bind. Pokud byste z jakéhokoliv důvodu chtěli překládat ze zdrojového kódu, získáte jej na výše uvedené adrese.

Dlouhá léta býval přímo u ISC ke stažení i BIND pro MS Windows, ale jeho podpora skončila skončila s verzí 9.16. NAdále už binární distribuce pro MS Windows není podporována.

Základní konfigurace

Vlastní server se jmenuje named (name daemon), jeho hlavní konfigurační soubor proto nese název named.conf. Nejčastěji bývá umístěn ve standardním adresáři /etc.

Příkazy v něm obsažené jsou ukončovány středníky. Řada z nich může nést netriviální obsah, jako například sadu dílčích příkazů nastavujících jednotlivé parametry. Tento obsah je uzavřen do složených závorek { a }. Nezapomínejte, že za koncovou závorku také patří středník, i když to vypadá podivně.

Autoritativní server

Na nejvyšší úrovni se v konfiguračním souboru může objevit jen několik příkazů. Nejvýznamější z nich je nepochybně zone definující zónu, pro níž má tento server poskytovat určité chování. Jeho podoba je následující:

zone jméno_zóny {
    type typ;
    volby;
};

Jako jméno_zóny je uvedeno doménové jméno vrcholu příslušné zóny. Typ určuje vztah serveru k dané zóně a zároveň ovlivňuje, jaké volby pro ni budou k dispozici. Dostupné typy shrnuje tabulka, v širším měřítku jsou používány jen první tři z nich.

Tabulka 10. Typy zón pro konfigurační soubor named.conf
Typ Význam

primary

Jedná se o primární server pro danou zónu (též master).

secondary

Jedná se o sekundární server pro danou zónu (též slave). Volby musí obsahovat primaries s informací o primárním serveru.

mirror

Neautoritativní kopie zóny, ověří se DNSSEC.

hint

Speciální zóna obsahující adresy kořenových serverů.

forward

Dotazy směřující do této zóny se předávají serveru uvedenému v příkazu forwarders.

stub

Nedoporučuje se používat

delegation-only

Pokud pro zónu dorazí odpověď bez údajů o delegaci v sekci Autorita, chová se server, jako by oznamovala neexistující jméno.

Prostřednictvím voleb pak nastavíte další parametry dané zóny. Skoro vždy například budete potřebovat:

file "jméno_souboru";

jímž nastavíte jméno jejího zónového souboru. Pro zóny typu primary či hint sděluje, odkud má server načíst aktuální data. V případě typu secondary si pod uvedeným jménem uloží vlastní kopii zónového souboru na základě údajů získaných od primárního serveru. To teoreticky není nutné, zónu typu secondary můžete konfigurovat bez uvedení jména souboru. V tom případě si však server drží její data pouze v paměti a při startu musí nejprve získat od primárního serveru aktuální stav, než může začít poskytovat odpovědi. Je výhodnější uložit si lokální kopii, s níž při příštím startu začne a její obsah změní, až pokud se od primárního serverz dozví, že existuje novější verze.

Předvěďme si jednoduchou konfiguraci zóny, pro níž má server hrát roli primárního serveru. Řekněme, že se jedná o zónu fm.tul.cz a její data jsou uložena ve stejnojmenném souboru:

zone "fm.tul.cz" {
    type primary;
    file "tm.tul.cz";
};

Je záhodno, aby primární server posílal upozornění sekundárnímu při změně dat v zóně. Ve výchozím nastavení to dělá a jejich adresy si bere ze záznamů typu NS dané zóny. Necháte-li definici zóny ve výše uvedeném minimálním tvaru, bude primární server při změně posílat NOTIFY všem autoritativním serverům zveřejněným v DNS (kromě primárního podle záznamu SOA).

To lze samozřejmě změnit. Volbou also-notify můžeme přidat další upozorňované servery. A pokud volbě notify nastavíte hodnotu explicit, bude ignorovat obsah zóny a upozorňovány budou jen servery uvedené v also-notify. Řekněme, že chceme kromě oficiálních autoritativních serverů upozorňovat i lokální rekurzivní servery 10.0.0.1 a fdd6:c246:22a9::1, které jsou konfigurovány jako sekundární pro zónu fm.tul.cz a poskytují její data autoritativně místním klientům, jejich neveřejné adresy ale nejsou uvedeny v záznamech NS. Konfiguraci zóny bychom rozšířili takto (ve volbě notify explicitně uvádíme její výchozí hodnotu yes, abychom zdůraznili, že má být zachováno upozorňování serverů ze záznamů NS):

zone "fm.tul.cz" {
    type primary;
    file "fm.tul.cz";
    notify yes;
    also-notify { 10.0.0.1; fdd6:c246:22a9::1; };
};

Zde se poprvé setkáváme s volbou, jejíž hodnotou je seznam adres. Jak vidíte, celý seznam je uzavřen do složených závorek a každá z jeho položek je důsledně ukončena středníkem. Jednotlivé adresy mohou být IPv4 i IPv6. V některých případech mohou být součástí seznamu kromě konkrétních adres i jejich prefixy. Zapisují se v obvyklé podobě adresa/délka. Například všecny adresy, jež mají v prvních 24 bitech hodnotu 10.1.2, popíše prefix `10.1.2.0/24;.

Pro sekundární server je třeba kromě jména zóny, typu a souboru uvést ještě adresu (či několik adres) primárního serveru, kam se má obracet s dotaza na aktuální stav zóny. To zajistí příkaz primaries, jehož hodnotu je opět seznam adres, zpravidla obsahující jediný prvek. Součást named.conf, která by daný server nastavila jako sekundární pro zónu fp.tul.cz s primárním serverem 147.230.16.1, by vypadala následovně:

zone "pf.tul.cz" {
    type secondary;
    file "fp.tul.cz";
    primaries { 147.230.16.1; };
};

Poměrně často server poskytuje jako sekundární několik zón se stejným primárním serverem. Můžeme samozřejmě celkem snadno zkopírovat a upravit výše uvedenou definici, kolikrát chcete. Jenže takový postup je náchylný k chybám a pokud se primární server změnil, čeká vás otravná editace. Lepší je využít dvě příjemné vlastnosti BINDu: příkaz primaries můžete použít i na globální úrovni konfiguračního souboru a vytvořit tak pojmenovaný seznam primárních serverů. Jeho jméno uveďte jako první argument příkazu primaries. V jednotlivých zónách se pak můžete odkázat na takto definovaná jména.

Podívejme se na ucelenou konfiguraci server, který je primárním pro fm.tul.cz a nti.tul.cz a zároveň je sekundárním pro zóny tul.cz a reverzní 230.147.in-addr.arpa, které mají stejný primární server 147.230.16.1.

# definujeme si seznam primárních serverů pro tul
primaries tulservers { 147.230.16.1; };

zone "fm.tul.cz" {
    type primary;
    file "fm.tul.cz";
};

zone "nti.tul.cz" {
    type primary;
    file "nti.tul.cz";
};

# odkazujeme se na výše definovaný sezname tulservers

zone "tul.cz" {
    type secondary;
    file "tul.cz";
    primaries { tulservers; };
};

Jistě jste se dovtípili, že znak # zahajuje komentář. Bind podporuje hned tři různé formáta komentářů: od znaku # do konce řádku, od dvojice lomítek // do konce řádku nebo uzavřený mezi dvojice znaků /* a */, jako v Céčku:

# jednořádkový komentář
// jednořádkový komentář
/* zahájený
            a ukončený komentář */

Naše konfigurace se pomalu blíží stavu jako ze života, chybí jen pár doplňků. V první řadě je třeba se postavit k rekurzivním dotazům. Hlavní volby, které řídí zodpovídání dotazů, shrnuje tabulka.

allow-query od koho přijímá dotazy

allow-query-cache

komu poskytuje odpovědi z vyrovnávací paměti

recursion

má řešit dotazy rekurzivně?

Autoritativní server by měl odpovídat komukoli, ale neumožňuje rekurzivní řešení ani neposkytuje odpovědi z vyrovnávací paměti. K nastavení globálních voleb pro celý server slouží příkaz options

options {
    allow-query { any; };
    allow-query-cache { none; };
    recursion no;
};

Volbu allow-query lze použít i uvnitř zone a určit, komu budou poskytovány autoritativní odpovědi pro tuto zónu. Například lze omezit, že pro neveřejnou lokální zónu bude server odpovídat jen tazatelům z místní sítě.

Z bezpečnostních důvodů je žádouví omezit frekvenci shodných odpovědí zasílaných na adresy se stejným prefixem, aby server nebyl snadno zneužitelný pro zesilované útoky. K tomu slouží volba rate-limit s řadou parametrů. Tím základním je response-per-second, který nastaví počet dotazů za sekundu, po jehož překročení začne omezování odpovědí. Ve výchozím stavu se na každý druhý posílá odpověď s příznakem zkrácení TC, ostatní se zahazují. Tento poměr lze nastavit parametrem slip. V dokumentaci se dočtete, o dalších možnostech — přípustná frekvence může záviset na velikosti odpovědí, nastavení může být specifické pro doménu a podobně. Jednoduchá volba může vypadat následovně:

rate-limit {
    responses-per-second 10;
};

Server by také měl upozorňovat na změny v zónách. To je možné provést jako součást příkazů zone, jak jsme předvedli výše. Zpravidla však bude výhodnější nastavit i tuto vlastnosti globálně, protože velmi často spolu obsluhované zóny souvisí a server by se měl chovat ke všem stejně. Kdybychom však na globální úrovni nastavil notify yes, týkalo by se upozorňování všech zón. I těch, kde je náš server sekundárním a upozorňoval by své sekundární kolegy. To zpravidla není žádoucí, proto lze volbě notify přiřadit i hodnotu primary-only, která znamen, že má upozorňovat jen změny v zónách, pro něž je primárním.

Když ještě přihodíme zóny pro localhost a kořenové servery, dostaneme konfigurační soubor, který by mohl už v praxi sloužit:

options {
    direcory "/etc/dns";
    allow-query { any; };
    allow-query-cache { none; };
    recursion no;
    notify primary-only;
    also-notify { 10.0.0.1; fdd6:c246:22a9::1; };
    rate-limit {
        responses-per-second 10;
    };
};

# primární zóny ##################################
zone "fm.tul.cz" {
    type primary;
    file "fm.tul.cz";
};

zone "nti.tul.cz" {
    type primary;
    file "nti.tul.cz";
};

# sekundární zóny ###############################
primaries tulservers { 147.230.16.1; };

zone "tul.cz" {
    type secondary;
    file "tul.cz";
    primaries { tulservers; };
};

zone "230.147.in-addr.arpa" {
    type secondary;
    file "230.147.in-addr.arpa";
    primaries { tulservers; };
};

# pomocné zóny ################################

# localhost - neupozorňovat na změny
zone "localhost" {
    type primary;
    file "localhost";
    notify no;
};

# kořenové servery
zone "." {
    type mirror;
};

Možnost získat kompletní zónová data je brána jako bezpečnostní riziko. Proto bývá zvykem, že primární server tuto službu poskytuje jen serverům sekundárním, ostatní žadatele odmítne. Našim ukázkovým konfiguracím takové omezení chybí a bylo by dobré je doplnit.

Jednoduchým a často používaným řešením je výčet IP adres, ne něž se server ochoten odeslat kompletní zónu. Slouží k tomu allow-transfer, jehož hodnotou jsou přípustné adresy. Jakmile je v konfiguraci zóny (nebo serveru, pak se vztahuje na všechny zóny) přítomen, nikdo jiný už nedostane odpověď na požadavek AXFR nebo IXFR. Adresy lze zadávat přímo, nebo si raději vytvořit přístupový seznam sekundárních serverů a jen se na něj odkázat (k tomu se dostaneme později v sekci Rekurzivní server ). Stejné omezení poměrně často platí pro všechny obsluhované domény, proto se nabízí zařadit je do globálních voleb a případně změnit v doménách, jejichž politika se liší:

options {
    ...
    allow-transfer {
        195.113.233.250;
        10.0.0.1;
        fdd6:c246:22a9::1;
    };
};

Ochrana přístupu na základě IP adresy je všeobecně vnímána jako slabá a snadno prolomitelná. Lepší variantou je, aby se sekundární server prokázal digitálním podpisem. Vzhledem k tomu, že se jedná o vzájemnou komunikaci malého počtu strojů, které jsou si dobře známy, obvykle se používá podpis založený na symetrické kryptografii v záznamech typu TSIG. K tomu je potřeba, aby oba servery měly shodný klíč. V konfiguraci serveru je uložen třeba v podobě příkazu

key jméno { algoritmus; klíč; };

Pro vytvoření klíče jsou k dispozici dva nástroje. Jednodušší ddns-confgen, který rovnou vypíše příslušný úsek serverové konfigurace. Bez parametrů vytvoří klíč pro nejobvyklejší kombinaci kryptografických algoritmů HMAC + SHA256. Pochopitelně lze výběr ovlivnit.

Druhou alternativou je použití programu dnssec-keygen. Tentokrát je třeba algoritmy nastavovat pomocí voleb, dokumentace doporučuje následující tvar příkazu:

$ dnssec-keygen - hmac-sha256 -b 128 -h HOST jméno

Následně musíte vytvořit příkaz key v konfiguraci server a zkopírovat do něj vlastní data klíče ze souboru s příponou .private. Stručně řečeno, dns-confgen je výrazně jednodušší.

Máte-li připravený klíč, je třeba přimět servery s ním pracovat. Na straně sekundárního serveru to znamená vložit do konfigurace klíč a pomocí příkazu server nastavit, že při komunikaci s daným serverem mají být zprávy podepisovány určitým klíčem. V konfiguraci vlastní zóny se nic nemění, vše je v jejím okolí. Výřez z konfigurace sekundárního serveru pro doménu tul.cz by mohl vypadat takto:

key tulkey {
    algorithm hmac-sha256;
    secret "rpSaTtk6M9kfu7nKmYNhm1qP3HM0bt59LVJmzQU=";
};

server 147.230.16.1 {
    keys { tulkey; };
};
zone "tul.cz" {
    type secondary;
    file "tul.cz";
    primaries { 147.230.16.1; };
};

Na straně primárního server je opět třeba vložit klíč. Příkaz allow-transfer pak může místo adres obsahovat odkaz na klíč. Přenos zóny bude díky tomu povolen každému, kdo prokáže znalost některého z uvedených klíčů. Aby byla i komunikace ve směru od primárního serveru k sekundárnímu podepisována, přidáme příkaz server pro adresu sekundárního serveru 10.0.0.1:

options {
    allow-transfer { key tulkey; };
};

key tulkey {
    algorithm hmac-sha256;
    secret "rpSaTtk6M9kfu7nKmYNhm1qP3HM0bt59LVJmzQU=";
};

server 10.0.0.1 {
    keys { tulkey; };
};

zone "tul.cz" {
    type primary;
    file "tul.cz";
};

Rekurzivní server

V nejjednodušším případě budete vytvářet rekurzivní server poskytující sdílenou vyrovnávací paměť pro lokální stroje. Taková konfigurace ke svému životu mnoho nepotřebuje — vyčlenit adresář a poskytnout pomocné zóny pro localhost a kořenové servery. Chcete-li explicitně zdůraznit, že se jedná o rekurzivní server, můžete do globálních voleb přidat recursion yes. Ale není to nutné, protože hodnota yes je implicitní.

Nejdůležitější částí konfigurace je omezení počítačů, pro něž server bude ochoten řešit dotazy. Má dvě části — nejprve definujete seznam strojů vaší sítě a následně jej použijete ve volbě allow-query, která omezuje tazatele. K vytvoření seznamu počítačů slouží příkaz acl (access list) ve tvaru:

acl jméno { vyhovující_adresy };

Seznam je identifikován svým jménem, jehož prostřednictvím se na něj budete později odkazovat. Jednotlivé vyhovující adresy mohou být individuální adresy, častěji se však jedná o prefixy ve tvaru adresa/délka. Mohou se zde objevit i jména dříve definovaných seznamů. Řekněme, že v síti používáme veřejné adresy z rozsahu 147.230.0.0/16 a také neveřejné 10.0.0.0/8. Vytvořme seznam doma, který zahrne:

acl doma { 147.230.0.0/16; 10.0.0.0/8; };

Výhoda takového přístupu je zjevná — pokud by se později na struktuře domácích adres cokoli změnilo (například přidáme IPv6), stačí upravit definici seznamu a změna se automaticky projeví ve všech místech, kde se používá. Řekněme, že v některých částech konfigurace BINDu budeme nastavovat odlišná pravidla pro naše veřejné a neveřejné adresy. Pak by se hodilo vytvořit tři seznamy: domácí veřejné adresy, domácí neveřejné a následně je spojit do společného seznamu všech domácích adres:

acl doma_verejne {
    147.230.0.0/16;
    2001:718:1c01::/48;
};
acl doma_neverejne {
    10.0.0.0/8;
    fdd6:c246:22a9::/48;
}
acl doma { doma_verejne; doma_neverejne; };

Pak už stačí jen v globálních volbáchpoužít allow-query a jako parametr uvést seznam domácích adres. Tím nastavíte, že server přijímá dotazy pouze z adres vyhovujících tomuto seznamu, ostatní tazatelé (přicházející z veřejného Internetu) budou odmítnuti. Celá konfigurace serveru, který funguje výlučně jako rekurzivní pro místní stroje, by mohla vypadat takto:

# místní počítače ################################
acl doma_verejne {
    147.230.0.0/16;
    2001:718:1c01::/48;
};
acl doma_neverejne {
    10.0.0.0/8;
    fdd6:c246:22a9::/48;
}
acl doma { doma_verejne; doma_neverejne; };

# globální nastavení ###########################

options {
    direcory "/etc/dns";
    allow-query { doma; };
    recursion yes;
    notify no;
};

# pomocné zóny ################################

# localhost

zone "localhost" {
    type primary;
    file "localhost";
    notify no;
};

# kořenové servery
zone "." {
    type mirror;
};

Ověřování DNSSEC se řídí volbou dnssec-validation. Její výhozí hodnotou je auto, což znamená, že BIND ověřuje DNSSEC a využívá jako výchozí kotvu důvěry veřejný klíč kořenové zóny. Ten je součástí programu a je průběžně aktualizován mechanizmem podle RFC 5011. Dalšími možnostmi jsou yes, kdy kotvu musíte poskytnout sami, a no, pokud chcete ověřování z nějakého důvodu vypnout.

BIND samozřejmě umožňuje nastavit, že server nemá hledat řešení sám, ale místo toho má příchozí dotazy předávat rekurzivním serverům — například má-li omezený přístup k internetu nebo má využívat vyrovnávací paměť v jiném serveru. Základní pravidla definuje dvojice příkazů forwarders a forward. Rozhodující je první z nich, jež udává seznam adres serverů, na které se má dotyčný obracet. Pokud je prázdný (nebo není uveden), server dotazy nikam nepředává a řeší je rovnou sám. Hodnotou forwarders je buď seznam konkrétních adres, nebo jméno jinde definovaného přistupového seznamu.

Příkaz forward je brán v potaz, jen pokud je seznam forwarders neprázdný. Pak určuje režim předávání. Ma-li hodnotu first (což je výchozí nastavení) server nejprve zkouší oslovit servery uvedené ve forwarders a pokud se nedočká odpovědi, dotaz bude řešit sám. Jestliže má forward hodnotu only, má samostatné řešení zakázáno a je odkázán pouze na předávání dotazů zadaným serverům.

Pokud byste chtěli nastavit, aby server všechny dotazy předával výlučně na adresu 10.20.30.40, zajistila by to následující pasáž jeho globálních voleb:

options {
    ...
    forward only;
    forwarders { 10.20.30.40; };
};

Výchozí chování lze změnit pro konkrétní části doménového stromu. Do named.conf je třeba vložit zónu, jejíž jméno odpovídá koncovce, pro kterou mají platit speciální pravidla, a typ má hodnotu forward. V ní uvedené příkazy forward a forwarders nařídí, jak se má zacházet s dotazy, směřujícími do této částí doménového stromu. Pozor, hodnota forwarders se nedědí. Pokud zde příkaz neuvedete, nebo jej uvedete s prázdným seznamem adres, dotazy se budou řešit přímo bez předávání.

Kdybyste chtěli výše uvedenou globální konfiguraci předávání doplnit o dvě výjimky — dotazy směřující do nic.cz řešit přímo a dotazy do tul.cz předávat na adresu 10.50.60.70 — doplnili byste do named.conf tyto dvě zóny:

zone "nic.cz" {
    type forward;
    forwarders { };
};

zone "tul.cz" {
    type forward;
    forwarders { 10.50.60.70; };
};

Smíšený server

Zatím jsme popsali dva "čisté" přístupy ke konfiguraci serveru. Autoritativní odpověděl komukoli, ovšem neřešil dotazy rekurzivně. Rekurzivní server pak striktně omezil okruh oprávněných klientů a s jinými se nebavil. Můžete ale potřebovat, aby jeden server plnil obě role — poskytoval autoritativní odpovědi o svých zónách komukoli a rekurzivně řešit dotazy místních klientů.

Naštěstí lze volbu allow-query použít i v definici zóny. Spojíme proto obě konfigurace a u všech zón typu primary či secondary přidáme volbu allow-query { any; };, která umožní pokládat dotay komukoli. Výsledek by vypadal takto:

# místní počítače ####################################
acl doma_verejne {
    147.230.0.0/16;
    2001:718:1c01::/48;
};
acl doma_neverejne {
    10.0.0.0/8;
    fdd6:c246:22a9::/48;
};
acl doma { doma_verejne; doma_neverejne; };

# globální nastavení #################################

options {
    directory "/etc/dns";
    allow-query { doma; };
    recursion yes;              (1)
    notify primary-only;
    also-notify { 10.0.0.1; fdd6:c246:22a9::1; };
    rate-permit {
        responses-per-second 10;
    };
};

# primární zóny ######################################

zone "fm.tul.cz" {
    type primary;
    file "fm.tul.cz";
    allow-query { any; };
};

zone "nti.tul.cz" {
    type primary;
    file "nti.tul.cz";
    allow-query { any; };
};

# sekundární zóny ####################################

primaries tulserves { 147.230.16.1; };

zone "tul.cz" {
    type secondary;
    file "tul.cz";
    primaries { tulservers; };
    allow.query { any; };
};

zone "230.147..in-addr.arpa" {
    type secondary;
    file "230.147.in-addr.arpa";
    primaries { tulservers; };
    allow-query { any; };
}

# pomocné zóny #######################################

# localhost - neupozorňovat na změny
zone "localhost" {
    type primary;
    file "localhost";
    notify no;
};

# kořenové servery
zone "." {
    type mirror;
};
1 Tento řádek říká, že server je rekurzivní.

Doprovodné programy

Součástí distribuce BINDu je několik podpůrných programů, které se jeho správci mohou hodit. Najdete mezi nimi všechny tři základní klientské programy (dig, host i nslookup) popsané v části Podpůrné programy, i sadu programů pro podepisování zón a další DNSSEC operace. Zde uvedeme jen programy, které bezprostředně souvisejí s vlastním provozem serveru.

Kontrola konfigurace a dat

Pokud vás server neposlouchá, jak byste si představovali, může problém způsobit chyba v konfiguračním souboru nebo zónovém souboru. Situaci ještě komplikuje, že BIND inklinuje k tichému trpitelství a na některé chyby při svém startu žádným způsobem neupozorní, jen prostě nenačte danou zónu nebo zůstane u její předchozí verze. Pro jejich hledání máte k dispozici dvojici kontrolních programů.

named-checkconf prověří správnost konfiguračního souboru, který mu předáte jako parametr. Není nijak košatý a nabízí jen několik málo voleb. Z nich nejvýznamější je -z, která nařídí, aby zkusil načíst zónové soubory uvedené v konfiguraci. -t adresář pak před spuštěním kontroly změní kořen systému souborů na uvedený adresář. Poslouží, pokud server provozujete s přeneseným kořenem systému souborů (hezky česky chroot) a chcete konfiguraci ověřit ve stejném prostředí. Takže například kontrolu konfiguračního souboru nova.conf včetně zkusmého načtení zónových souborů zajistí příkaz:

$ named-checkconf -z nova.conf

Druhý kontrolní program se jmenuje named-checkzone a jak název napovídá, prověří zónový soubor. Má dva parametry: doménové jméno zóny a jméno jejího souboru. Takže například pokud data pro zónu nic.cz jsou uložena v souboru nic.cz.zone, ověříme je pomocí:

$ named-checkzone nic.cz nic.cz.zone

Netestuje se jen syntaktická správnost souboru, ale i jeho věcný obsah — zda záznamy MX, NS a SRV obsaují jména, pro něž skutečně v DNS existují záznamy typu A či AAAA. Program má myriádu voleb, ale upřímně řečeno je nejspíš nebudete potřebovat, protože implicitní chování dobře odpovídá tomu, co člověk při kontrole obvykle potřebuje.

Program named-checkzone lze volat i pod jménem named-compilezone, kdy slouží k uložení zónových dat v zadaném formátu (určeném volbami -F a -D ).

rndc — pan řídící

Pod tajuplným jménem se skrývá zkratka remote name daemon control, která naznačuje, že tímto programem můžeme přímo ovládat běžící server. Jedná se o klasický řádkový neinteraktivní program, kde příkaz pro server zadáváte jako parametr na příkazový řádek:

$ rndc příkaz

Pro úvodní seznámení se můžete podívat, jaký je aktuální stav vašeho serveru:

$ rndc status

version: 9.9.1-P1-RedHat-9.9.1-2.P1.el5
CPUs found: 4
worker threads: 4
UDP listeners per interface: 4
number of zones: 236
debug level: 0
xfers running: 0
xfers deferred: 0
soa queries in progress: 0
query logging is ON
recursive clients: 1/0/1000
tcp clients: 0/100
server is up and running

Dozvíte se verzi programu, počet spravovaných zón a některé další údaje. Asi nejčastějším případem využití rndc bude výzva serveru, aby načetl nová data po provedené změny. K tomu slouží:

$ rndc reload

Zajistí kompletní aktualizaci: server si načte konfiguraci i všechny zónové soubory. Můžete také cíleně načíst konkrétní zónu, když místo obecného reload použijete jaho konkrétní verzi reload zóna. Zóna se však obvykle nemění sama (přinejmenším bývá změna i v reverzní zóně), takže pokud váš server nevede opravdu velký počet zón, je jednodušší reload,

O něco úspornější je příklad reconfig, který načte konfigurační soubor a všechny nové zóny. Existujících zón si nevšímá, i kdyby se změnily. Hodí se tedy v případech, kdy jste serveru přidali do opatrování novou zónu a ve stávajících nic nezměnili. Po změně v zónovém souboru můžete také ručně přikázat, aby odeslal ostatním autoritativním serverem upozornění:

$ rndc notify zóna

Několik příkladů umožňuje podrobněji zkoumat činnost serveru. O status jsme se zmínili. Pomocí trace a notrace lze ovládat objem ladících informací, které o sobě server poskytuje. querylog zapne nebo vypne ukládání příchozích dotazů do protokolu o činnosti. dumpdb pak nařídí serveru, aby uložil aktuální stav svých dat do souboru. Parametrem můžeme řídit, která data vás zajímají: -cache (obsah vyrovnávací paměti), -zone (zónová data) nebo -all (vše).

Cache serveru lze vyčistit příkazem flush nebo z ní cíleně pomocí flushname jméno odstranit konkrétní jméno.


1. Existují i další, například se serverem NSD je distribuován drill, Knot DNS doprovázejí khost a kdig. Zmíněná trojice je ovšem standardní součástí operačních systémů, takže je nejsnadněji po ruce.
2. Například když má dotyčný stroj několik aktivních síťových rozhraní a na nich k dispozici různé rekursivní servery pracující s lokálními adresami. Máte-li náladu na divokou jízdu, zkuste RFC 6731 _Improved Recursive DNS Servers Selection for Multi-interfaced Nodes.
3. Stroj s MacOS nemám k dispozici.
4. V přesném znění "alespoň dvě vnitřní tečky".
5. Později byla reprezentace DNS zpráv ve formátu JSON definována v informativním RFC 8427 Representing DNS Messages in JSON, tato služba ale používá poněkud odlišnou reprezentaci.
6. Dostupné hodnoty samozřejmě po čase dojdou, takže se budou opakovat, ale počet hodnot je dostatečně velký na to, aby datagramy putující sítí mezi dvojicí komunikujících strojů nesly unikátní identifikátory.
7. Někdy dva, více jen opravdu vzácně.
8. Aby to bylo ještě veselejší, chybové zprávě příjemce se nedá úplně věřit. Partneři momentálně nemají kryptografický kontext, takže není jak ověřit, zda zpráva o chybějícím kontextu není podvržena. DTLS reaguje sledováním obou možností: pokusí se pokračovat v komunikaci, jako by chybová zpráva nedorazila, a zároveň zahájí proceduru k vytvoření kontextu. Pokračovat se bude cestou, na kteou přijde dříve odpověď, duhá se ukončí
9. Aby to bylo ještě trochu složitější, RFC 9221 An Unreliable Datagram Extension to QUIC přidalo možnost mít v QUIC i proudy nezaručující spolehlivý přenos, tedy cosi jako vnořené UDP. Výhodou je společné šifrování.
10. v Linuxu bývá součástí standardní distribuce, pro ostatní systémy jej lze získat na adrese https://www.perl.org . Vyžadovaný modul Net::DNS má svůj vlastní web https://www.net-dns.org, odkud jej lze stáhnout a ručně nainstalovat, pravděpodobně ale bude k dispozici v repozitáři jako instalační balíček. Na Debianu a jeho klonech je to snadné: $ sudo apt install dnswalk
11. Je k dispozici na adrese http://www.squish.net/dnstraverse/
12. Jinou možností, jak dramaticky snížit jejich počet, je ukládání a využívání záporných odpovědí.
13. OpenBSD rekurzivní server na rozdíl od Linuxového vrací v AUTHORITY SECTION nobody.invalid. Má již implementováno chování popsané níže.