DNS

Honza Hubený, xhubeny@fi.muni.cz


Obsah


DNS

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. 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.

DNS se dá rozdělit na tři logické části:

Jmenné prostory (DNSpace) 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) a cache-only (přeposílá dotazy a slouží jako cache) pro zónu.

Nameservery lze rozlišit též podle chování - iterativní v. rekurzivní.

Kromě převodu doménových jmen na IP adresy zajišťuje DNS i činnost opačnou tzv. reverzní mapování - převod IP adres na jména (doména IN-ADDR.ARPA).

Spolupráce Uživatelského programu s Resolverem a NS:
z RFC1035:
                 Local Host                        |  Foreign
                                                   |
    +---------+               +----------+         |  +--------+
    |         | user queries  |          |queries  |  |        |
    |  User   |-------------->|          |---------|->|Foreign |
    | Program |               | Resolver |         |  |  Name  |
    |         |<--------------|          |<--------|--| Server |
    |         | user responses|          |responses|  |        |
    +---------+               +----------+         |  +--------+
                                |     A            |
                cache additions |     | references |
                                V     |            |
                              +----------+         |
                              |  Shared  |         |
                              | database |         |
                              +----------+         |
                                A     |            |
      +---------+     refreshes |     | references |
     /         /|               |     V            |
    +---------+ |             +----------+         |  +--------+
    |         | |             |          |responses|  |        |
    |         | |             |   Name   |---------|->|Foreign |
    |  Master |-------------->|  Server  |         |  |Resolver|
    |  files  | |             |          |<--------|--|        |
    |         |/              |          | queries |  +--------+
    +---------+               +----------+         |
                                A     |maintenance |  +--------+
                                |     +------------|->|        |
                                |      queries     |  |Foreign |
                                |                  |  |  Name  |
                                +------------------|--| Server |
                             maintenance responses |  +--------+

Struktura DNS dotazu

Question - Dotaz a jeho parametry, Answer - RR s odpovědí na dotaz, Authority - RR které popisují jiné autoritativní nameservery Additional - RR které mohou být užitečné.
Více o struktuře DNS dotazu v části BIND


Implementace


BIND

Bind je v současné době nejrozšířenější implementace DNS. Poskytuje všechny hlavní funkce DNS: Aktuální verze BIND9 je 9.2.0 (26.11.2002).
Stále se hodně používá BIND8 - aktuální verze je 8.3.1 (2.2.2002)

Odkud získat BIND?

Instalace chroot-BINDu

Chroot znamená, že určitý běžící program má za svůj kořenový adresář / například adresář /chroot/named. BIND se instaluje do chroot-ovaného prostředí, podobně jako ftp-server z bezpečnostích důvodů. Pokud nám nějaký dobrák prolomí nějakou bezpečností díru v BINDu dostane se jen do určeného podstromu adresářů. Popíšu instalaci adresáře /chroot/named. Na strojích FI (aisa, erigona) se používá adresář /var/named/.

Příprava /chroot/named

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. Něco podobného tomuto řádku by se mělo přidat do /etc/passwd:
named:x:200:200:Nameserver:/chroot/named:/bin/false
A todle do /etc/group
named:x:200:
Pozor ať nepoužijete existující PID a GID...

Teď potřebujeme dodělat chroot-tované prostředí. Přidáme adresáře
/chroot
  +-- named
       +-- dev
       +-- etc
            +-- named
       +-- var
            +-- run
Uděláme /dev/null v chroot-u:
 mknod /chroot/named/dev/null c 1 3
Taky potřebujeme čas do logů:
 cp /etc/localtime /chroot/named/etc/
Protože named poběží v chroot-ovaném prostředí, nemůže pro logování používat socket /dev/log. Pokud náš syslogd podporuje volbu -a, vyřešíme to 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 též v /etc/sysconfig/syslog (nebo přibližně někde tam...)
Syslog restartujeme.
Máme připraveno chroot-ované prostředí.

Kompilace bind-9.x.x

Poté co jsme si stáhli a rozbalili zdrojáky, se můžeme pustit do kompilace.
mě stačilo udělat: Startovaci skript /etc/rc.d/init.d/named si buďto napíšete sami nebo je součást balíčku nebo si ho najděte tady (a upravte) http://linux.com/howto/Chroot-BIND-HOWTO.html Spouštění named by měl zaručit příkaz:
daemon named -u named -t /chroot/named/ -c /etc/named.conf

Konfigurační soubor named.conf

//named.conf
// c style komentare strednik na konci kazdeho radku
options {
        directory "/var/named"; // pracovni adresar named
        pid-file "/var/run/named.pid";                  // pid named
        statistics-file "/var/tmp/named.stats";         // statistiky
        forwarders { 147.251.48.3 147.251.48.1; 147.251.4.33; }; // kam se preposilaji dotazy
        allow-query { any; }; // povolit dns dotazy odkud
        allow-transfer { none; }; // povolit stahnuti tabulek odkud
        forward-only // pouze preposilat dotazy...
};
zone "localhost" { //definice lokalni smycky
        type master; // pro localhost jsme master
        file "master/localhost"; // cesta k souboru localhost
        allow-update { none; };
        allow-transfer { any; };
};

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

zone "." { //zaznamy pro korenovou domenu
        type hint;
        file "named.root";
};

// dale prevzato z erigony definice subdomeny lab.fi.muni.cz
acl internal_net { 10.0.0.0/8; 127.0.0.1; };

zone "lab.fi.muni.cz" {
        type master;
        file "master/lab.fi.muni.cz";
        allow-query { internal_net; };
};

zone "0.0.10.in-addr.arpa" {
        type master;
        file "master/10.0.0";
        allow-query { internal_net; };
};

Zónové soubory s RR

; komentare zacinaji strednikem
$ORIGIN localhost.
@               IN      SOA     @       root.localhost. (
                                2001042700      ; serial
                                3H              ; refresh
                                15M             ; retry
                                2W              ; expire
                                1D )            ; minimum   
			NS      @ ; autoritativni nameserver pro zonu
                        A       127.0.0.1 ; ip adresa (bez parametru origin)
; reverzni domena 
$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.


;slave file fi.muni.cz z aisy
; BIND version named 8.2.2-P5 Fri Jul 21 15:50:22 MET DST 2000
; BIND version kron@aisa2:/export/local/kron/bind/src/bin/named
; zone 'fi.muni.cz'   last serial 2002030100
; from 147.251.48.3:53 (local 147.251.48.1) using AXFR at Fri Mar  1 
16:59:27 2$$ORIGIN muni.cz.
fi      86400   IN      SOA     anxur.fi.muni.cz. 
postmaster.anxur.fi.muni.cz. (                2002030101 10800 900 1209600 
86400 )
        86400   IN      NS      anxur.fi.muni.cz.
        86400   IN      NS      aisa.fi.muni.cz.
        86400   IN      NS      ns.muni.cz.
        86400   IN      TXT     "Faculty of Informatics"
        86400   IN      TXT     "Masaryk University Brno"
        86400   IN      TXT     "Botanicka 68a, 602 00, Brno, Czech republic"
        86400   IN      MX      50 relay.muni.cz.
        86400   IN      MX      500 adis.cesnet.cz.
        86400   IN      A       147.251.48.3
$ORIGIN fi.muni.cz.
otos    86400   IN      MX      50 relay.muni.cz.
        86400   IN      MX      500 adis.cesnet.cz.
        86400   IN      A       147.251.52.186
helios  86400   IN      MX      50 relay.muni.cz.
        86400   IN      MX      500 adis.cesnet.cz.
        86400   IN      A       147.251.52.67
;... atd
; muzete se kouknout na erigonu a aisu
 

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 příklad
pc8 IN A 10.0.0.129
IN MX 50 relay.muni.cz.
Čím nižší číslo tím vyšší priorita
CNAME canonical name, přezdívka
PTR Ukazatel na jinou část DNSpace - reverzní záznam
HINFO host info informace o cpu os ...
TXT textový řetězec

Bezpečnost

Po té co si myslíme, že máme vše hotovo a nakonfigurováno můžeme udělat pořádek ve "vlastnických a přístupových" právech:

Ladicí nástroje


Malá rada na závěr - Při testovacích startech named na x% výkonu se vyplatí sledovat soubor /var/log/messages

Užitečné odkazy:


Valid HTML 4.0!