8. cvičení - Systém DNS
Cíle cvičení
- Manuální překlad jména na IP adresu a obráceně.
- Zjistit způsob rekurzivního překladu jména na IP adesu.
- Dotazy na DNS server.
- Konfigurace resolveru.
- Zachycení a inspekce DNS query paketů.
- Konfigurace DNS serveru.
- Napsat ekvivalent programu
resolveip
.
Manuální překlad jména na IP adresu a obráceně
K dotazu na překlad doménových jmen na IP adresu a naopak se dá v Linuxu i ve Windows použít program nslookup
.
Na linuxu je k dotazům na DNS servery možné použít další programy jako dig
, host
nebo resolveip
.
Úkol: Zjistit IP adresy ke jménům seznam.cz a google.cz.
Úkol: K IP adrese 158.194.80.13 zjistit jméno.
Zjistit způsob rekurzivního překladu jména na IP adresu
Postup rekurzivního překladu jména na IP adresu je popsán ve slidech k 8. přednášce.
Úkol: Vysvětlit úplný postup rekurzivního překladu nějakého jména (například seznam.cz) z uzlu v nějaké doméně (například inf.upol.cz).
Dotazy na DNS server
DNS servery spravují různé druhy záznamů. Například A záznamy obsahují asociaci jména s IPv4 adresou, AAAA to samé pro IPv6, MX záznamy obsahují jména mail serverů pro doménu a čísla reprezentující jeho prioritu, CNAME obsahují aliasy jmen na jiná jména, NS obsahují jméno autoritativního jmenného serveru pro doménu, PTR ukazují na kanonické jméno, používají se pro reverzní překlad IP adresy, SOA označují autoritativní záznamy o DNS zóně atd.
Další typy záznamů lze najít na Wikipedii.
Úkol: Pomocí programu nslookup
nebo dig
najít na OpenDNS serveru 208.67.222.222 jméno a IP adresu mail serveru pro doménu upol.cz, alias pro www.post.cz, IPv6 adresu pro ipv6.google.com.
Manuální překlad jména na IP adresu a obráceně, Zjistit způsob rekurzivního překladu jména na IP adresu a Dotazy na DNS server jsou za 1 bod.
Konfigurace resolveru
IP adresy lze ke jménům získat pomocí dotazu na DNS server nebo mohou být zapsané lokálně v konfiguračním souboru operačního systému.
Pro lokální asociaci jména s IP adresou se na linuxu používá soubor /etc/hosts
. Ve windows je to soubor C:\WINDOWS\system32\drivers\etc\hosts
. Oba tyto soubory mají stejnou syntaxi. Každý řádek reprezentuje jednu asociaci IP adresy se jménem.
DNS servery, kterých se má OS ptát na překlad jmen se ve Windows dají nastavit pomocí dialogu síťových rozhraní.
Na linuxu k tomuto účelu slouží soubor /etc/resolv.conf
. V něm se dají jednak nastavit DNS servery a dále potom doména, ve které se budou hledat neúplná jména.
Úkol: Lokálně asociovat nějaké jméno s IP adresou nějakého serveru. Například IP adresy www.seznam.cz s adresou najdu-tam-co-neznam.cz.
Úkol: Na linuxu i na windows přenastavit DNS tak, aby se OS na překlad jmen dotazoval OpenDNS serverů s adresami 208.67.222.222 pro primární server a 208.67.220.220 pro sekundární server..
Zachycení a inspekce DNS query paketu
DNS query dotazy a odpovědi mají následující strukturu.
Úkol: Zachytit DNS query dotaz a odpovědi a popsat alespoň 4 položky v jeho hlavičce.
Úkol: Popsat jednotlivé části těla DNS query.
Konfigurace resolveru a zachycení a inspekce DNS query paketu jsou za 1 bod.
Konfigurace DNS serveru
Na linuxu lze jako DNS server použít Bind. V distribuci Debian GNU/Linux ho lze nainstalovat pomocí příkazů:
apt-get update apt-get install bind9
Jeho konfigurační soubory se nacházejí v adresáři /etc/bind/
. Novou zónu test.local je možné přidat zápisem následující konfigurace do souboru named.conf.local
v /etc/bind/
:
// dopredny preklad zone "test.local" { type master; file "/etc/bind/db.test.local"; }; // reverzni preklad zone "70.1.10.in-addr.arpa" { type master; file "/etc/bind/db.10.1.70"; };
Konfigurace této zóny pro dopředný překlad se následně provádí v souboru /etc/bind/db.test.local
. Minimální konfigurace vypadá takto:
$TTL 604800 @ IN SOA test.local. root.test.local. ( 2010112300 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL IN NS ns.test.local. ns IN A 10.1.70.2
Konfigurace reverzního překladu se provádí v souboru /etc/bind/db.10.1.70
. Minimální konfigurace vypadá takto:
$TTL 604800 @ IN SOA test.local. root.test.local. ( 2010112300 10800 1800 1209600 604800 ) IN NS ns.test.local. 2 IN PTR ns.test.local.
Nakonec je třeba Bind restartovat, aby se změny projevily. To se provede pomocí příkazu /etc/init.d/bind9 restart
.
Další informace lze najít například v článku o DNS na Abclinuxu nebo zde.
Úkol (za 0,75 bodu): V linuxu vytvořit zónu test.local
pro podsíť 10.1.L.0 (kde L je poslední číslo z IP adresy hostitelského stroje) a v ní nakonfigurovat alespoň jeden A záznam a jeden CNAME záznam a k těmto záznamům nastavit i reverzní překlad.
Ve windows je napřed potřeba doinstalovat DNS službu. Ta se nachází v sekci Add roles.
Další postup je popsán zde. Je sice pro Windows 2003 server, ale stejný postup je platný i pro Windows 2008 server
Úkol (za 0,75 bodu): Ve windows vytvořit zónu local
pro podsíť 10.1.L.0 (kde L je poslední číslo z IP adresy hostitelského stroje) a v ní nakonfigurovat alespoň jeden A záznam a jeden CNAME záznam a k těmto záznamům nastavit i reverzní překlad.
Napsat obdobu programu resolveip
Úkol (za 0,5 bodu): Pro windows a Linux napsat alternativu programu resolveip
se syntaxí:
resolveip name1 [name2 […]]
kde name1
, name2
, ... jsou jména.
Pro každé takto zadané jméno program vypíše:
- oficiální jméno
- alternativní jména (aliasy)
- dvojice IP adresa –> jméno získané zpětným překladem této IP adresy
Například pro dotaz:
resolveip google.cz www.root.cz www.post.cz
by mohla odpověď vypadat takto:
Oficialni jmeno: google.cz Alternativni jmena (aliasy): IP adresy: 74.125.87.105 –> hb-in-f105.1e100.net 74.125.87.147 –> hb-in-f147.1e100.net 74.125.87.99 –> hb-in-f99.1e100.net 74.125.87.103 –> hb-in-f103.1e100.net 74.125.87.104 –> hb-in-f104.1e100.net Oficialni jmeno: root.cz Alternativni jmena (aliasy): www.root.cz IP adresy: 91.213.160.118 –> www.root.cz Oficialni jmeno: email.seznam.cz Alternativni jmena (aliasy): www.post.cz IP adresy: 77.75.76.6 -> email.seznam.cz
K implementaci budete potřebovat struktury hostent
a in_addr
a dále funkce:
struct hostent *gethostbyname(const char *name);
struct hostent *gethostbyaddr(const char *addr, int len, int type);
char *inet_ntoa(struct in_addr in);
A pro windows verzi ještě strukturtu WSADATA
a funkci int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
.
Další informace je možné nalézt na serveru Builder.cz: