DNS

Jiří Běl, xbel@fi.muni.cz


Obsah


Trocha historie

Proč potřebujeme systém jako je DNS?

Adresace hostitelů v sítích na bázi protokolu TCP/IP (IPv4) se provádí pomocí 32 bitových čísel. Počítačům se však pro snadnější zapamatování dávají "klasická" jména. S tímto mapováním jmen na IP adresy vznikla potřeba vést aktuální seznam jmen strojů a jejich adres. V malých sítích čítajících několik počítačů se vystačilo se souborem /etc/hosts (nebo jemu podobných), který se rozkopíroval na jednotlivé počítače.

NIS - Network Information System

U větších sítí je nutné takovou databázi spravovat centrálně. Tento problém řešil systém NIS firmy SUN Microsystems (známý také jako YP - Yellow Pages), který ukládá soubor "hosts" (spolu s dalšími informacemi) do databáze na hlavním hostiteli, odkud si ho mohou klienti zkopírovat. Tento přístup se však hodí pouze pro malé a středně velké sítě. Při větším počtu hostitelů dochází k velkému zatížení spojeného s přenosem souboru hosts a navíc při jakékoliv změně se musí aktualizovat seznam na centrálním počítači. V roce 1984 však přišel Paul Mockapetris s návrhem systému, který řešil oba tyto problémy. Jednalo se o systém DNS.


DNS

Co je to DNS a k čemu slouží?

DNS, tedy Domain Name System, je hierarchický, rize distribuovaný systém, jehož jednotlivé části se spravují lokálně. Je určen pro vzájemné převádění mezi jmény hostitelů a jejich IP adresami.

Jak to funguje?

Systém DNS je založený na principu klient-server. Server udržuje databáze jmen, adres a dalších informací. Klient (resolver) odešle na svůj lokální server dotaz, ten mu buďto po čase vrátí odpověď anebo mu pošle odkaz na server, který by požadovanou informaci mohl mít anebo ví o nějakém dalším, který ji má. V takovém případě klient opakuje dotaz na odkazovaný server.

Logické rozdělení systému DNS

Systém DNS můžeme rozdělit na tři logické části:

Jmenný prostor

Jmenné prostory (DNSpace) tvoří hierarchickou stromovou strukturu. V kořeni jsou tzv. root-servers, jejichž seznam je zveřejňován centrem NIC na ftp.internic.net. Na nich jsou uloženy informace o registrovaných nameserverech, na které jsou delegována práva spravovat subdomény .cz .edu .com atd. Podobně to funguje pro domény vyšších úrovní.

Name servery

Typy DNS serverů - podle postavení v doméně Typy name serverů - podle chování

Převádění

Implementace DNS serverů udržují dvě tabulky jmen hostitelů domény a jim odpovídajících IP adres. Tabulky se používají podle směru převodu:

Resolver

Klientská aplikace, která získává informace z NS. Rutiny pro hledání hostitelů jsou obsaženy v knihovně resolveru, které tyto operace provádí transparentně. U Linuxu jsou součástí standardní knihovny libc.

Implementace


BIND - Berkeley Internet Name Daemon

Bind je v současné době nejrozšířenější implementace DNS.
Aktuální verzí je BIND Version 9.2.1 (Released 01.05.2002)
Stále se hodně používá verze 8, jehož aktuální verzí BIND Version 8.3.3 (Released 28.06.2002)

Kde se dá získat

Instalace BIND-chroot 9.x.x

Chroot znamená, ze daný bežící program má za svůj kořenový adresář / umístěný do předem určeného adresáře - například /chroot/named. BIND se instaluje do chroot-ovaného prostředí, podobně jako ftp-server z bezpečnostích důvodů. Pokud dojde k prolomení BINDu, útočník se dostane pouze do daného podstromu adresářů. Instalaci budeme provádět do adresáře /chroot/named.

Příprava chroot-ovaného prostředí

Z bezpečnostních důvodů se nedoporučuje provozovat BIND pod rootem. Proto přidáme nového uživatele "named" se speciální skupinou "named". Přidejme tedy do /etc/passwd tento řádek:
named:x:200:200:Nameserver:/chroot/named:/bin/false
Tento pak do /etc/group
named:x:200:
Shell je nastaven na /bin/false, to proto, že se tento uživatel nikdy nebude logovat. Jen dejte pozor, ať nepoužijete existující PID a GID.

Nyní vytvoříme následující strukturu adresářů:
/chroot
  +-- named
       +-- dev
       +-- etc
            +-- named
       +-- var
            +-- run

