Vznikl pro usnadnění práce a komunikace v sítí již v době ARPANetu. Lidé si lépe zapamatují název v podobě řetězce, než 32bitovou IPv4 adresu (nebo v dnešní době dokonce 128bitovou IPv6 adresu). Původní koncept DNS spočíval v aktualizaci a distribuci jednoho souboru (v UNIXu: /etc/hosts). Tento způsob distribuce se při masivním rozšiřování uzlů v síti ukázal jako neunosný a težko udržovatelný. Proto vznikl v osmdesátých letech systém Host names on-line (RFC 606, RFC 608, RFC 623), který funguje za pomocí NIC (Network Information Center), kde je seznam jmen provázáný s jejich IP adresami uložen. V roce 1983 tento koncept nahradil systém DNS, za jehož vznikem stojí Paul Mockapetris (RFC 1034, RFC 1035).
DNS poskytuje možnost překladu doménových jmen na odpovídající IP adresy. Doménové jméno je v podstatě řetězec reprezentující určitou hierarchii. V důsledku udržování hierarchického uspořádání je možné vyhnout se plně centralizovanému řešení (struktura stromu). Každá úroveň stromou zná své bezprostřední potomky a proto je možné směrovat požadavek od kořene (resp. jednoho z kořenových serverů) až po list (konktrétní nameserver pro danou doménu). Princip zpracování požadavků od klienta se může lišit podle typu nameserveru.
Resolver je klientská aplikace zajištující zasílání požadavků a přijetí a zpracování odpovědí od nameserverů. Služba DNS využívá pro komunikaci s resolverem protokol TCP nebo UDP. Nameserver příjímá požadavky zpravidla na portu 53.
Při zpracování požadavků mohou nastat 3 možnosti:
Příklad hierarchického uspořádání:
"." | | +---------------------+------------------+ | | | MIL EDU ARPA | | | | | | +-----+-----+ | +------+-----+-----+ | | | | | | | BRL NOSC DARPA | IN-ADDR SRI-NIC ACC | +--------+------------------+---------------+--------+ | | | | | UCI MIT | UDEL YALE | ISI | | +---+---+ | | | | LCS ACHILLES +--+-----+-----+--------+ | | | | | | XX A C VAXA VENERA Mockapetris
gTLDs (generické):
AXFR (Asynchronous Full Transfer Zone, součást RFC 1034, 1035)
IXFR (Incremental Zone Transfer, RFC 1995)
Glue záznam je pomocný záznam, které slouží při precosu vyhodnocováni požadavku k tomu, aby nedošlo k přerušení během procházení hierarchického stromu. To by mohlo nastat v případě, kdy se například snažíme vyhodnotit dotaz na www.domena-o-uroven-niz.cz a jeden z autoritativních serverů domény .cz nám sdělí, že požadovaná doména je uložená na ns.domena-o-uroven-niz.cz, ale my bychom nevědeli, na které adrese (síťové vrstvy) daný nameserver kontaktovat. Proto se k takové odpovědi připojují informace z glue záznamů, kde jsou uložené informace o autoritativních DNS serverech dané domény a vyhodnocování požadavku tak může pokračovat bez přerušení dál.
RR (Resource Records) - struktura, kterou obdrží resolver od nameserveru. RR je ve formátu [<Domain name>] [<TTL>] Class Type Value, kde jednotlivé položky znamenají:
@ IN SOA anxur.fi.muni.cz. root.fi.muni.cz. ( 2009100903 - serial 1h - refresh 15m - retry 2d - expire 10m - negative cache ttl )serial - udává v jaké verzi se zóna nachází, při změně v záznamech zóny je třeba serial zvětšit, aby došlo k propagaci změn především na sekundarní/caching DNS servery
aisa.fi.muni.cz. 1800 IN A 147.251.48.1
6-gw.fi.muni.cz. 1800 IN AAAA 2001:718:201:230:0:0:0:12
fi.muni.cz. 1800 IN NS aisa.fi.muni.cz. 1800 IN NS anxur.fi.muni.cz. 1800 IN NS ns.muni.cz.
ares-48.fi.muni.cz. 1800 IN CNAME ares.fi.muni.cz. * 1800 IN CNAME aisa.fi.muni.cz.
fi.muni.cz. 1800 IN MX 50 relay.muni.cz.
1.48.251.147.in-addr.arpa. 1800 IN PTR aisa.fi.muni.cz.
fi.muni.cz. 1800 IN TXT "Faculty of Informatics" fi.muni.cz. 1800 IN TXT "v=spf1 include:fi.muni.cz -all"
aisa.fi.muni.cz 1800 IN A 147.251.48.1 aisa.fi.muni.cz. 1800 IN A 147.251.48.1
Pro Linux lze nalézt nepřeberné množství implementací DNS serverů a utilit pro práci s DNS.
Implementace DNS serverů:
$ dig fi.muni.cz ; <<>> DiG 9.6.1 <<>> fi.muni.cz ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 20720 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 3 ;; QUESTION SECTION: ;fi.muni.cz. IN A ;; ANSWER SECTION: fi.muni.cz. 1800 IN A 147.251.48.1 ;; AUTHORITY SECTION: fi.muni.cz. 146 IN NS anxur.fi.muni.cz. fi.muni.cz. 146 IN NS ns.muni.cz. fi.muni.cz. 146 IN NS aisa.fi.muni.cz. ;; ADDITIONAL SECTION: ns.muni.cz. 18228 IN A 147.251.4.33 aisa.fi.muni.cz. 146 IN A 147.251.48.1 anxur.fi.muni.cz. 146 IN A 147.251.48.3
$ host -a fi.muni.cz Trying "fi.muni.cz" ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 30772 ;; flags: qr rd ra; QUERY: 1, ANSWER: 5, AUTHORITY: 3, ADDITIONAL: 4 ;; QUESTION SECTION: ;fi.muni.cz. IN ANY ;; ANSWER SECTION: fi.muni.cz. 1773 IN MX 50 relay.muni.cz. fi.muni.cz. 1692 IN A 147.251.48.1 fi.muni.cz. 38 IN NS ns.muni.cz. fi.muni.cz. 38 IN NS aisa.fi.muni.cz. fi.muni.cz. 38 IN NS anxur.fi.muni.cz. ;; AUTHORITY SECTION: fi.muni.cz. 38 IN NS ns.muni.cz. fi.muni.cz. 38 IN NS aisa.fi.muni.cz. fi.muni.cz. 38 IN NS anxur.fi.muni.cz. ;; ADDITIONAL SECTION: relay.muni.cz. 6486 IN A 147.251.4.35 ns.muni.cz. 18120 IN A 147.251.4.33 aisa.fi.muni.cz. 38 IN A 147.251.48.1 anxur.fi.muni.cz. 38 IN A 147.251.48.3
$ nslookup > server anxur.fi.muni.cz Default server: anxur.fi.muni.cz Address: 147.251.48.3#53 > set q=soa > fi.muni.cz Server: anxur.fi.muni.cz Address: 147.251.48.3#53 fi.muni.cz origin = anxur.fi.muni.cz mail addr = root.fi.muni.cz serial = 2009100903 refresh = 3600 retry = 900 expire = 1209600 minimum = 600
$ rndc reload <zona> zone reload queued $ tail -n 2 /var/log/<logfile> Oct 13 02:42:33 <servername> named[<PID>]: zone <zona>/IN: loaded serial 2009101301 Oct 13 02:42:33 <servername> named[<PID>]: zone <zona>/IN: sending notifies (serial 2009101301)
Resolver má informaci, kterému DNS serveru požadavek zaslat, uloženou lokálně. Tuto informaci lze nastavit fixně (ručně) nebo konfugurovat například pomocí DHCP. Konfigurace se provádí z pravidla v /etc/resolv.conf (popř. /etc/nsswitch.conf). Je možné nastavit mapování IP adresy na explicitně uvedená doménová jména (konfigurace v /etc/hosts).
!! Pozor: údaje v /etc/hosts mají vyšší prioritu (je to první místo, kam se resolver dívá), než údaje získaná z DNS !!
Struktura souboru /etc/resolv.conf může vypadat následovně:
$ cat /etc/resolv.conf search fi.muni.cz # doména, která se prohledává v případě nezdaru překladu (ping aisa => ping aisa.fi.muni.cz.) nameserver 147.251.206.1 # sks2 komarov nameserver 147.251.4.33 # sks2 komarovV případě konfigurace resolveru pomocí DHCP je soubor /etc/resolv.conf automaticky zkonfigurován podle odpovídajícího nastavení, které DHCP server propaguje.
Jako většina starších protokolů postrádá i základní komunikace s DNS dostatečnou formu zabezpečení. Lze například podvrhnout falešné, pozměněné či neúplné údaje o doménových jménech. Zkontrolovat (alespoň částečně) bezpečnost našeho DNS serveru můžeme např. pomocí webovéhých nástrojů DNS Stuff nebo The DNS Sleuth.
DNS Cache Poisioning, Denial-of-service (DDoS/DoS) attack - DNS Amplification Attack. Částečnou ochranou proti DoS/DDoS útokům může být použití anycastu, kdy dojde k rozložení zátěže na skupinu serverů pro danou anycastovou adresu.
Příklad pro BIND: pro běh procesu named v chroot prostředí je potřeba zadat při spouštění procesu parametr -t <chroot> s adresářem, v kterém bude proces uzamčen.
V takovém adresáři se musí vyskytovat adresářová struktura a soubory nezbytné pro běh named a to např.:
GSS-TSIG - je používaný u Microsoft serverů a autentizace je prováděna přes Kerberos, navázáný security context s ADS (Active Directory Server), RFC 3645
BIND je velmi dobře zdokumentovaný a slouží také jako referenční model pro nové implementace. Jedná se o multiplatformní řešení, které používá přes 75% nameserverů na Internetu. BIND využívá pro svůj běh démon s názvem named. Od verze 9.3 částečná podpora DNSSEC-bis a od verze 9.6 plná podpora DNSSEC-bis.
Hlavní konfigurační soubor named.conf si lze nechat zkontrolovat pomocí named-checkconf(8) a soubor obsahující zónu pomocí named-checkzone(8).
acl - určuje seznam ip adres controls - určuje řídící kanály (rndc utilita) controls { inet 127.0.0.1 allow { localhost; }; }; include - vkládá soubor include jmeno_suboru; key - určuje údaje potřebné pro autorizaci / autentizaci logging - nastavení logování (určuje události, které se mají zaznamenávat) options - globální nastavení serveru options { directory "/var/named"; query-source port 53; forward only; forwarders { jine_servery; }; }; server - nastavení konfiugračních možností na úrovni serveru trusted-keys - určuje trusted DNSSEC keys zone - určuje zónu allow-query - určuje, kdo může pokládat bežné DNS požadavky recursion - server se pokusí zodpovědět žádost za klienta (pošle rekurivně dál, než se mu vrátí odpověd, kterou předá zpět klientovi) notify - zasílá notifikační zprávy všem autoritativním serverům pro danou zónu
zone "primary.example" { type master; notify yes; file "pri/primary.example.zone"; }; zone "slave.example" { type slave; masters { 147.251.206.1; }; file "sec/slave.example.zone"; }; zone "." { type hint; file "root.hint"; };Příklad zóny muni.example.zone:
$TTL 86400 @ IN SOA ns.muni.example. postmaster.muni.example. ( 2009101300 ; Serial 28800 ; Refresh 7200 ; Retry 1209600 ; Expire 7200) ; Negative Cache TTL ; @ IN NS ns.muni.example. @ IN NS ns2.muni.example. @ IN A 147.251.206.111 @ IN MX 10 mail @ IN TXT "v=spf1 a mx ~all" ns IN A 147.251.206.1 ns2 IN A 147.251.206.2 fictive IN A 147.251.206.222 ftp IN CNAME fictive mail IN A 147.251.206.254 * IN CNAME @Kontrola zóny muni.example.zone:
$ cat /chroot/named/etc/named.conf | grep -A 3 "zone \"muni.exmaple.zone" zone "muni.example" { type master; file "pri/muni.example.zone"; }; $ named-checkzone muni.example /chroot/named/var/named/pri/muni.example.zone zone muni.example/IN: loaded serial 2009101300 OK