DNS e DHCP facili ed efficienti con Dnsmasq
by admin on Sep.26, 2011, under Linux, Networking
Per gestire i nomi in una rete domestica di solito è sufficiente configurare manualmente il file /etc/hosts sulle varie macchine. Questo va bene in una rete con 3 o 4 host, ma quando fra server e postazioni fisse, laptop e smartphones, la rete inizia a superare la decina unità, la modifica del file dei nomi su ogni singolo host diventerebbe già decisamente impraticabile. La soluzione classica per fornire la risoluzione dei nomi e la configurazione automatica dei parametri di rete consiste nell’uso abbinato di due storici programmi/protocolli: BIND e DHCP, entrambi infatti reperibili all’indirizzo www.isc.org.
BIND è un server DNS completo. Questa caratteristica, tuttavia, comporta una configurazione complessa, basata prevalentemente su file di testo decisamente criptici (almeno per un neofita) relativi alla definizione delle diverse zone (hostnames, domini o sezioni di domini) ed una altrettanto complessa configurazione di base.
DHCP, invece, è un sistema client/server che si occupa della configurazione automatica dei parametri di rete delle varie postazioni collegate alla stessa quando queste la richiedono. Il server DHCP accoglie la richiesta e, in base al MAC address del client, agli IP disponibili e alla propria configurazione, fornisce loro i parametri di rete necessari per utilizzare la rete locale e Internet, parametri che in genere sono: l’IP locale, la netmask, l’indirizzo del gateway di rete e quello dei server DNS. L’IP locale può anche essere univocamente associato ad un MAC address. In questo modo l’utente (la macchina) avrà sempre lo stesso indirizzo al posto di uno scelto tra quelli disponibili. Inoltre, il server DHCP può essere configurato per comunicare a BIND l’hostname e l’indirizzo delle macchine a cui ha fornito i parametri di connessione in modo da aggiornare automaticamente il file di zona relativo alla rete locale. Tuttavia, ripeto, la configurazione di un tale sistema non è banale e si rivela spesso inopportuna per reti casalinghe o anche aziendali di piccole dimensioni.
Una valida alternativa al binomio BIND e DHCP, per rendere più semplice e coerente l’accesso sia alla LAN che a Internet in un contesto del genere, è però costituita dal software dnsmasq, che permette di ottenere gli stessi risultati con una complessità di configurazione e gestione decisamente minore.
Anziché usare i file di zona, decisamente complessi da creare e aggiornare, Dnsmasq fa uso del solo file di sistema “/etc/hosts” presente nella macchina su cui gira il servizio.
L’installazione su sistemi Debian e Debian-like, come Ubuntu, è semplicissima:
# sudo apt-get install dnsmasq-base
# sudo apt-get install dnsmasq
Il primo package contiene l’eseguibile dnsmasq (e la relativa documentazione), mentre il secondo l’ infrastruttura necessaria perché possa venire eseguito come system daemon.
La configurazione di default è già funzionale: imposta un server DNS che, per prima cosa, tenta di risolvere i nomi esaminando il proprio file /etc/hosts, e se così non fosse possibile, inoltra la richiesta ai server elencati in /etc/resolv.conf. Così è sufficiente mantenere aggiornato l’elenco degli host della propria rete locale solo sulla macchina server su cui è installato dnsmasq.
Per fare una semplice verifica:
# dig ubuntu.com @localhost
; <<>> DiG 9.7.1-P2 <<>> ubuntu.com @localhost
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 10350
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;ubuntu.com. IN A
;; ANSWER SECTION:
ubuntu.com. 202 IN A 91.189.94.156
;; Query time: 29 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Sep 25 23:12:06 2011
;; MSG SIZE rcvd: 44
Per configurare dnsmasq ad agire come cache per l’ host sul quale è in esecuzione basta che la lista dei nameservers in /etc/resolv.conf contenga la linea
nameserver 127.0.0.1
come prima linea.
Di conseguenza, impartendo una seconda volta il comando precedente il Query time si riduce a 0 msec, a testimonianza che la cache DNS conteneva già la risposta.
L’ideale sarebbe disporre di un resolver così strutturato:
nameserver 127.0.0.1
nameserver 208.67.222.222
nameserver 208.67.220.220
nel quale, oltre al nameserver locale, vengono utilizzati i server unicast di OpenDNS, consigliati per la loro velocità, per l’efficienza dei filtri e perché capaci di aggirare le restrizioni sui DNS operate da provider presenti in Italia, Cina e altri paesi non esattamente paladini delle libertà civili.
Desiderando inoltre che il DNS server risolva i nomi locali, basta semplicemente aggiungerli al file /etc/hosts:
# echo 192.168.1.3 blackstar >>/etc/hosts
e riavviare il servizio:
# /etc/init.d/dnsmasq restart [ OK ]
* Restarting DNS forwarder and DHCP server dnsmasq
quindi:
# nslookup blackstar localhost
Server: localhost
Address: 127.0.0.1#53
Name: blackstar
Address: 192.168.1.3
Nel file degli host è possibile tuttavia elencare solamente postazioni con ip statico. Per tutti quei dispositivi (laptop, smartphone, ecc.) cui è preferibile assegnare l’indirizzo dinamicamente, dnsmasq mette a disposizione il server DHCP integrato: in tal modo, quando un dispositivo ottiene l’ip, dnsmasq lo aggiunge all’elenco degli host noti di cui è in grado di risolvere il nome. Per attivare il DHCP (che per default è disattivato), facendo contemporaneamente attenzione a disattivare qualsiasi altro servizio analogo eventualmente presente sulla LAN, per evitare conflitti, basta aggiungere un paio di righe al file di configurazione /etc/dnsmasq.conf, ad esempio:
dhcp-range=192.168.1.50,192.168.1.150,12h
dhcp-option=option:router,192.168.1.1
La prima definisce il range degli indirizzi assegnabili, con un “lease time” di 12 ore; la seconda indica l’indirizzo del gateway di default. Come server DNS viene assegnato automaticamente quello sui cui gira dnsmasq.
Il modo più semplice di effettuare la risoluzione dei nomi negli indirizzi assegnati dinamicamente dal DHCP server in Dnsmasq consiste nell’impostare correttamente gli hostnames in ciascun host della LAN.
Ad esempio, nella maggior parte dei sistemi Linux, basta editare /etc/hostname, che imposta appunto l’ hostname.
Per i dispositivi mobili il discorso si fa più complesso.
Per fare un esempio pratico entrambi gli smartphone android che possediamo in famiglia presentano lo stesso hostname, tra l’altro decisamente poco memorizzabile:
android_9774d56d682e549c
ma ciascuno, ovviamente un MAC diverso, e nella fattispecie 5C:DA:D4:7F:C0:5A il mio personale, e 5C:DA:D4:42:AD:EB quello della mia compagna.
E’ certamente possibile modificare all’origine l’hostname dopo aver avviato lo smartphone in recovery mode, oppure tramite l’Android SDK, ma si può anche intraprendere una strada alternativa, anche per evitare discussioni e patemi d’animo al proprietario dell’apparecchio.
Si può infatti impostare una nuova riga in /etc/dnsmasq.conf contenente:
dhcp-host=5C:DA:D4:7F:C0:5A,smartphone1
e una volta riavviato il servizio dnsmasq ottenere, come desiderato, la corretta risoluzione del nome appena assegnato:
# cat /var/lib/miscdnsmasq.leases
1317075600 5c:da:d4:7f:c0:5a 192.168.1.88 smartphone1 *
# nslookup smartphone1
Server: 127.0.0.1
Address: 127.0.0.1#53
Name: smartphone1
Address: 192.168.1.88

