DNS

Jan Šoc, xsoc@fi.muni.cz


Obsah


Co je DNS, hierarchie

Takže, přesto že se mi to zdá zbytečné, začneme od začátku. Byly nebyly, internetové adresy, ale ty se lidem nelíbily, tak si vymysleli soubor hosts, kde si k jednotlivým adresám přidělily názvy, jelikož se jim to zdálo snadněji zapamatovatelné, než ty čísla. Jenomže jak se jim síť rozrůstala, začali v tom mít nepořádek, tak vymysleli DNS servery, a to je konec pohádky.

DNS servery jsou rozděleny přísně hierarchicky. Jestliže se tedy ptáme po tom nejhlavnějším serveru, bude to zřejmě ns.internic.net, ten uchovává záznamy o takzvaných ROOT-SERVERS kterých je 13 a jmenují se A.ROOT-SERVERS.NET až po M.ROOT-SERVERS.NET k poslední změně v této hlavní doméně došlo v 22.8.1997, takže je vidět jistá stálost. Soubor se jmény a adresami, je uložen na ftp://rs.internic.net/domain/named.root. Na těchto root serverech jsou uloženy informace, které nameservery spravují kořenové domény, tedy např. .cz, .tw, .com, .gov atd. Těmto doménám se říká domény I. stupně.

DNS servery však dělají také činnost přesně opačnou, překládají také čísla na jména, pro tento případ, je serverů podstatně více. soubor se jmény a adresami kořenových reverzních serverů je na ftp://rs.internic.net/domain/inaddr.zone.gz, ten ale narozdíl od předešlého potřebovat nebudeme. Uvádím ho jen pro zajímavost.


Kuchařka

Abychom si tedy mohli DNS server nainstalovat, potřebujeme buďto balíček pro naši linuxovou distribuci nebo si ho můžeme přeložit ze zdrojového kódu. Já budu postupovat druhým způsobem, neboť je obtížnější, a také mi to řekl Yenya.

Jelikož chceme , aby byl bezpečný, nainstalujeme ho do takzvaného CHROOTového prostředí. Tím se myslí, že běžící program bude mít změněný adresář / . Pak i v případě, že nám někdo bind, díky nějaké jeho chybě, prolomí nedostane se do celého systému, ale jen do adresáře, kde je pouze bind. Já jsem si zvolil adresář /chroot/named/.

Zdrojové kódy jsou tedy na ftp://ftp.isc.org/isc/bind9/9.1.2/bind-9.1.2.tar.gz Protože bind potřebuje jen standardní ANSI/ISO knihovny a nějaký ANSI/ISO C překladač (např. gcc) tak ho jistě snadno přeložíte, jako já.

  1. configure
  2. make
  3. make install DESTDIR=/chroot/named

Existuje sice i novější verze bindu, ale ta má nějak špatně cesty a já se přiznám, že jsem se po 3 hodinách přemlouvání vzdal a přešel na starší, ale zato funkční 9.1.2.

Teď přiděláme ještě nějaké další soubory do /chrot/named, aby nám to fungovalo.

teď ještě

mknod /chroot/named/dev/null c 1 3
cp /etc/localtime /chroot/named/etc/

přidáme uživatele named do sytému, nepřidělíme mu shell a jako home adresář bude mít /chroot/named, také pro něj uděláme skupinu. Je dobré mít všechny data pohromadě a proto zajistíme, aby v syslogu bylo vidět, co nám náš DNS server píše. V /etc/rc.d/init.d/syslog nahradíme daemon syslogd -m 0 příkazem daemon syslogd -m 0 -a /chroot/named/dev/log. (Někteří pečliví lidé mají konfigurační volby pro syslog v /etc/sysconfig/syslog.)

Nyní ještě uděláme pořádek v /chroot.

No a teď skript pro startování namedu:


#!/bin/sh
#
# named           This shell script takes care of starting and stopping
#                 named (BIND DNS server).
#
# chkconfig: 345 55 45
# description: named (BIND) is a Domain Name Server (DNS) \
# that is used to resolve host names to IP addresses.
# probe: true

# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} = "no" ] && exit 0

[ -f /usr/local/sbin/named ] || exit 0

[ -f /chroot/named/etc/named.conf ] || exit 0

# See how we were called.
case "$1" in
  start)
        # Start daemons.
        echo -n "Starting named: "
        daemon /usr/local/sbin/named -u named -t /chroot/named -c /etc/named.conf
        echo
        touch /var/lock/subsys/named
        ;;
  stop)
        # Stop daemons.
        echo -n "Shutting down named: "
        killproc named
        rm -f /var/lock/subsys/named
        echo
        ;;
  status)
        status named
        exit $?
        ;;
  restart)
        $0 stop
        $0 start
        exit $?
        ;;
  reload)
        /usr/local/sbin/rndc reload
        exit $?
        ;; 
  probe)
        # named knows how to reload intelligently; we don't want linuxconf
        # to offer to restart every time
        /usr/local/sbin/rndc reload >/dev/null 2>&1 || echo start
        exit 0
        ;;
  
  *)
        echo "Usage: named {start|stop|status|restart|reload}"
        exit 1
esac

exit 0

Nastavení named.conf

Soubor, který hlavně ovlivňuje konfiguraci, bude v /chroot/named/etc/named.conf. Jeden zde uvedu a pokusím se vhodně okomentovat.


options {
	directory "/etc/named";       // kde jsou umístěny soubory s nastavením domén
pid-file "/var/run/named.pid"; 
statistics-file "/var/run/named.stats";
};


zone "." IN {
	type hint;
	file "named.ca";      //o tom, kde najít tento soubor a co obsahuje se již psalo
};

zone "localhost" IN {   //definujeme lokální smyčku
	type master;
	file "localhost.zone";
	allow-update { none; };
};

zone "0.0.127.in-addr.arpa" IN {     //reverzní záznam pro lokální smyčku
	type master;
	file "named.local";
	allow-update { none; };
};

zone "officexxl.com" IN {            //záznam o naší doméně
	type master;                        // typ dns serveru
	file "officexxl.com.dns";           //soubor se záznamy o doméně
	allow-update { none; };             //kdo může aktualizovat údaje
	allow-query { any; };		  //kdo může klást dotazy
	allow-transfer { any;};	        //kdo si může přečíst všechny informace o doméně
				//tedy celý soubor officexxl.com.dns 
				//toto právo musí mít všechny sekundární servery
};

view "internal" {
               // síť pro dotazy z místní sítě
      match-clients { 10.0.0.0/8; };
      recursion yes;               
      zone "example.com" {
            type master;
            file "internal.dns";
      };
};
//tato zajímavá věc nám umožní rozlišovat odpoveďi podle toho, kdo se ptá
//nemusí všichni vědet, jaké IP se používají v naší lokální síti
view "external" {
      match-clients { any; };
              // všichni ostatní 
      recursion no;
      zone "example.com" {
           type master;
           file "external.dns
      };
};
//algoritmus klíčů umožnuje, aby například sekundární Ns přijímal jen správně podepsané 
//updaty svých záznamů. Primární i sekundární server mají shodné klíče a pak s nimi
//kontrolují data, která si posílají. 

key "key" {
	algorithm hmac-md5;
        secret "dfDcSjmaDPwvmgVmqvWhzRJXglaveCOajmZTCkXtCmIaUtsGpTipNHIpQDfO";
};

Chtěl jsem zde popsat ještě jak vypadjí jednotlivé soubory s pospisem domén, ale vše bylo podrobně probíráno v předmětu p077. Přesto některé odkazy: