La rete di casa, passo passo

Dare nomi ai computers (configurazione del DNS)




Il DNS (Domain Name System)


Nel mondo dei PC Windows i nomi dei computer sono semplicemente identificatori che mettete nella finestra "System Properties" quando installate Windows; qundo cercate fra le risorse condivise in rete vedete questi nomi, e li usate per spostare files fra i computers o condividere le stampanti.

In Linux (ed Unix) i nomi sono piu' importanti. In un certo senso ogni PC Linux e' un piccolo server ed ogni computer puo' avere un sacco di servizi di rete attivi (di sincronizzazione, servers web, trasferimento files, backup, connessione remota etc. etc.), i computer sono spesso usati da remoto, e vi serve un vero nome per ogni computer, come vi serve un indirizzo numerico (numero IP).

Gli umani usano nomi per indicare le cose, il software di rete usa invece numeri IP, cosi' ci vuole qualcosa per tradurre nomi in numeri IP per poter usare facilmente servizi che corrono su diversi computers.

Il vecchio sistema per fare questo (da prima che esistesse internet) era mettere nomi e numeri in un file di configurazione su ogni computer (file /etc/hosts). Il software di rete guardava in questo file per trovare le corrispondenze fra nomi e numeri. In questo modo, pero', bisognava copiare questo file su tutti i computers ed aggiornare tutte le copie ogni volta che si cambiava un mome. Un lavoraccio, ed allora fu inventato il DNS, appena la rete inizio' a crescere (1983-84), e fu scritto il primo programma che facesse da server DNS.

Il server DNS e' un programma server che mantiene un datasbase con numeri IP e nomi di computers (detto DNS), il server sta in ascolto, in rete, alla porta 53 e risponde a richieste di numeri e nomi, restituendo l'IP di un dato nome, od il nome di un dato IP.

I nomi dei computers sono scritti come una serie di parole semplici, separate da punti, ad esempio: www.helldragon.eu Il nome riflette una struttura gerarchica nella gestione del database, ogni parola indica un cosidetto dominio, ogni dominio puo' avere dei sottodomini; ad esempio, in www.helldragon.eu, eu e' il dominio principale per l'Europa, gestito da EURid (www.eurid.eu) helldragon e' il nome del mio dominio, sottodominio di eu, gestito, per mio conto, dal mio provider, www e' il nome di un computer nel mio dominio.

Anche i numeri dei computers sono scritti con la notazione a punti, ad esempio: 192.168.1.10; in questo numero, come abbiamo gia' spiegato altrove, la prima parte (192.168.1) rappresenta la rete e l'ultima (10) un computer della rete.

Il DNS e' un database distribuito, nel senso che ogni organizzazione mantiene, sui suoi servers, solo la parte che la riguarda e che gestisce. I server DNS dei domini principali (ad esempio .eu ) si chiamano "root servers" e contengono in pratica solo nomi e numeri dei name servers dei sottodomini.

Per cercare il numero IP di un nome si procede lungo la linea gerarchica in modo "top-down": quando il vostro software cerca www.helldragon.eu, va a chiedere al server .eu, che non contiene i numeri dei computer del sottodominio helldragon, ma restituisce il numero IP del DNS server del sottodominio helldragon.eu, il vostro software va quindi a chiedere a questo DNS per ottenere il numero del computer di nome www.

Un name server puo' essere "ricorsivo": quando riceve una richiesta va lui ai root nameservers e scorre tutti i sottodomini fino a che non ottiene la risposta e ve la restituisce.

Un name server che mantiene la copia principale dei dati per un dominio si dice sia "authoritative" per quel dominio, ci sono anche name servers "secondari" che contengono copie di riserva del database, e name servers "cache-only", che non contengono una parte del database, ma si ricordano delle richieste precedenti e le mettono in un'area di memoria detta cache, per cui se qualcuno chiede di nuovo un nome, la risposta e' gia' pronta. Un name server puo' anche essere configurato associato ad altri nameservers, che usa come forwarders: cioe' inoltra le richieste ad altri nameservers (i forwarders), e solo se non gli danno la risposta se la cerca da solo.

Nei nameservers e' molto importante la cache: tutti i name servers hanno una cache; se tutte le richieste fossero fatte secondo lo schema "top-down" si finirebbe per sovraccaricare i root nameservers; ma se si chiede ad un nameserver con una cache, che fa ricerche ricorsive, e quindi si fa una cache molto ricca, si puo' ottenerre una risposta veloce senza disturbare i "root nameservers". Si usano infatti i dati che molto probabilmente sono gia' nella cache. Questa combinazione di forwarders, ricerche ricorsive e cache fa si' che le richieste al DNS porcedano un po' secondo lo schema top-down, ed un po bottom-up, per cui si evita di sovracaricare i root servers, e si ha risposte piu' veloci.Anche certe applicazioni, come Internet Explorer, mantengono una cache di nomi e numeri.

