DNS (Domain Name Service)

Tomáš Rebok, xrebok@fi.muni.cz


Obsah


Proč potřebujeme DNS?

Díky prudkému rozvoji počítačových sítí a vzniku Internetu se do popředí dostal síťový protokol TCP/IP. Pomocí tohoto protokolu se adresují jednotlivé počítače 4-bytovou (32-bitovou) adresou obvykle zapisovanou ve tvaru x.x.x.x (x je číslo 0-255). Takovéto adresy se však špatně pamatují, proto byly zavedeny adresy v tzv. doménovém tvaru. Adresa v doménovém tvaru se zapisuje jako několik slov, oddělených tečkami. Zápis je case-insensitive, kromě znaká může jméno obsahovat i znak '-'. Tomuto zápisu se také občas říká FQDN (= Fully Qualified Domain Name).

V době, kdy počet stanic zapojených do Internetu nebyl příliš velký a mapování jmen na adresy se dalo zaručit jednoduchým nástrojem, používal se soubor hosts.txt, který se distribuoval k jednolivým počítačům přes InterNIC (tzv. centrální registrace jmen počítačů). Pak nastal zlom, kdy už byl soubor velký a nebylo v lidských silách tento systém distribuce dále udržovat. Proto byl vymyšlen DNS.


Princip DNS

Domain Name Service je služba pro převod doménových názvů na IP adresy a opačně. Můžeme ji rozdělit na tři logické části:

Jmenné prostory tvoří hiearchickou stromovou strukturu. V kořeni jsou tzv. root-servers, jejichž seznam je zveřejňován na ftp.internic.net. Na nich jsou uloženy informace o nameserverech (registrovaných), na které jsou delegována práva spravovat subdomény .cz .edu .com atd. Stejným postupem se dostáváme až k listům.

Nameservery můžeme rozlišit z hlediska postavení v doméně na primární (informace má uloženy v master souboru), sekundární (informace si periodicky stahuje z primárního nameserveru) a cache-only (přeposílá dotazy a slouží jako cache) pro zónu. Další možné členění je na rekurzivní a iterativní (viz dále).

Resolvery - programy, které získávají informace z nameserverů.

DNS má architekturu klient/server - server odpovídá za svou část adresního prostoru (tzv. zónu), popřípadě může fungovat jako cache. Každá doména vždy musí mít alespoň jeden primární DNS server, a dále může mít několik sekundárních serverů, jež mají za úkol tyhle informace číst z primárního DNS.

Když server obdrží od klienta dotaz, podívá se, co ví o dané doméně, a v případě, že doména nespadá do jeho kompetence, vrátí odkaz na server, který je blíže hledanému dotazu, a klient musí svůj dotaz zopakovat (dokud se nedostane k DNS serveru dané domény). Toto chování se nazývá iterativní. Jinou možností je chování rekurzivní, kdy se DNS server sám ujme zjišťování odpovědi a výsledek si zapamatuje, kdyby se dotaz opakoval (tj. poté funguje jako cache). Tyhle odpovědi jsou, na rozdíl od odpovědí od primárních nebo sekundárních DNS, považovány za neautoritativní.

Další úlohou je převod IP adresy na doménový název, pro kterou slouží doména in-addr.arpa. Jednotlivé sítě jsou poddoménami této domény, IP adresa se v opačném pořadí bajtů napíše před doménu in-addr.arpa a dotaz na tuto adresu vrátí její doménový název. Například zjištění doménového názvu pro adresu 147.251.48.1 je řešeno jako dotaz na adresu 1.48.251.147.in-addr.arpa.


Software


ISC BIND - konfigurace, chroot

Program se šíří jak ve tvaru balíčků pro nejrozšířenější distribuce, tak ve formě zdrojových kódů. K překompilování a nainstalování slouží standardní trojice příkazů - ./configure; make; make install

Chroot - znamená, že určitý běžící program má za svůj kořenový adresář / například adresář /named. BIND se instaluje do chrootovaného prostředí, podobně jako ftp-server, z bezpečnostních důvodů. Pokud nám nějaký dobrák prolomí nějakou bezpečnostní díru v BINDu, dostane se jen do určeného podstromu adresářů. Dále budu předpokládat instalaci do adresáře /named.

Příprava adresáře

Protože provozovat named pod rootem není moc chytré z bezpečnostních důvodů, přidáme uživatele named se speciální skupinou named. Taky mu nedáme shell, protože se nikdy nebude logovat (resp. mu dáme shell např. /bin/false).
Dále je potřeba dodělat chrootovane prostředí:

Tímto máme připraveno chrootované prostředí pro BIND, do kterého jej můžeme nainstalovat. Více o tomto způsobu instalace se můžeme dovědět na http://www.tldp.org/HOWTO/Chroot-BIND-HOWTO-2.html.

Konfigurace BIND

Hlavní konfigurační soubor BINDu (named démona) se nachází v souboru /etc/named.conf (v chrootovaném prostředí to může být jinde - dále budeme předpokládat, že BIND máme nainstalován bez chrootu). Tento soubor říká, jakého typu server bude a které domény bude obhospodařovat. V sekci options jsou uvedeny globální volby - ve kterém adresáři jsou informace o zóně (každá zóna má jeden soubor), kterým serverům má na dotazy odpovídat a kterým nikoliv, zda se chovat rekurzivně nebo ne, atd. Konfigurace může vypadat například takhle:

options {
    directory "/var/named";  // adresar se zonama
                             // POZOR, diky chrootu se jedna o /named/var/named !
    forwarders { 10.0.0.1; } // pokud nevis, ptej se stroje s IP 10.0.0.1
    check-names master fail; // urcuje, jak se ma chovat v pripade chyby
    check-names slave warn;
    forward-only;
    allow-query { any; }     // povolit dotazy odkudkoliv
    allow-transfer { none; } // zakazat zonove prenosy
};

Dále pro každou zónu, o kterou se bude named starat, je nutno vytvořit příslušnou zone sekci, ve které řekněme vztah našeho servere k této zóně (tzn. jestli ji děláme primární nebo sekundární server) a ze kterého souboru se má načíst soubor se zónou. Například:

zone "lab.fi.muni.cz" {
    type master;           // primarni server
    file "lab.fi.muni.cz"  // konfigurace v /var/named/lab.fi.muni.cz
}

Reverzní záznamy pro podsíť IP adres vypadají následovně:

zone "0.0.10.in-addr.arpa" {  // vlastne delame primarni server
    type master;              // pro 'fiktivni' domenu 0.0.10.in-addr
    file "10.0.0"
}

Pozn.: Podrobný přehled příkazů najdeme na příslušné manové stránce (man named.conf).

A jak vlastně vypadají ony soubory se zónama, které můžeme nalézt v adresáři /named/var/named? Tyto soubory definují jednotlivé DNS záznamy vždy řádek po řádku v následujícím tvaru:
<domena> <platnost> <trida> <typ> <data>

<doména> musí začínat v prvním sloupci souboru a označuje jméno doménového záznamu. Pokud je prázdná, vezme se z předchozího řádku.

<platnost> udává, jak dlouho si server tuhle informací smí držet v cache.

<třída> je IN, říkající že záznam se týká Internetu. Touto volbou umožnili autoři použít DNS i mimo oblast převodu jmen na IP adresy.

Povinné položky <typ> a <data> popisují vlastní záznam; jako typ lze uvést:

Pozn.: Je dobré si uvědomit, že síť IP adres nemá vůbec nic společného s hierarchií doménových jmen. Můžeme mít počítač, který má cizí IP adresu a spadá do naší domény (geograficky odlehlé pracoviště, jiný ISP provider, ..), ale i opačně...

Příklad, jak může vypadat takový soubor se zónou:

$ORIGIN domena.cz.
@             IN   SOA  @ root.domena.cz. (2002101000 3H 15M 2W 1D)
              IN   NS   ns               ; autoritativni name servery
              IN   NS   ns.provider.cz.
              IN   MX   0 mailserver.domena.cz.

www           IN   A    12.34.56.78      ; info. o pocitacich
ftp           IN   A    12.34.56.79      ; v teto domene
news          IN   CNAME  odyseus.domena.cz.
...

Reverzní záznam pro podsíť 12.34.56.0 by vypadal následovně:

$ORIGIN 56.34.12.in-addr.arpa.
@             IN  SOA  @ root.domena.cz. (2002101000 3H 15M 2W 1D)
              IN  NS   ns.domena.cz.
              IN  NS   ns.provider.cz.
78            IN  PTR  www.domena.cz.
79            IN  PTR  ftp.domena.cz.
...

Pozn.: Jak vidíme, komentáře se v souborech se zónami píšou za znak ';'. Dále je důležité, zda za doménovým jménem napíšeme znak '.' či nikoliv. Pokud ji vynecháme, přidá se za námi napsaný řetězec ještě doména (viz příklad výše). V reverzních záznamech však toto uplatnit nelze - přidávala by se nám doména 56.34.12.in-addr.arpa, což nechceme.


Ladící nástroje

dig (Domain Information Groper) - provádí dns dotazy buď na servery z /etc/resolv.conf nebo na konkrétní dig @server jmeno.
Reverzní dotaz: dig @server -x 147.251.48.1

host - jednoduchá utilitka pro DNS dotazy
host jmeno [server]
reverzní dotaz: host ip [server]

nslookup


Odkazy, užitečná literatura

BIND - http://isc.org/products/BIND
djbdns - http://cr.yp.to/djbdns.html
nsd - http://www.nlnetlabs.nl
Life With DJB DNS - http://www.lifewithdjbdns.com
http://www.tldp.org/HOWTO/Chroot-BIND-HOWTO-2.html
About the DNS - http://www.dns.net/dnsrd
DNS HOWTO - http://www.tldp.org/HOWTO/DNS-HOWTO.html
DNS - http://linux.mikroservis.cz/dns.html
DNSSEC (Bezpečné DNS) - http://www.lupa.cz/clanek.php3?show=2845
Počítačová encyklopedie (DNS) - http://www.earchiv.cz/a98/a816k180.php3
DNS - smysl doménového systému a základní principy fungování - http://home.eunet.cz/rysanek/dns/dns.html
Computer Press - http://www.cpress.cz/knihy/tcp-ip-bezp/CD-1x/11.html
Internic - http://www.internic.net
http://www.iana.org/assignments/dns-parameters
RFC1033, RFC1034, RFC1035 na ftp.fi.muni.cz