Avanti Indietro Indice

3. Un name server cache

Un primo approccio alla configurazione del DNS, molto utile per gli utenti con collegamento telefonico, cable modem, ADSL e simili

Sulla Red Hat e sulle distribuzioni da essa derivate potrete fare le cose descritte in questa prima sezione dell'HOWTO installando i pacchetti bind, bind-utils e caching-nameserver. Se siete utenti Debian installerete semplicemente bind (o bind9, pur non essendo BIND 9 supportato dall'attuale distribuzione stabile di Debian, potato) e bind-doc. Naturalmente il solo installare questi pacchetti non vi insegnerà tanto quanto leggere l'HOWTO. Quindi installate pure i pacchetti e poi verificate i file che essi hanno installato.

Un name server che fa solo da cache troverà le risposte alle interrogazioni e ricorderà le risposte la prossima volta che ne avrete bisogno. Questo abbrevierà significativamente il tempo di attesa per le interrogazioni successive, specialmente se avete una connessione lenta.

Prima di tutto vi occorre un file chiamato /etc/named.conf (Debian: /etc/bind/named.conf). Questo viene letto quando named parte. Per adesso dovrebbe contenere semplicemente:


// Config file for caching only name server
//
// The version of the HOWTO you read may contain leading spaces
// (spaces in front of the characters on these lines ) in this and
// other files.  You must remove them for things to work.
//
// Note that the filenames and directory names may differ, the
// ultimate contents of should be quite similar though.

options {
        directory "/var/named";

        // Uncommenting this might help if you have to go through a
        // firewall and things are not working out.  But you probably
        // need to talk to your firewall admin.

        // query-source port 53;
};

controls {
        inet 127.0.0.1 allow { localhost; } keys { rndc_key; };
};

key "rndc_key" {
        algorithm hmac-md5;
        secret "c3Ryb25nIGVub3VnaCBmb3IgYSBtYW4gYnV0IG1hZGUgZm9yIGEgd29tYW4K";
};

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

zone "0.0.127.in-addr.arpa" {
        type master;
        file "pz/127.0.0";
};

I pacchetti presenti nelle distribuzioni Linux potrebbero usare nomi di file differenti da quelli menzionati; conterranno comunque le stesse cose.

La riga "directory" dice a named dove andare a cercare i file. Tutti i file nominati in seguito saranno relativi a questa directory. Perciò pz è una directory sotto /var/named, ovvero /var/named/pz. /var/named è la giusta directory in accordo con il Linux File system Standard.

Vi è citato il file chiamato /var/named/root.hints, che dovrebbe contenere quanto segue:


;
; There might be opening comments here if you already have this file.
; If not don't worry.
;
; About any leading spaces in front of the lines here: remove them!
; Lines should start in a ;, . or character, not blanks.
;
.                       6D  IN      NS      A.ROOT-SERVERS.NET.
.                       6D  IN      NS      B.ROOT-SERVERS.NET.
.                       6D  IN      NS      C.ROOT-SERVERS.NET.
.                       6D  IN      NS      D.ROOT-SERVERS.NET.
.                       6D  IN      NS      E.ROOT-SERVERS.NET.
.                       6D  IN      NS      F.ROOT-SERVERS.NET.
.                       6D  IN      NS      G.ROOT-SERVERS.NET.
.                       6D  IN      NS      H.ROOT-SERVERS.NET.
.                       6D  IN      NS      I.ROOT-SERVERS.NET.
.                       6D  IN      NS      J.ROOT-SERVERS.NET.
.                       6D  IN      NS      K.ROOT-SERVERS.NET.
.                       6D  IN      NS      L.ROOT-SERVERS.NET.
.                       6D  IN      NS      M.ROOT-SERVERS.NET.
A.ROOT-SERVERS.NET.     6D  IN      A       198.41.0.4
B.ROOT-SERVERS.NET.     6D  IN      A       128.9.0.107
C.ROOT-SERVERS.NET.     6D  IN      A       192.33.4.12
D.ROOT-SERVERS.NET.     6D  IN      A       128.8.10.90
E.ROOT-SERVERS.NET.     6D  IN      A       192.203.230.10
F.ROOT-SERVERS.NET.     6D  IN      A       192.5.5.241
G.ROOT-SERVERS.NET.     6D  IN      A       192.112.36.4
H.ROOT-SERVERS.NET.     6D  IN      A       128.63.2.53
I.ROOT-SERVERS.NET.     6D  IN      A       192.36.148.17
J.ROOT-SERVERS.NET.     6D  IN      A       198.41.0.10
K.ROOT-SERVERS.NET.     6D  IN      A       193.0.14.129
L.ROOT-SERVERS.NET.     6D  IN      A       198.32.64.12
M.ROOT-SERVERS.NET.     6D  IN      A       202.12.27.33

Questo file descrive i root name server nel mondo. Esso cambia col tempo e deve essere aggiornato se necessario. Leggete la sezione Manutenzione per sapere come fare.

