Come funziona il sistema DNS e come si gestisce un DNS server con Bind

Il Domain Name System (DNS) e uno tra i servizi meno compresi ma allo stesso tempo tra i piu importanti di Internet. Il DNS e definito negli RFC 1034 e 1035, ed il ha il fondamentale ruolo di convertire i nomi degli host collegati ad una rete (Internet ad esempio) in indirizzi IP e viceversa. Nella pratica esegue una semplice traduzione. Gli esseri umani per loro natura sono portati a ricordare con piu facilita stringhe di caratteri, nomi nella fattispecie, mentre i computer per la loro architettura devono gestire tutto con sequenze di numeri.

Il Domain Name System (DNS) è uno tra i servizi meno compresi ma allo stesso tempo tra i più importanti di Internet. Il DNS è definito negli RFC 1034 e 1035, ed il ha il fondamentale ruolo di convertire i nomi degli host collegati ad una rete (Internet ad esempio) in indirizzi IP e viceversa. Nella pratica esegue una semplice traduzione. Gli esseri umani per loro natura sono portati a ricordare con più facilità stringhe di caratteri, nomi nella fattispecie, mentre i computer per la loro architettura devono gestire tutto con sequenze di numeri.

Ogni computer collegato ad una rete possiede un indirizzo numerico chiamato indirizzo IP, che identifica in modo univoco quella macchina, ed i computer hanno bisogno di questi indirizzi per poter comunicare. Prendiamo un esempio di navigazione su Internet. Nel momento in cui si digita nel browser un URL, come ad esempio www.hostingtak.it, il server DNS dell’Internet Provider, o del server tramite cui viene eseguito l’accesso ad Internet, traduce il nome mnemonico del sito nel corrispondente indirizzo IP 85.94.195.104, ed il browser lo utilizza per accedere alle informazioni richieste.

NSLookup e la risoluzione dei nomi

Una possibilità per trovare la corrispondenza tra i due tipi di indirizzi è quella di fare un ping verso l’indirizzo di cui si vuole conoscere, e tra i dati restituiti viene fornito anche l’IP cercato. Linux mette a disposizione un comando molto semplice, “nslookup” per l’appunto, con il quale è possibile risalire all’indirizzo IP di un host di cui si conosce l’indirizzo mnemonico.

gabriele@gabriele:∼# nslookup www.google.it

Server: 172.28.8.1

Address: 172.28.8.1#53

Non-authoritative answer:

www.google.it      canonical name = www.google.com.

www.google.com canonical name = www.l.google.com.

Name: www.l.google.com.

Address: 72.14.234.104

Il campo Address restituisce quello che cercavamo

La struttura del DNS

Prima dell’introduzione del sistema DNS, la gestione delle corrispondenze tra indirizzi IP e nomi mnemonici di tutte le macchine collegate, era affidata allo Stanford Research Institute Network Information Center (SRI-NIC) che si preoccupava di mantenere tutte le corrispondenze in un singolo file, chiamato HOSTS.TXT. Tutti i computer periodicamente accedevano a questo file per ottenere una copia aggiornata.  Con la crescita esponenziale del numero di sistemi  collegati ad Internet, questa gestione è diventata inaccettabile a causa del numero di accessi che non poteva più essere gestito oltre che del numero di sistemi da memorizzare, e così fu introdotto il DNS.

Il DNS è nella pratica un database distribuito e ciò significa che non esiste un unico computer in tutto il mondo che è in grado di risalire all’indirizzo di IP di un altro collegato ad Internet a partire dall’indirizzo mnemonico.

Le informazioni sono distribuite su migliaia di computer, i server DNS. Ognuno di questi server è responsabile di una certa porzione del nome, detta dominio. I server sono organizzati secondo una struttura gerarchica ad albero che presenta molta somiglianza con la struttura del file system UNIX. Il suo nome è albero dei domini.  Un esempio è quello mostrato in figura, che rappresenta i livelli dei DNS.

dns_domain_name_system.png

Al momento della richiesta per un determinato indirizzo, come ad esempio www.hostingtalk.it, il server DNS del proprio provider in prima istanza controlla nella propria cache se è presente la risoluzione, altrimenti contatta direttamente uno dei Root Server.  I Root Servers sono i server che gestiscono le estensioni .com, .org, .net, .edu, ecc. 

Poiché la richiesta è per un sito con estensione .it, il DNS contatta uno di questi server, e come risposta avrà un’altra serie di DNS Server che gestiscono la particolare estensione .it.

Verrà fatta richiesta quindi ad uno di questi server, che daranno come risposta una lista di server che gestiscono il dominio particolare hostingtalk.it.

All’ultimo passaggio al server che gestisce il dominio hostingtalk.it verrà richiesto di tradurre il “www” in indirizzo IP. A questo punto si ottiene la risposta definitiva. Il server DNS conserverà nella propria cache questa risoluzione, in modo che ad una successiva ed identica richiesta, la risposta sarà più veloce, senza dover necessariamente ripercorrere tutti i passaggi già esposti.

Linux come server DNS con Bind

Linux ben si presta ad essere configurato per assumere il ruolo di server DNS, ed in particolare prendendo in considerazione la distribuzione Ubuntu, il pacchetto da installare con il sempre presente e comodissimo gestore dei pacchetti è bind9. In alternativa da riga di comando è possibile utilizzare apt.

gabriele@gabriele:∼# sudo apt-get update

gabriele@gabriele:∼# sudo apt-get install bind9

I file di configurazione del DNS si trovano nella directory /etc/bind, ed i file principali sono:

  • named.conf
  • named.conf.local
  • named.conf.options
  • db.root

Nel file named.conf la riga include specifica il nome del file che contiene le opzioni DNS. La riga directory nel file di opzioni named.conf.options indica al DNS dove cercare i file. Tutti i file utilizzati da bind sono relativi a questa directory.

