DNS

Semestrální projekt do TPS

Autoři: Michal Čundrle, František Novák

Datum: 14.1.2004

    Určování počítače pouze pomocí IP adresy by bylo značně uživatelsky nepříjemné, proto se zavedlo označení počítače v textové formě. Uživatel si lépe zapamatuje jméno počítače, než jeho IP adresu.
    Pro převody IP adres na jména a opačně slouží name services (jmenné služby). Jejich nejprimitivnější variantou je tabulka jmen a IP adres v souboru /etc/hosts. Tato varianta už se dá použít pouze u malých sítí, které nejsou připojeny k Internetu. Dříve udržovalo středisko InterNIC na svém FTP serveru soubor HOSTS.TXT, který obsahoval seznam všech registrovaných počítačů. Každý administrátor si pak musel na každém počítači tento soubor obnovovat. Firma Sun Microsystems vyvinula síťový informační systém NIS, kde bylo možné zařadit tabulku hosts do síťové sdílené databáze. To umožnilo, že všechny změny v tabulce bylo nutné provádět pouze na NIS serveru. Ovšem tuto variantu bychom si při dnešní podobě Internetu dovedli dost těžko představit.
    Pro sítě zapojené do internetu se používá služba DNS (Domain Name Service). Standardní implementací DNS v unixech je BIND (Berkeley Internet Name Domain Server).

Tyto tři druhy jmenných služeb se dají kombinovat. To znamená, že při hledání jména je možné použít postupně všechny služby. Pořadí je definováno v souboru /etc/host.conf nebo v proměnné prostředí resolveru RESOLV_SERV_CONF. Službami mohou být hosts (tabulka /etc/hosts), bind (DNS) nsebo nis (NIS server).

Příklad souboru /etc/host.conf:
#/etc/host.conf
#Používame named, ale ne NIS v pořadí hosts,bind
order hosts,bind

BIND

    Bind je službou typu klient – server. Klient se v tomto případě nazývá resolver. Od verze 8 jsou podporovány nové služby (Dynamic update, notify,….) Změnil se i název a syntaxe konfiguračního souboru z named.boot u verze 4.9.X na named.conf ve verzi 8. Nejčastěji používanou unixovou implementací jmenného serveru BIND je démon named.

Jmenný server BIND je možno používat v následujících režimech:

primární (master) - Je zdrojem originálních informací o určité zóně. Tyto údaje má uloženy v diskovém prostoru, který musí administrátor zóny sestavit. Každá zóna musí mít svůj primární jmenný server.

sekundární (slave) - Je rovněž pro danou zónu autoritativní, avšak veškeré informace musí napřed získat přenosem po síti z příslušného primárního serveru. Je zálohou pro případ výpadku primárního serveru.

caching only -  Není autoritativní pro žádnou zónu, ale umí rekurzivní překlad. Výsledky dotazů  si po určitou dobu uchovává ve své paměti (cache).

Root name server

    Root name server je name server zodpovědný za některou kořenovou doménu (cz,sk,uk,edu,net,...). Neprovádí rekurzivní překlad, aby nebyl přetěžován.

Forwarding a slave servery

    Tato konfigurace se používá v případech, kdy jsme k Internetu připojeni pomalou linkou. Pokud name server hledá záznam, který nemá ve své cache, musí poslat několik paketů, než zjistí odpověď na dotaz. To by nejen zatěžovalo již pomalou linku, ale i vyhledávání nějakého jména by bylo zdlouhavé. Nabízí se přeposlat dotaz jinému name serveru forwarderu, který je již na rychlejších linkách, a nechat si poslat už jen odpověď. Takovému name serveru se říká forwarding server. Forwarding server posílá dotazy forwarderu, což bývá většinou name server poskytovatele Internetu. Pokud se forwarding server do určité doby nedočká odpovědi, pokusí se vyřídit dotaz sám a dotazuje se root name serverů. Někdy nechceme, aby se  forwarding server pokoušel sám vyřídit dotaz, pak ho označíme jako slave server..

DNS update

    Poskytuje dynamickou změnu záznamů v databázi  primárního name serveru. Správce DNS pak nemusí staticky upravovat záznamy, ale může to provést na dálku pomocí DNS protokolu. viz RFC 2136

DNS notify

    Sekundární name server si vždy po uplynutí určité doby obnoví svou databázi od primárního name serveru. Tato doba však může být až 1 den, a tak vzniká  dočasná nekonzistence dat mezi primárním a sekundárním name serverem. Abychom odstranili tento problém slouží notify. Prim. name server pošle při změně záznamu v zońě zprávu notify příslušnému sekund. serveru. Ten si pak ověří sériové číslo databáze prim. serveru a pokud se změnilo, vyžádá obnovu dat (zone transfer). 

IPv6

    Rozšířením DNS pro IPv6 se věnuje RFC-1886. Záznam typu AAAA IPv4 používá pro překlad jména na IP-adresu záznam typu A. Pro IPv6 je zaveden obdobný záznam typu AAAA. Rozdíl spočívá v tom, že záznam typu AAAA má v poli IP-adresa nikoliv čtyřbajtovou IPv4- adresu, ale 32bajtovou adresu IPv6.