La sezione successiva in named.conf è l'ultima zone. Spiegherò il suo utilizzo nell'ultimo capitolo, per adesso create solo un file chiamato 127.0.0 nella sottodirectory pz: (Nuovamente, se fate copia e incolla rimuovete gli spazi iniziali)


$TTL 3D
@               IN      SOA     ns.linux.bogus. hostmaster.linux.bogus. (
                                1       ; Serial
                                8H      ; Refresh
                                2H      ; Retry
                                4W      ; Expire
                                1D)     ; Minimum TTL
                        NS      ns.linux.bogus.
1                       PTR     localhost.

Le sezioni chiamate key e controls insieme significano che il vostro named potrà essere controllato in remoto da un programma chiamato rndc se esso si connette dall'host locale e identifica se stesso con la chiave segreta codificata. Questa chiave è come una password. Per far sì che rndc funzioni avrete bisogno di un file /etc/rndc.conf come questo :


key rndc_key {
    algorithm "hmac-md5";
    secret "c3Ryb25nIGVub3VnaCBmb3IgYSBtYW4gYnV0IG1hZGUgZm9yIGEgd29tYW4K";
};

options {
    default-server localhost;
    default-key    rndc_key;
};

Come potete vedere il segreto è identico a quello di named.conf. Se volete usare rndc da altre macchine esse devono avere tempi non più distanti di 5 minuti una dall'altra. Raccomando di usare il software ntp (xntpd e ntpdate) per fare ciò.

Poi avrete bisogno di un /etc/resolv.conf che somigli vagamente a questo: (togliete gli spazi!)


search sottodominio.proprio-dominio.edu proprio-dominio.edu
nameserver 127.0.0.1

La riga "search" specifica su quali domini deve avvenire la ricerca per ogni nome di host al quale volete collegarvi. La riga nameserver specifica l'indirizzo del vostro name server, in questo caso la vostra stessa macchina, poiché è qui che named lavora (127.0.0.1 è corretto, non importa se la macchina ha già un altro indirizzo). Se volete inserire più name server mettete una riga "nameserver" per ognuno di essi. (Nota: named non legge mai questo file, il risolutore che usa named invece sì. Nota 2: in alcuni resolv.conf troverete una riga dove è scritto "domain". È corretto, ma non usate insieme "search" e "domain", funzionerà solo una delle due).

Vediamo cosa fa questo file: se un client cerca la macchina pippo, allora il primo tentativo che verrà fatto sarà pippo.sottodominio.vostro-dominio.edu, poi pippo.vostro-dominio.edu e infine pippo. Se un client cerca sunsite.unc.edu, il primo tentativo sarà sunsite.unc.edu.sottodominio.vostro-dominio.edu, poi sunsite.unc.edu.vostro-dominio.edu e infine sunsite.unc.edu. Vi potrebbe convenire non mettere troppi domini nella riga di ricerca, si impiega del tempo a provarli tutti.

L'esempio assume che voi facciate parte del dominio sottodominio.vostro-dominio.edu, quindi probabilmente la vostra macchina sarà vostra-macchina.sottodominio.vostro-dominio.edu. La riga di ricerca non dovrebbe contenere il vostro TLD (Top Level Domain, "edu" in questo caso). Se avete spesso bisogno di collegarvi a host in un altro dominio, potrete aggiungerlo in una riga di ricerca come questa: (Ricordate di togliere gli spazi iniziali, se presenti)


search sottodominio.vostro-dominio.edu vostro-dominio.edu altro-dominio.com

e così via. Ovviamente dovrete metterci domini reali. Notate l'assenza del punto alla fine dei nomi di dominio. Questo è importante.

3.1 Far partire named

Adesso è ora di far partire named. Se state usando una connessione telefonica, per prima cosa collegatevi. Adesso fate partire named, o lanciando lo script /etc/init.d/named start o named direttamente con /usr/sbin/named. Se avete provato prima d'ora qualche versione di named avrete usato ndc. In BIND 9 è stato rimpiazzato da rndc, che può controllare il vostro named da remoto, ma non può far ripartire named un'altra volta. Se andate a leggere il file che contiene il log di sistema (usualmente chiamato /var/log/messages, in Debian è /var/log/daemon, controllate anche la directory /var/log e un altro file da controllare in questa è syslog) quando named parte (fate tail -f /var/log/messages) dovreste leggere qualcosa di simile a:

(le righe che terminano per "\" continuano sulla riga successiva)

Dec 23 02:21:12 lookfar named[11031]: starting BIND 9.1.3
Dec 23 02:21:12 lookfar named[11031]: using 1 CPU
Dec 23 02:21:12 lookfar named[11034]: loading configuration from \
    '/etc/named.conf'
Dec 23 02:21:12 lookfar named[11034]: the default for the \
    'auth-nxdomain' option is now 'no'
Dec 23 02:21:12 lookfar named[11034]: no IPv6 interfaces found
Dec 23 02:21:12 lookfar named[11034]: listening on IPv4 interface lo, \
    127.0.0.1#53
Dec 23 02:21:12 lookfar named[11034]: listening on IPv4 interface eth0, \
    10.0.0.129#53
Dec 23 02:21:12 lookfar named[11034]: command channel listening on \
    127.0.0.1#953
Dec 23 02:21:13 lookfar named[11034]: running

Se ci sono messaggi d'errore significa che c'è un problema. Named dirà il nome del file in cui si cela. Tornate indietro per controllare quel file e fate ripartire named una volta sistemato.

Adesso potete testare la vostra configurazione. Per fare ciò si usava tradizionalmente un programma chiamato nslookup. Oggi si raccomanda di usare dig:

$ dig -x 127.0.0.1
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 26669
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0

;; QUESTION SECTION:
;1.0.0.127.in-addr.arpa.                IN      PTR

;; ANSWER SECTION:
1.0.0.127.in-addr.arpa. 259200  IN      PTR     localhost.

;; AUTHORITY SECTION:
0.0.127.in-addr.arpa.   259200  IN      NS      ns.linux.bogus.

;; Query time: 3 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Dec 23 02:26:17 2001
;; MSG SIZE  rcvd: 91

Se corrisponde a quello che vedete significa che sta funzionando. Lo spero. Altrimenti tornate indietro e ricontrollate tutto. Ogni volta che cambiate un file dovete far ripartire named con il comando rndc reload.

Adesso potete immettere un'interrogazione ("query"). Cercate di fare il lookup di macchine vicine a voi. pat.uio.no è vicina a me, all'università di Oslo:

$ dig pat.uio.no
; <<>> DiG 9.1.3 <<>> pat.uio.no
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 15574
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 0

;; QUESTION SECTION:
;pat.uio.no.                    IN      A

;; ANSWER SECTION:
pat.uio.no.             86400   IN      A       129.240.130.16

;; AUTHORITY SECTION:
uio.no.                 86400   IN      NS      nissen.uio.no.
uio.no.                 86400   IN      NS      nn.uninett.no.
uio.no.                 86400   IN      NS      ifi.uio.no.

;; Query time: 651 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Dec 23 02:28:35 2001
;; MSG SIZE  rcvd: 108

dig adesso ha chiesto al vostro named di cercare la macchina pat.uio.no. Poi contatta una delle macchine name server indicate nel file root.hints e chiede loro la strada per arrivarci. Potrebbe essere necessario un po' di tempo prima che sia disponibile il risultato, come potrebbe essere necessario cercare in tutti i domini elencati in /etc/resolv.conf.

Se lo chiederete nuovamente, otterrete questo:

$ dig pat.uio.no

; <<>> DiG 8.2 <<>> pat.uio.no 
;; res options: init recurs defnam dnsrch
;; got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 4
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 3
;; QUERY SECTION:
;;      pat.uio.no, type = A, class = IN

;; ANSWER SECTION:
pat.uio.no.             23h59m58s IN A  129.240.130.16

;; AUTHORITY SECTION:
UIO.NO.                 23h59m58s IN NS  nissen.UIO.NO.
UIO.NO.                 23h59m58s IN NS  ifi.UIO.NO.
UIO.NO.                 23h59m58s IN NS  nn.uninett.NO.

;; ADDITIONAL SECTION:
nissen.UIO.NO.          23h59m58s IN A  129.240.2.3
ifi.UIO.NO.             1d23h59m58s IN A  129.240.64.2
nn.uninett.NO.          1d23h59m58s IN A  158.38.0.181

;; Total query time: 4 msec
;; FROM: lookfar to SERVER: default -- 127.0.0.1
;; WHEN: Sat Dec 16 00:23:09 2000
;; MSG SIZE  sent: 28  rcvd: 162

Come potete notare chiaramente questa volta è stato molto più veloce, 4 ms rispetto a più di mezzo secondo. La risposta era in cache. Con le risposte in cache c'è la possibilità che siano scadute, ma i server di origine possono controllare da quanto tempo quelle risposte stanno nella cache e se possono essere considerate valide, così c'è un'alta probabilità che la risposta ottenuta sia valida.

3.2 Risolutori

Tutti i sistemi operativi che implementano lo standard C API hanno le chiamate gethostbyname e gethostbyaddr. Queste possono prelevare informazioni da diverse fonti. Le fonti da cui prelevare informazioni sono configurate in /etc/nsswitch.conf su Linux (e anche su altri Unix). Questo è un lungo file che specifica da quali file o database andare a prelevare diversi tipi di dati. Solitamente all'inizio è ricco di utili indicazioni che è bene leggere. Dopo di ché cercate la riga che comincia per "hosts:"; dovreste leggervi:


hosts:      files dns

(Vi ricordate degli spazi iniziali, vero? Non ve lo ricorderò mai più.)

Se non ci fosse la riga "hosts:", mettetela in una di quelle sopra. Essa significa che i programmi dovrebbero prima cercare nel file /etc/hosts, poi andare a chiedere al DNS in accordo con resolv.conf.

3.3 Congratulazioni

Adesso sapete come impostare una versione con cache di named. Prendetevi una birra, del latte o qualunque cosa vi piaccia per celebrare l'evento.


Avanti Indietro Indice