back to top

Server DNS per una rete locale con Bind

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:

  1. 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;
  2. 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!

Altri contenuti interessanti

Pubblicitร 

Leggi anche...

Linux: recuperare una partizione con GNU Parted o Gpart

A volte, nell'uso quotidiano del computer, possono capitare dei...

Differenze tra su e sudo in Linux

su e sudo, vengono considerati a torto due comandi...

Creare una lista dei programmi installati su Ubuntu (per effettuarne il ripristino)

In questo breve post vedremo come visualizzare tutto il...

Come svuotare la memoria Cache in Linux?

La memoria cache è stata creata perché, anche quando...

Installare un’interfaccia grafica su Ubuntu Server

Indipendentemente dalla versione di riferimento, il ramo principale della...

Creiamo un file server con Samba

La finalità di una rete locale di computer (LAN)...
Pubblicitร