Il DNS e' un sistema cruciale per il funzionamento di internet, e' gestito dall' "Internet Corporation for Assigned Names and Numbers", (www.icann.org) che e' in qualche modo controllato dal governo statunitense, le ditte che registrano i nomi di dominio devono essere accreditate presso l' ICANN, e pagano una quota annuale.
Tramite l' "Internet Assigned Numbers Authority" (IANA www.iana.org) l'ICANN gestisce i root servers (con i domini di primo livello, detti "top level domain") e la distribuzione dei numeri IP. C'e' anche un dominio di primo livello per ogni paese, gestito da ogni paese in modo autonomo.

Per trovare nomi e numeri in internet il DNS deve essere unico, ma ad alcuni non e' piaciuta la gestione del DNS e si sono organizzati il loro DNS; vedi ad esempio: ORSN (european.ch.orsn.net) , che gestisce una serie di root server alternativi (ma sincronizzati con quelli dell'ICANN); OPENNIC (www.opennic.unrated.net), new.net (www.new.net) , "Cesidian root" (www.cesidianroot.com) o (namespace.org) che aggiunge nuovi domini di primo livello.

Questi DNS alternativi per fortuna non hanno avuto molto successo, avere diversi DNS avrebbe reso irragiungibili alcuni siti e tutto internet piu' complicato.




Configurazione del DNS


Torniamo al nostro problema: dare nomi ai computers della nostra rete di casa (la nostra LAN).

Il problema si risolve configurando un name server privato su uno dei computers della LAN, tutti i computers saranno configurati in modo da utilizzare questo come name server, che sara' "autoritative" per il nostro dominio privato, che conterra' i nomi dei nostri computers, e inoltrera' tutte le altre richieste al router, se fa da name server, oppure ai name servers del nostro provider, che speriamo abbiano una grande cache. Anche il nostro name server privato avra' una cache.

Chiameremo il nostro dominio privato: "miodominio" e vogliamo chiamare il computer con indirizzo IP: 192.168.1.1 come: "nessie.miodominio", "shenron.miodominio" sara' invece il computer 192.168.1.2. Questi nomi non saranno visibili fuori della LAN, il nameserver e' su un computer nascosto, nessuno da fuori lo vede.

Ogni distribuzioni Linux ha, come nameserver, il programma bind. Questo programma e' gestito dall' "Internet Software Consortium: (www.isc.org ) ed e' usato dalla maggioranza dei server DSN. Talvolta il programma viene installato per default, configurato come un name server "cache-only", e dovete solo aggiustare la configurazione.
Altrimenti usate il "package manager" della vostra distribuzione per installarlo. Con la Debian (od Ubuntu) e' facile, aprite una shell di root e scrivete:

apt-get install bind9

Qui descrivero' solo l'essenziale per avere un sistema che funziona, ma se volete tutti i dettagli della configurazione di bind potete dare un'occhiata al documento:
"DNS Howto" : (langfeldt.net/DNS-HOWTO);
Ci sono anche libri sul DNS, come:
"The Concise Guide to DNS and BIND" di Nicolai Langfeldt, pubblicato da Que;
"DNS and BIND" di Cricket Liu e P. Albitz, pubblicato da O'Reilly;




Il file: named.conf


In Linux Debian il file principale di configurazione e': /etc/bind/named.conf, in altre distribuzioni potete trovare un file: /etc/named.conf; al solito, tutti i sistemi Linux sono un po' diversi ...

Vediamo le parti importanti di questo file:

acl "clienti_autorizzati" { 127/8 ; 192.168.1.0/24 ; }; 
con questa linea definisco una "access list", che usero' poi, e che contiene tutti i computers della mia LAN, rete 192.168.1.0; ma voi potete anche fare a meno di un'access list.

All'inizio del file abbiamo un certo numero di opzioni, che definiscono il comportamento del server DNS; le opzioni possibili sono tante, e sono descritte nel manuale di bind; nel mio named.conf ho le seguenti:

options {
         directory "/var/cache/bind";
         forward first ;                
         forwarders {
                213.205.32.70 ;
                213.205.36.70 ;                 
         };
queto dice che tutti i files temporanei, usati da bind, verranno messi in: /var/cache/bind, che, prima di fare una ricerca, si devono interpellare i server DNS usati come forwarders, e fornisce il numero IP dei forwarders, che qui sono i server DNS del mio provider.
       
   recursion yes;
   allow-recursion { clienti_autorizzati; }; 
 };     
Questo rende possibili ricerche ricorsive, ma solo per le macchine autorizzate (quella della access list che ho definito sopra), in questo modo le ricerche le fa il server DNS in modo completo, piuttosto che i singoli computers (andando a chiedere a diversi DNS). In questo modo spero che il mio server conservi molti indirizzi nella sua cache.

Dopo le opzioni abbiamo una descrizione delle zone gestite dal mio name server:

zone "." {
        type hint;
        file "/etc/bind/db.root";
};
questo dice che il file: db.root contiene i numeri IP dei root servers, i server da cui parte la ricerca, secondo lo schema top-bottom.

zone "miodominio" {
       type master;
       file "/etc/bind/db.miodominio"; 
       allow-transfer {     
             192.168.1.2 ;    
        }; 
};
Questo definisce la mia zona, il mio nameserver e' "authoritative" per la zona: "miodominio"; e' il server principale della zona (il master) i numeri IP ed i nomi dei miei computers sono nel file: db.miodominio
Con la direttiva: "allow-transfer" possiamo far si' che solo alcuni computers possano chiedere al server una copia del database della zona. Io ho un name server secondario, su un PC con IP: 192.168.1.2, e questo computer e' autorizzato a farsi dare una copia del database.
"notify no" rende il nostro server DNS molto riservato, manda in giro messaggi solo dietro esplicita richiesta, non manda dei broadcast sulla rete annunciando la sua esistenza.

zone "1.168.192.in-addr.arpa" {
        type master;
        file "/etc/bind/db.192.168.1"; 
        allow-transfer {     
               192.168.1.2 ; 
        }; 
Quest e' una zona fittizia, usata per tradurre numeri in nomi, invece che nomi in numeri (reverse zone), siamo master server anche di questa zona.

Abbiamo poi altre zone, che corrispondono al nostro loopback address, (i.e. l'IP con cui il computer vede se stesso); per queste zone possiamo lasciare i defaults:

zone "localhost" {
         type master;
         file "/etc/bind/db.local";
};
        
zone "127.in-addr.arpa" {
         type master;
         file "/etc/bind/db.127";
};




I files delle zone


I numeri e nomi del mio dominio sono nel file: db.miodominio, questi files sono chiamati: "zone files", e costuiscono il database del server DNS. Oltre che nomi e numeri, in questo file ci sono diverse informazioni; per indicare ciascuna di queste informazioni viene usato il termine "record", ogni tipo di record ha una sua sigla: abbiamo quindi un record: "SOA", un record di tipo "A", un "PTR" etc., il file puo' anche contenere commenti, preceduti da un punto e virgola. I records principali sono:

 
SOA  :  indica l'inizio di un dominio, e contiene alcune opzioni;  
NS :    fornisce l'IP dei name servers del dominio;
A :     un numero IP ;
MX :    il computer che gestisce la posta inviata al dominio;
CNAME : un nome secondario per un computer (un alias) 
PTR :   un puntatore ad un altro record;
TXT :   un commento testuale. 

Ecco alcune parti del file db.miodominio:

$TTL    86400
;
@ IN    SOA     nessie.miodominio. root.nessie.miodominio. (
                     2002101220         ; Serial: numero versione number (date)
                         604800         ; Refresh period : each week
                          86400         ; Retry period   : once a day
                        2419200         ; Expire
                         86400 )        ; Cache TTL: time to live in the caches
;
           IN      NS      nessie.miodominio.
           IN      NS      shenron.miodominio.
;
           IN      MX   10   nessie.miodominio. 
           IN      MX   20   shenron.miodominio.     
;
nessie  IN      A       192.168.1.1 
        IN      HINFO  "PC" "Linux"       
        IN      TXT    " Il vecchio drago di casa" 
        IN      TXT    " Il Drago del Lago " 
        IN      TXT    " AMD K6 200  "
        IN      TXT    ""
;       
;                services for my domain, on nessie
;
master  IN      CNAME    nessie
www     IN      CNAME    nessie 
mail    IN      CNAME    nessie 

;

Il record SOA fornisce alcuni dati: nessie.miodominio e' il master name server, i mail per la gestione di questo dominio vanno mandati all'utente di nome root; ci sono poi dei numeri che indicano quanto a lungo i DNS secondari possono tenere copia dei dati senza doverli aggiornare.

TTL e' il parametro "time to leave" della zona: dopo 86400 secondi (24 ore) i dati della zona sono cancellati dalle cache dei name server che, dopo aver fatto una richiesta, li hanno conservati, e le richieste devono essere ripetute. Se fate cambiamenti di rado potete mettere un TTL piu' lungo.

I record NS danno i nomi dei nameservers della zona. Io ho un master name server: "nessie", ed uno secondario: "shenron", che mantiene una copia dei dati. Nella rete di casa in realta' non avete bisogno di molti name servers, uno puo' bastare, ma altrimenti e' prassi avere 2-3 nameserver secondari, per distribuire il carico ed avere name servers di backup in caso il master si guasti.

MX dice a che computer va mandata la posta diretta al dominio, qui la posta va mandata a nessie, se nessie non e' disponibile, a shenron.

Avete poi dati dettagliati per ogni computer, per nessie vedete l'indirizzo: 192.168.1.1, qualche informazione sull'hardware (HINFO), e dei commenti (records TXT)

Un computer puo' avere molti nomi (alias) segnalati da records CNAME; qui diciamo che nessie puo' anche esere chiamato coi nomi di master, www o mail. Gli alias sono spesso usati per reindirizzare un servizio: cercare www.miodominio significa accedere al server web su nessie. E' questo il tipo di reindirizzamento che usa google per fornire servizi.

Abbiamo quasi finito; per trovare i nomi che corrispondono ad un indirizzo c'e una "reverse zone", che essenzialmente contiene record di tipo PTR, che sono puntatori a record della vostra zona; il file: db.192.168.1 contiene:

@   IN   SOA   nessie.miodominio. root.nessie.miodominio. (
               1         ; Serial
               604800         ; Refresh
               86400         ; Retry
               2419200         ; Expire
               604800 )       ; Negative Cache TTL
;
@       IN      NS      nessie.miodominio.
        IN      NS      shevron.miodominio.
;       
1       IN      PTR     nessie.miodominio.
2       IN      PTR     shevron.miodominio.
3       IN      PTR     grisou.miodominio.
;  
Questo significa che se cercate 192.168.1.1 dovete far riferimento al computer: nessie.miodominio, se cercate 192.168.1.2 dovete far riferimento a shevron.miodominio e cosi' via.




Far partire il server DNS


E' facile, sistemate i vostri files di configurazione, poi usate il programma: named-checkconf, per controllare il file di configurazione principale ed il programma: named-checkzone, per controllare gli "zone files". Cioe' aprite una shell e scrivete qualcosa del tipo:

  named-checkconf
  named-checkzone miodominio miodominio.db 

Se tutto va bene potete far partire il name server; in alcune distribuzioni ci sono tool grafici per farlo, altrimenti, per farla semplice, aprite la solita shell di root e scrivete:

/etc/init.d/bind9 start 
in certe distribuzioni c'e' invece:
/etc/init.d/bind start 
il comando non funziona se il DNS e' gia' attivo. Per fermarlo si puo' fare:
/etc/init.d/bind stop 

Se fate correzioni ai files del DNS, dovete farglieli rileggere per rendere attive le correzioni; rndc e' il programma che pilota il server, e per far ricaricare le configurazioni si fa:

 rndc reload 
 
i programmi host o dig fanno richieste al name server, potete usarli per provare il vostro server.
 host nessie 
 
dovrebbe darvi:
nessie.dragons has address 192.168.1.1

Quando tutto e' a posto potete configurare i vostri computers perche' chiedano i nomi al vostro name server, in genere questo si fa mettendo l'IP del server nel file: /etc/resolv.conf. Questo file contiene gli indirizzi dei name servers da interpellare e i nomi di dominio da aggiungere a nomi forniti senza un suffisso completo, ad esempio quando cercate "nessie" invece che "nessie.miodominio":

 /etc/resolv.conf
 search miodominio 
 nameserver 192.168.1.1
 nameserver 192.168.1.2

C'e' anche il file: /etc/nsswitch.conf che dovrebbe contenere una linea con:

 hosts:          files  dns 
 
che dice al vostro computer di cercare prima nel file /etc/hosts e solo se non ci trova i nomi chiedere ai nameserver. Se mettete:
 hosts:  dns files
 
Si chiede prima ai name servers, poi si guarda nel file. In effetti se avete solo 2 o 3 nomi e non li cambiate spesso potete usare il vecchio sistema; mettere i vostri nomi nel file /etc/hosts ed ignorate tutto quello che c'e' scritto in questa pagina. Windows ha un file analogo, si chiama lmhosts e si trova in: Windows\System32\Drivers\Etc