Vytvoříme /dev/null:
mknod /chroot/named/dev/null c 1 3
Dále budeme potřebovat čas do logu:
cp /etc/localtime /chroot/named/etc/
Protože named poběží v chroot-ovaném prostředí, nemůžeme pro logování používat socket /dev/log. Pokud náš syslogd podporuje volbu -a, dá se to vyřešit tímto způsobem: V souboru se startovacím skriptem (v RedHatu /etc /rc.d/init.d/syslog) zaměníme řádku
daemon syslogd -m 0
za
daemon syslogd -m 0 -a /chroot/named/dev/log
Stejnou volbu musíme u některých distribucí změnit rovněž v /etc/sysconfig/syslog

Restarujeme syslogd.

Kompilace BINDu 9.x.x

Stáhneme a rozbalíme zdrojáky. Kompilace je bezproblémová, stačí zadat následující příkazy:
     configure
     make
     make install DESTDIR=/chroot/named
Startovací skript /etc/rc.d/init.d/named je součástí balíčku, případně se můžete inspirovat zde: http://linux.com/howto/Chroot-BIND-HOWTO.html

named se spouští příkazem:
daemon named -u named -t /chroot/named/ -c /etc/named.conf

Konfigurace

named.conf
----------
options {
        directory "/var/named";              #  pracovní adresář named
        datasize 20M;
        query-source address * port 1053;
};

acl in_nase { 192.168.1/24; };
acl in_moje { 172.16.2/24; 172.16.200/24; };
acl ascs    { 147.251.60/24;  147.251.62/24; };

zone "localhost" {                           # definice lokální smyčky
        type master;                         # pro localhost jsme master
        file "master/db.localhost";          # cesta k zónovému souboru localhost
        allow-update { none; };
        allow-transfer { any; };
};

zone "0.0.127.in-addr.arpa" {                # reverzni zaznam pro loopback 
        type master;
        file "master/db.rev.127.0.0";
        allow-update { none; };
        allow-transfer { any; };
};

zone "." {
        type hint;
        file "named.root";
};

zone "in.nase" {
    type master;
    file "master/db.in.nase";
    allow-update   { none; };
    allow-transfer { localhost; in_nase; in_moje; };
    allow-query    { localhost; in_nase; in_moje; };
};

zónové soubory
--------------
../master/db.localhost 
$TTL 1D
$ORIGIN localhost.
@               IN      SOA     @       root.localhost. (
                                2001042700      ; serial
                                3H              ; refresh
                                15M             ; retry
                                2W              ; expire
                                1D )            ; minimum
                IN      NS      @
                IN      A       127.0.0.1

../master/db.rev.127.0.0
$TTL 1D
$ORIGIN 0.0.127.in-addr.arpa.
$TTL 1D
@               IN      SOA     localhost. root.localhost. (
                                2001042700      ; serial
                                3H              ; refresh
                                15M             ; retry
                                2W              ; expire
                                1D )            ; minimum
                        NS      localhost.
0                       PTR     localnet.
1                       PTR     localhost.


Níže uvedený "slave" soubor administrátor DNS serveru nevytváří. Tento soubor "vytvoří" DNS server sám tím, že si jej stáhne od serveru uvedeného na patřičném místě v named.conf


Slave soubor
------------

$ORIGIN .
$TTL 86400      ; 1 day
ascs.muni.cz            IN SOA  trinity.ascs.muni.cz. root.trillian.as
cs.muni.cz. (
                                2002100801 ; serial
                                10800      ; refresh (3 hours)
                                1800       ; retry (30 minutes)
                                3600000    ; expire (5 weeks 6 days 16
 hours)
                                21600      ; minimum (6 hours)
                                )
                        NS      trinity.ascs.muni.cz.
                        NS      trillian.ascs.muni.cz.
                        A       147.251.60.141
                        MX      100 trillian.ascs.muni.cz.    ; 100 - 
$ORIGIN ascs.muni.cz.
abcd                    A       147.251.60.60
acer                    A       147.251.62.93
acerp                   A       147.251.62.76
acid                    A       147.251.60.112
ady                     A       147.251.60.33
albert                  A       147.251.60.18
alberto                 A       147.251.62.3
alex                    A       147.251.62.30

Popis některých parametrů RR

SOA Start Of Authority parametry MNAME, RNAME, SERIAL, REFRESH, RETRY, EXPIRE
NS Autoritativní nameserver
A IP adresa IPv4
AAAA IP adresa IPv6
MX Mail exchange
CNAME canonical name, přezdívka
PTR Ukazatel na jinou část DNSpace - reverzní záznam
HINFO host info informace o CPU, OS apod. Nepovinné.
TXT textový retězec

Zabezpečení

Po konfiguraci můžeme zpřísnit bezpečnostní opatření.
     chown root /chroot
     chmod 700 /chroot
     chown named:named /chroot/named -R
     chmod 700 /chroot/named
     chown named:named /chroot/named/var/run
     + pokud nevěříte ani sami sobě: chattr +i etc etc/localtime var 
       (v adresáři /chroot/named )

Ladící nástroje

Užitečné rady

Užitečné odkazy