Pro reverzní překlad je zavedena nová doména IP6.ARPA (obdoba domény IN-ADDR.ARPA pro IPv4). IPv6-adresa je prvkem domény IP6.ARPA. Zajímavý je zápis prvku domény IP6.ARPA. Jednotlivé bajty se opět zapisují „pozpátku”, ale nikoliv celé bajty, ale poloviny bajtů. Polovina bajtu je reprezentovaná jednou šestnáctkovou číslicí. Jednotlivé šestnáctkové číslice se oddělují tečkou (tj. oddělovačem v doménovém jméně). Příklad: IP-adresa 4321::1:2:3:4:567:89AB bude jako prvek domény IP6.ARPA zapsána: B.A.9.8.7.6.5.0.4.0.0.0.3.0.0.0.2.0.0.0.1.0.0.0.0.0.0.0.1.2.3.4.IP6.ARPA.
(IP-adresa 4321::1:2:3:4:567:89AB je jen zkráceným zápisem adresy 4321:0000:0001:0002:0003:0004:0567:89AB).

Konfigurace resolveru

    Resolver je v Unixu implementován prostřednictvím funkcí gethostbyname() a gethostbyaddr() obsažených v systémové knihovně. Resolver potřebuje ke správné funkci znát pouze dva údaje: jméno vlastní domény a adresu jmenného serveru, na který se obrací s dotazy. Tyto údaje se zadávají do souboru /etc/resolv.conf .

Syntaxe:

domain doména – definice domény
nameserver ip_adresa – ip adresa jmenného serveru (max 3 - dotazuje se postupně)
search domena_1 doména_2 … - pokud se provádí dotaz na relativní doménové jméno (bez tečky na konci) a to nebylo jmenným serverem nalezeno pokouší se resolver na konec jména postupně připojovat řetězce doména_1, doména_2

Příklad souboru /etc/resolf.conf
#konfigurace resolveru DNS - resolf.conf
domain hello.tps-root
nameserver 158.196.135.18

Named

    Named [nejmdý] je nejčastěji používanou implementací jmenného serveru BIND. Je obvykle spuštěn při zavádění systému a běží tak dlouho, dokud počítač nevypnete. Jeden běžící exemplář programu named  může obstarávat i více zón zároveň a to i v různých režimech. Spuštění můžete provést také ručně z příkazové řádky zadáním:

# /usr/sbin/named

    Po spuštění si named načte údaje z konfiguračního souboru named.conf. Poté si načte zónové soubory definované v konfiguračním souboru.

Inicializační soubor: named.conf

    Soubor obsahuje odkazy na zónové soubory a na jiné jmenné servery. Jednotlivé záznamy jsou zapsány do bloků uzavřených hranatými závorkami, které začínají klíčovým slovem, uvnitř bloku je pak jeden nebo více parametrů.



Blok option

options {
directory "/var/cache/bind";
recursion no;
};

    V bloku option nastavujeme různé vlastnosti NS. Za klíčovým slovem directory nastavíme adresář, kde se mají hledat následující zónové soubory. Dále můžeme vypnout rekurzivní vyhledávání NS (např. u root NS).

Syntaxe některých voleb:

      options {
        [ directory path_name; ]
        [ notify yes_or_no; ]
        [ recursion yes_or_no; ]
        [ forward ( only | first ); ]
        [ forwarders { [ in_addr ; [ in_addr ; ... ] ] }; ]
        };

directory - Definuje pracovní adresář name serveru. Jsou v něm obsaženy zónové soubory.
 
notify -  Primární name server posílá zprávu notify. viz DNS notify
 
recursion - Pokud je volba yes, pak name server provádí rekurzivní překlad. Čili snaží se získat odpověď na dotaz.
 
forward -  Hodnota first znamená, že forwarding server kontaktuje k vyřešení dotazu forwarder server a pokud se nepodaří forwarderovi dotaz vyřešit, pokouší se o to forwarding server sám. Hodnota only znamená, že forwarding server o vyřešení dotazu požádá forwardera a sám se nesnaží dotaz řešit. viz Forwarding a slave servery
 
forwarders -  Seznam IP adres serverů pro forwarding.


Blok key

key "rndc-key" {
algorithm hmac-md5;
secret "tcNk1hdZCzT0eRnrmSQ4Ng==";
};

Syntaxe:

      key key_id {
       algorithm algorithm_id;
       secret secret_string;
      };

    Blok key definuje algoritmus a klíč, který se bude používat při autentizaci name serverů.

algorithm - specifikuje autentizační algoritmus.
secret -   heslo použité algoritmem.

 

Blok zone

zone "localhost" {
type master;
file "/etc/bind/db.local";
};

    V bloku zone se definuje zóna, v tomto případě localhost. Za klíčovým slovem  type je hodnota master. Tím nastavíme, že pro zónu localhost je tento počítač primárním NS. Za file se uvádí zónový soubor pro danou zónu.

Syntaxe některých voleb:


zone domain_name [ ( in | hs | hesiod | chaos ) ] {
 type ( master | slave | stub | hint );
 [ file path_name; ]
 masters { ip_addr; [ ip_addr; ... ] }; - pouze sekundární name server
 [ notify yes_or_no; ]
 [ also-notify { ip_addr; [ ip_addr; ... ] };
};

Type -  
          master - Jedná se o primární name server.
slave - Jedná se o sekundární name server.
stub - Je slave zóna, která z master serveru přebírá pouze NS věty pro zónu..
          hint  - Zóna obsahující seznam root name serverů.
 
notify -   Viz notify v bloku option. Nastavení této volby v bloku zone má přednost před option.
 
also-notify - Zpráva notify se neposílá pouze sekund. serverům, ale i na IP adresy následující za touto volbou.  

Zónové soubory

    Zónové soubory , na které se odkazuje konfigurační soubor named.conf mají pevný formát popsaný v RFC 1033. Zónové informace jsou zde ve tvaru tzv. zdrojových záznamů, které jsou zapsané v řádcích a obsahují následující položky oddělené mezerami nebo tabelátorem:

[doména]    [ttl]    [třída]    typ    údaje
doména - doménové jméno objektu, ke kterému se záznam vztahuje.
ttl - doba platnosti udaná v sekundách. Po uplynutí této doby bude záznam vymazán z databáze jmenného serveru.
třída - označuje třídu adres pro protokol TCP/IP je zde vždy uvedeno "IN"
typ - typ zdrojového záznamu (SOA, A, NS, CNAME, PTR, MX, WKS a HINFO)
rdata - Informační obsah zdrojového záznamu, který je specifický pro každý z typů.

Znak @ reprezentuje současnou implicitní doménu. Tu je možné změnit direktivou $ORIGIN doména

Typy zdrojových záznamů:

SOA - popisuje zónu, na níž se se vztahuje autorita následujících zdrojových záznamů. Záznam má formát:
[domain] [ttl] IN SOA  origin  contact  (
                  serial
                  refresh
                  retry
                  expire
                  minimum_ttl
}

origin - jméno primárního jmenného serveru pro danou doménu.

contact - e-mailová adresa osoby zodpovědné za správu domény

serial - číslo verze zónového souboru (zvětšuje se při každé změně)

refresh - perioda v sekundách po které sekundární NS kontroluje záznam SOA primárního NS  (implicitně 8640s = 1 den)

retry - doba v sekundách po které bude sekundární NS znovu zkoušet spojení s primárním NS, pokud je tento v určitém okamžiku nedostupný. (implicitně  360s =1 hodina)

expire - doba v sekundách, po které sekundární NS při neúspěšné komunikaci s primárním NS zahodí veškeré informace o dané zóně.(implicitně 2419200s = 1 měsíc)

minimum_ttl - implicitní hodnota ttl pro zdrojové záznamy, které mají vynechánu tuto položku.(implicitně 604800s = 1 týden )

A - tento typ záznamu přiřazuje IP adresu ke názvu hostitele.
NS - definuje primární a všechny sekundární NS zóny.
CNAME - přiřazuje kanonickému názvu hostitele přezdívku (alias)
PTR - slouží k přiřazení doménového jména k IP adrese v rámci reverzní domény in-addr.arpa
MX - definuje poštovní server dané domény.
HINFO - informace o hardwaru a softwaru daného systému.

Příklad nastavení:

    Vytvoříme si vlastí doménový NS [Name Server], který bude zodpovědný za doménu hello, zaregistrovanou u našeho root NS tps-root, a k ní připojíme dva počítače pc1 a pc2. V praxi bychom samozřejmě asi nevytvářeli svůj root NS, ale svou doménu hello bychom zaregistrovali u nějakého nadřazeného NS. Mohl by to být například NS našeho poskytovatele připojení k internetu nebo přímo u existujícího root NS (cz, edu, net,…). Kvůli demonstraci však vytvoříme svůj vlastní root NS.

Primary DNS (master) – je zdrojem originálních informací o naší zóně hello.
Secondary DNS (slave) – je rovněž pro naši zónu hello autoritativní, avšak veškeré informace musí získat od příslušného primárního serveru. Je zálohou pro případ výpadku primárního serveru, proto by neměl být umístněn na lokální síti s primárním serverem.
Root DNS - náš vlastní root name server.
pc1 a pc2 - stanice využívající jmenné služby

Konfigurační soubory:

RootDNS - demonstrační root name server

PrimaryDNS - aktivováno notify

SecondaryDNS - aktivováno forwarding

pc1 - stanice bez name serveru

pc2 - aktivováno caching-only

Testy:

Testování  nastavení jsme prováděli pomocí programu nslookup. Zkoušeli jsme například z pc1 zjistit ip adresu pc2. Dotazovali jsme se jak primárního tak sekundárního name serveru. Podařilo se nám získat i ipv6 adresu.  Zkoušeli jsme i reverzní dotazy. Na ipv4 se nám jména na základě ip adresy zjistit podařilo, ovšem u ipv6 ne. Chybu jsme našli v souboru named.conf primárního i sekundárního name serveru, kde jsme měli špatně zadán název zóny.