Il file /etc/bind/db.root descrive i server di nomi radice presenti nel mondo. I server cambiano nel tempo e conseguenza debbono essere aggiornati di tanto in tanto.

Modi di funzionamento di un DNS server

I server DNS possono essere classificati in due categorie:

  • caching
  • autoritario

Un nameserver caching non contiene file di zona, vale a dire corrispondenze fra indirizzi IP e nomi hosts, ma contiene soltanto i riferimenti ai DNS padre dell’albero e pertanto delega ad essi qualsiasi risoluzione dei nomi, memorizzando nella propria memoria cache i risultati di queste ricerche in modo da velocizzare tutti gli accessi susseguenti al primo.

Un nameserver autoritario contiene le corrispondenze fra indirizzi IP e nomi hosts di tutti i clients della rete che serve, pertanto ha autorità di risoluzione diretta, cioè non deve chiedere ad altri DNS quali sono i nomi o gli indirizzi dei computers. Nella pratica questo si traduce in tre direttive di configurazione nel caso in cui la risoluzione non possa essere portata a termine usando la propria cache:

1. ROOT ONLY: Viene fatta richiesta ai root server il cui indirizzo è noto e da qui si segue il percorso dei DNS fino a trovare l’IP corretto. I root server sono i DNS per le zone come .it, .com, .net e così via. Questi sono noti a priori.

2. FORWARD ONLY: La richiesta viene passata al DNS server del provider impostato; se questo non ha risposta viene restituito un errore.

3. FORWARD FIRST: Prima la richiesta viene passata al DNS del proprio provider, se questo non ha risposta vengono interrogati i root server.

Per poter installare un server DNS autoritario, bind9 deve essere impostato come “forward first” sia perché in genere il DNS del proprio provider  risponde più velocemente degli altri, sia per una questione di ottimizzazione, per generare meno traffico inutile in Internet.

Configurazione di Bind

La prima cosa da fare è modificare il file named.conf.options, che al momento dell’installazione di bind contiene poche righe di configurazione e le altre commentate. In particolare occorre aggiungere nella direttiva options, dopo la clausola directory

forward first;

forwarders {

195.210.91.100; #DNS server per Libero

193.70.192.100;

};

Il blocco forwarders nel file, di default è commentato.

Il secondo passaggio è la modifica del file /etc/resolv.conf che normalmente contiene gli indirizzi dei DNS verso cui sono inoltrate le richieste del sistema. Volendo usare il proprio sistema come server DNS, occorre far si che queste richieste siano inoltrate localmente, per cui nel file è necessario inserire:

nameserver 127.0.0.1

Configurazione di una zona

A questo punto è necessario definire una nuova zona, modificando il file named.conf.local. È necessario aggiungere le righe

zone “example.com” {

        type master;

        file “/etc/bind/db.example.com”;

};

Il file di zona /etc/bind/db.example.com viene creato a partire da uno già esistente, ad esempio db.local, sostituendo localhost con l’indirizzo completo del proprio server, modificando 127.0.0.1 con l’indirizzo IP del server di nomi e root.localhost con un indirizzo email valido, ma con un “.” al posto del simbolo “@”. Importante è lasciare il “.” alla fine.

Ad esempio, considerando come dominio example.com, il file sarà come di seguito:

;

; BIND data file for local loopback interface

;

$TTL    604800

@       IN      SOA     ns.example.com. root.example.com. (

                                  19        ; Serial

                         604800         ; Refresh

                           86400         ; Retry

                       2419200         ; Expire

                         604800 )       ; Negative Cache TTL

;

@       IN      NS      ns.example.com.

@       IN      A       192.168.1.10

ns       IN      A       192.168.1.10

Il numero serial deve essere incrementato ogni volta che si modifica il file di zona.

File zona reverse

Per consentire al DNS di trasformare un indirizzo in un nome, dopo aver configurato la zona e la risoluzione dei nomi con un indirizzo IP, è necessaria anche una zona reverse. È necessario modificare il file /etc/bind/named.conf.local aggiungendo le righe:

zone “1.168.192.in-addr.arpa” {

        type master;

        notify no;

        file “/etc/bind/db.192”;

};

La sigla 1.168.192 rappresenta nell’esempio i primi tre valori dell’indirizzo della rete che si utilizza ed è anche necessario che il file zona /etc/bind/db.192 sia nominato in modo appropriato, rispecchiando il primo ottetto della propria classe di indirizzi.

Il file /etc/bind/db.192 può essere creato come nel paragrafo precedente a partire da uno già esistente, il db.127 per esempio, e poi modificando, cambiando le stesse opzioni di /etc/bind/db.example.com:

;

; BIND reverse data file for local loopback interface

;

$TTL    604800

@       IN      SOA     ns.example.com. root.example.com. (

                              20            ; Serial

                         604800         ; Refresh

                          86400          ; Retry

                        2419200        ; Expire

                         604800 )       ; Negative Cache TTL

;

@       IN      NS      ns.

10      IN      PTR     ns.example.com.

Per ogni voce A che viene configurata nel file /etc/bind/db.example.com, è necessario creare una voce PTR corrispondente nel file /etc/bind/db.192.

La zona reverse è così pronta.

Conclusioni

A questo punto occorre solo riavviare bind per vedere gli effetti della nuova configurazione. Si tratta di una semplice configurazione di un server DNS per velocizzare le risoluzioni degli indirizzi, ma bind consente anche altre soluzioni.

Ma in maniera molto agevole è possibile aggiungere anche un server DNS secondario che diventa necessario per mantenere la disponibilità del dominio nel caso in cui quello primario non fosse più disponibile.

Facci sapere cosa ne pensi!

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *