Il DNS (Domain Name System) è un servizio fondamentale per il funzionamento di internet, utilizzato per la risoluzione di nomi di host (nomi macchina) in indirizzi IP e viceversa. In pratica senza questo protocollo non potrebbe esistere internet come lo conosciamo e utilizziamo oggi.
I siti internet sono messi a disposizione dai server web, generalmente macchine dedicate a questo scopo. La richiesta di una pagina web avviene interrogando una di queste macchine che è identificata da un indirizzo IP numerico e non da un nome (i computer dialogano tra loro attraverso interfacce di rete individuate da una serie di 4 numeri separati da punti secondo regole stabilite dall’IPv4, la versione di protocollo IP attualmente in uso).
Se quindi, ad esempio, digitiamo sulla barra di navigazione del browser www.mrwebmaster.it entrerà necessariamente in gioco un server DNS (nameserver) che, consultando un database di nomi associati a numeri IP, tradurrà l’indirizzo-nome appena digitato nell’indirizzo IP associato alla risorsa sul server web, in questo caso 62.101.68.211, permettendo quindi la visualizzazione della pagina.
Per verificarlo apriamo un terminale di Linux o il prompt dei comandi di Windows con una connessione internet attiva e digitiamo il comando:
nslookup www.mrwebmaster.it
avremo un risultato simile a questo:
C:\>nslookup www.mrwebmaster.it
Server: mivsx303.net.vodafone.it
Address: 83.224.66.134
Risposta da un server non di fiducia:
Nome: www.mrwebmaster.it
Address: 62.101.68.211
dove la prima parte riguarda il collegamento internet che sto utilizzando e la seconda l’associazione nome/indirizzo che a noi interessa.
L’enorme database del DNS è distribuito su un gran numero di server in base al meccanismo di delegazione secondo i livelli dei domini (.it, .com, ecc..sono domini di primo livello; mrwebmaster.it, google.it, ecc..sono domini di secondo livello, ecc…) in modo che se un server non è in grado di rispondere all’interrogazione, sa però qual è il server del livello successivo a cui inviare la richiesta.
Il concetto fondamentale è quello delle zone di autorità, cioè delle parti dello spazio dei nomi di dominio per i quali un singolo nameserver ha una risposta diretta. Questo meccanismo introduce anche una distinzione fra le risposte, che sono dette autoritative o meno, a seconda che provengano direttamente dal nameserver che ha l’autorità per quella richiesta o dalla cache di un qualche altro server.
Quando ci si rivolge a un server DNS (ad esempio quello del provider) questo, per prima cosa, controlla se ha in cache la risposta, nel qual caso risponde immediatamente, altrimenti va a cercare, sempre nella cache, se ha l’indirizzo di uno dei server che gli può rispondere, salendo lungo la gerarchia dei domini. Nel caso in cui non si riesca, la richiesta viene rivolta ai root DNS, che permettono di risolvere i domini di primo livello. La lista degli indirizzi IP di questi server è pubblicata ed aggiornata periodicamente ed ogni server DNS deve sempre essere in grado di contattarli.
Per cercare di capirne il funzionamento, vedremo di seguito un’installazione e configurazione semplificata di un server DNS Bind su una macchina con sistema operativo Linux Ubuntu, mostrando come avviene la traduzione di nomi macchina in indirizzi IP e viceversa. Lasciamo quindi da parte internet e server web per approfondire un esempio minimale. Il caso descritto riguarda appunto un server Ubuntu e due pc client con sistema operativo Windows, supponiamo un portatile e un desktop, in una rete Lan casalinga (o di un piccolo ufficio). Poiché il caso proposto ha scarsa utilità pratica, lo scopo è principalmente didattico e intende svolgere sul lettore una funzione di stimolo per ulteriori approfondimenti.
Generalmente un’ installazione di base di Ubuntu non include il server DNS, cioè il pacchetto bind9 con le sue dipendenze. Procediamo quindi con l’installazione:
sudo apt-get install bind9
Una volta installato, Bind riunisce tutti i suoi file di configurazione nella directory /etc/bind. In questa caso il file di configurazione principale è /etc/bind/named.conf.local, all’interno del quale verrà definita la zona di autorità di competenza del server DNS appena installato.
Editiamo quindi il file:
sudo nano /etc/bind/named.conf.local
Nel file, che risulta vuoto a parte qualche riga di commento, inseriamo il seguente codice:
zone "dns.casa" {
type master;
file "/etc/bind/db.dns";
};
zone "205.168.192.in-addr.arpa" {
type master;
file "/etc/bind/db.192.168.205";
};
Ora analizziamolo nel dettaglio. La definizione della zona di competenza è divisa in due parti:
- la prima ("dns.casa") definisce l’associazione nome macchina-indirizzo IP, nomina il dominio, mostra che stiamo configurando unicamente un server DNS primario (type master) e indica il file (/etc/bind/db.dns) che creiamo tra poco e che conterrà appunto le associazioni nomi macchina-indirizzi IP;
- la seconda ("205.168.192.in-addr.arpa"), all’inverso, definisce l’associazione indirizzo IP-nome macchina, presuppone una rete locale con indirizzi IP di classe C 192.168.205.0/24, nomina il dominio inverso (il suffisso "in-addr.arpa" è obbligatorio), mostra che stiamo configurando unicamente un server DNS primario (type master) e indica il file (/etc/bind/db.192.168.205) che creiamo e che conterrà appunto le associazioni indirizzi IP-nomi macchina.
Creiamo il file /etc/bind/db.dns copiandolo da /etc/bind/db.empty:
sudo cp /etc/bind/db.empty /etc/bind/db.dns
Editiamo il nuovo file:
sudo nano /etc/bind/db.dns
Modifichiamolo come segue:
supponendo che il nome macchina del nostro server sia "linux", sostituiamo "localhost." con "linux.dns.casa." e "root.localhost." con "francesco.linux.dns.casa." facendo attenzione a non togliere il punto finale, dove "francesco" è un utente presente sul server. Poi aggiungiamo alcune direttive simili a queste:
linux IN A 192.168.205.1
NS IN CNAME linux
portatile IN A 192.168.205.10
desktop IN A 192.168.205.20
Dove "IN" sta a significare che si tratta di dati internet; "A", la corrispondenza nome-indirizzo IP; "NS", il nameserver per la zona; "CNAME", un nome alternativo; "portatile", il nome macchina del pc portatile; "desktop", il nome macchina del pc desktop.
Il risultato finale del file sarà qualcosa del genere:
; BIND reverse data file for empty rfc1918 zone
;
; DO NOT EDIT THIS FILE - it is used for multiple zones.
; Instead, copy it, edit named.conf, and use that copy.
;
$TTL 86400
@ IN SOA linux.dns.casa. francesco.linux.dns.casa. (
1 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
86400 ) ; Negative Cache TTL
;
@ IN NS <a href="/reti/ip-127-0-0-1-cose-serve_12780.html">localhost</a>.
linux IN A 192.168.205.1
NS IN CNAME linux
portatile IN A 192.168.205.10
desktop IN A 192.168.205.20
Dove "$TTL 86400" indica il Time-To-Live, cioè quanto tempo il server attende prima di effettuare un refresh del record (in questo caso 86400 secondi, cioè un giorno); "SOA", l’inizio della zona di autorità; i campi chiusi tra le parentesi sono principalmente per i server slave, quindi per il nostro esercizio possiamo tralasciarli.
Ora creiamo il file /etc/bind/db.192.168.205 nel modo simile al precedente:
sudo cp /etc/bind/db.empty /etc/bind/db.192.168.205
Editiamolo:
sudo nano /etc/bind/db.192.168.205
E modifichiamolo:
sostituiamo "localhost." e "root.localhost." come nel file precedente; aggiungiamo le seguenti direttive:
1 IN PTR linux.dns.casa
10 IN PTR portatile.dns.casa
20 IN PTR desktop.dns.casa
Dove "PTR" è la corrispondenza indirizzo IP-nome.
Questo il risultato finale:
; BIND reverse data file for empty rfc1918 zone
;
; DO NOT EDIT THIS FILE - it is used for multiple zones.
; Instead, copy it, edit named.conf, and use that copy.
;
$TTL 86400
@ IN SOA linux.dns.casa. francesco.linux.dns.casa. (
1 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
86400 ) ; Negative Cache TTL
;
@ IN NS localhost.
1 IN PTR linux.dns.casa
10 IN PTR portatile.dns.casa
20 IN PTR desktop.dns.casa
Editiamo il file /etc/resolv.conf per rendere disponibile il server ed inseriamo:
search dns.casa
nameserver 192.168.205.1
Riavviamo il servizio bind9:
sudo /etc/init.d/bind9 restart
Abbiamo infine creato un server autoritativo per la nostra zona di competenza. Perchè la risoluzione dei nomi funzioni, indichiamo nelle proprietà della scheda di rete dei pc client il nostro server DNS, 192.168.205.1. Fatto!