Cache DNS con BIND su FreeBSD

scritto da Antonio Bonifati <antonio.bonifati@libero.it>

Installazione e configurazione

Potete utilizzare il demone DNS che viene con FreeBSD, che sulla FreeBSD 4.5-RELEASE è la versione 8 di BIND, oppure scegliere di installare una versione più recente del pacchetto BIND. Se scegliete un più recente BIND, controllate che non sia già installato, altrimenti installatelo col sysinstall(8) o con pkg_add(1):
$ pkg_info | grep bind
bind-9.1.3          The Berkeley Internet Name Daemon, an implementation of DNS
Questo pacchetto contiene manpage, utility di diagnostica quali dig(1) e host(1), di controllo quali named-checkconf(1) e name-checkzone(1) e il tool amministrativo rdnc(8), file header e librerie del resolver e varia documentazione. In particolare consiglio di iniziare a leggere il manuale in formato HTML e le FAQ:
/usr/local/share/doc/bind9/arm/Bv9ARM.html
/usr/local/share/doc/bind9/FAQ
La documentazione di BIND 8 che viene col FreeBSD 4.5-RELEASE si trova invece qui:
/usr/share/doc/bind/html/index.html
Qui mi limiterò a dare le istruzioni per creare un server DNS di cache usando il demone named(8) che fa parte di FreeBSD (ho installato il BIND 9 solo per avere il manuale introduttivo, ma non lo uso). Un server DNS di pura caching non ha alcuna autorità per nessun dominio, eccetto 0.0.127.in-addr.arpa, cioè il localhost. Un server DNS di sola cache può risolvere sia i nomi interni ad una vostra zona sia quelli esterni, proprio come i nameserver master e slave della vostra zona. Il nameserver di cache può contattare proprio quest'ultimi server (che hanno l'autorità sulla zona) la prima volta che li viene chiesta la risoluzione di un nome e poi si tiene nella cache il risultato, in modo da non doverli ricontattare per una successiva richiesta dello stesso nome, almeno finché il risultato in cache non scade.

E' utile creare un server DNS di cache sui client perché riduce il carico sul master, specialmente se un certo client ha bisogno di effettuare un gran numero di query DNS (ad es. se si desidera la risoluzione degli IP nei log di un server web o altro server). E' utile avere una cache DNS anche per accellerare leggermente le connessioni dial-up.

Il pacchetto bind installato prima non contiene alcun file di configurazione, mentre ci sono dei file di configurazione di esempio in /etc/namedb forniti con la distribuzione di base di FreeBSD relativi alla versione BSD. Il file di configurazione principale da creare è named.conf(5) e lo si può creare in /etc/namedb, facendosi prima una copia del file originale:
# cd /etc/namedb
# mv named.conf named.conf.default
# vi named.conf
// A Caching-only Nameserver

// Subnets we wish to allow queries from.
acl "mysubnet" { 131.175.6.0/24; };
options {
     directory "/etc/namedb";     // Working directory
     pid-file "named.pid";      // Put pid file in working dir
     allow-query { "mysubnet"; };
};
// Root server hints
zone "." { type hint; file "named.root"; };
// Provide a reverse mapping for the loopback address 127.0.0.1
zone "0.0.127.in-addr.arpa" {
     type master;
     file "localhost.rev";
     notify no;
};
Naturalmente potete anche scegliere una working directory differente. Il file che abbiamo chiamato root.hint deve contenere gli indirizzi IP dei server DNS di root da cui attingere e deve essere posizionato nella directory scelta prima /etc/namedb. Questo file può essere ottenuto facendo una query di tipo ns sul dominio generico . ad uno dei vostri nameserver master o slave, se volete utilizzare gli stessi server root che usano loro:
# dig . ns >named.root
oppure potete utilizzare quello che viene di default con FreeBSD, oppure reperire la versione aggiornata da ftp://ftp.rs.internic.net/domain/named.root. Nel momento in cui scrivo la versione distribuita con FreeBSD è aggiornata, quindi ho utilizzato quella. Ogni tanto (es. una volta al mese) andare a scaricare la versione aggiornata, oppure potete automatizzare la cosa con cron(8).

Infine il file di dati per l'interfaccia di loopback localhost.rev potete ottenerlo lanciando sempre nella directory /etc/namedb, lo script make-localhost con la shell sh(1):
# sh make-localhost
# cat localhost.rev
Ora controllate la configurazione:
# named-checkconf /etc/namedb/named.conf
the default for the 'auth-nxdomain' option is now 'no'
# echo $?
0
Avviate poi il demone named(8), il quale sta in ascolto sulle seguenti porte:
# grep ^domain /etc/services
domain           53/tcp    #Domain Name Server
domain           53/udp    #Domain Name Server
# named
# sockstat -4l | grep named
root     named      678    4 udp4   *:1139                *:*               
root     named      678   20 udp4   131.175.6.134:53      *:*               
root     named      678   21 tcp4   131.175.6.134:53      *:*               
root     named      678   22 udp4   127.0.0.1:53          *:*               
root     named      678   23 tcp4   127.0.0.1:53          *:*               
# tail /var/log/messages
...
Jun 15 10:14:50 ninux named[677]: starting (/etc/namedb/named.conf).  named 8.2.4-REL Mon Jan 28 12:52:14 GMT 2002      murray@builder.freebsdmall.com:/usr/obj/usr/src/usr.sbin/named
Jun 15 10:14:50 ninux named[678]: Ready to answer queries.
...
Per avviarlo automaticamente al boot, aggiungete la seguente riga in /etc/rc.conf:
named_enable="YES"
date poi un'occhiata a security(7) che consiglia di aggiungere anche questo per evitare che named(8) giri con i permessi di root:
named_flags="-u bind -g bind"
Durante l'avvio il messaggio seguente confermerà l'avvio di named(8):
Doing additional network setup: named.

Testing

Ora non resta che provare. Il file resolv.conf(5) posizionato in /etc/resolv.conf indica i nameserver da usare e sarà simile al seguente:
domain  rett.polimi.it
nameserver      131.175.12.1
nameserver      131.175.12.2
inserite una prima opzione nameserver seguita dal vostro nome host, nel mio caso si tratta dell'IP corrispondente a ninux.rett.polimi.it:
domain  rett.polimi.it
nameserver  131.175.6.134
nameserver      131.175.12.1
nameserver      131.175.12.2
adesso per tutte le risoluzioni viene usata la cache locale quando. Anche altri PC che rientrano nella acl definita prima (nel mio caso tutti quelli sulla subnet 131.175.6.0/24) possono usare la vostra cache, aggiungendo quella stessa linea nei loro resolv.conf(5). Per tutti gli altri le query saranno rifiutate:
# nslookup www.polimi.it ninux.rett.polimi.it
*** Can't find server name for address 131.175.6.134: Query refused
*** Default servers are not available

Riferimenti