Server DNS con Raspberry Pi e Dnsmasq

In questo articolo vedremo come installare un servizio DNS (Domain Name System) nel nostro server domestico su Raspberry Pi con Raspbian.
Anche se l’installazione è pensata per una scheda Raspberry Pi, le informazioni sono di carattere abbastanza generale e quindi utilizzabili anche per altre piattaforme.

Prima di installare un server DNS, è bene capire cosa sia questo importantissimo ma spesso sottovalutato servizio.

Un servizio DNS potrebbe essere definito come il legame tra il nome di un dominio e l’effettivo indirizzo IP a cui il dominio fa capo.
Per spiegare il tutto con un esempio, quando ci si collega ad un sito come www.google.com, in realtà, dietro le quinte, il nostro PC traduce, o meglio, si fa tradurre da un server DNS il nome www.google.it in un indirizzo IP valido, ad esempio 216.58.205.99
La cosa è ben intuibile se facciamo un semplice ping ad un qualsiasi dominio esistente

C:\>ping www.iotnotes.net -c 1

PING www.iotnotes.net (217.64.195.223) 56(84) bytes of data.
64 bytes from w-03.th.seeweb.it (217.64.195.223): icmp_seq=1 ttl=53 time=25.9 ms

--- www.iotnotes.net ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 25.996/25.996/25.996/0.000 ms

Analizzando i pacchetti inviati in rete dopo tale comando

Dnsmasq DNS server - Analisi pacchetti pingsi vede chiaramente come, prima di inviare il ping, venga inviata una richiesta DNS alla quale segue una risposta dal server locale contenente l’indirizzo IP corrispondente al dominio www.iotnotes.net.

L’usare un nome per identificare un server, un PC o un dispositivo ha fondamentalmente due vantaggi.

  1. Il nome solitamente è mnemonico, quindi è più facile da ricordare che non una quadrupla di byte.
  2. Il nome è riassegnabile ad un altro indirizzo IP, quindi se ad esempio un server è spostato in un’altra sede con un diverso indirizzo IP, basterà riassegnare al nome di dominio il nuovo IP, rendendo così il tutto trasparente all’utente finale.

Un DNS è un server che, su richiesta, traduce il nome di un host o di un dominio nel suo corrispondente indirizzo IP.

Se l’utilità dei server DNS è indiscutibile a livello di rete Internet, i vantaggi che un servizio come questo può portare nell’ambito di una rete LAN, soprattutto se domestica, sono spesso sottovalutati sia in termini di migliore gestione della rete ma anche in termini di aumento della sicurezza.

Tornando alla nostra installazione, in ambiente Linux Debian, un server DNS può essere perfettamente gestito con Dnsmasq.

Prima di installare Dnsmasq è necessario che il nostro server abbia un indirizzo IP statico, e per fare questo si può seguire la guida in questo precedente articolo.

Come per ogni installazione è sempre consigliabile prima aggiornare i repository con il comando

$ sudo apt-get update

Poi, per l’installazione, è sufficiente usare questo comando

$ sudo apt-get install dnsmasq

Una volta terminata l’installazione, il server DNS dovrebbe già essere attivo in locale.
Per verificarlo si può vedere se il servizio è attivo digitando

$ systemctl status dnsmasq.service

dnsmasq.service - dnsmasq - A lightweight DHCP and caching DNS server
   Loaded: loaded (/lib/systemd/system/dnsmasq.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2018-12-13 04:00:10 CET; 7h ago
  Process: 22982 ExecStop=/etc/init.d/dnsmasq systemd-stop-resolvconf (code=exited, status=0/SUCCESS)
  Process: 23039 ExecStartPost=/etc/init.d/dnsmasq systemd-start-resolvconf (code=exited, status=0/SUCCESS)
  Process: 23033 ExecStart=/etc/init.d/dnsmasq systemd-exec (code=exited, status=0/SUCCESS)
  Process: 23029 ExecStartPre=/usr/sbin/dnsmasq --test (code=exited, status=0/SUCCESS)
 Main PID: 23038 (dnsmasq)
      CPU: 7min 58.922s
   CGroup: /system.slice/dnsmasq.service
           └─23038 /usr/sbin/dnsmasq -x /run/dnsmasq/dnsmasq.pid -u dnsmasq -r /run/dnsmasq/resolv.conf -7 /etc/dnsmasq.d,.dpkg-dist,.dpkg-old,.dpkg-new --local-service

oppure con il comando

$ nslookup www.google.it

Server: 127.0.0.1
Address: 127.0.0.1#53 

Non-authoritative answer: 
Name: www.google.it 
Address: 216.58.205.99

Se nella risposta che otteniamo è indicato l’indirizzo 127.0.0.1 del localhost vuol dire che tutto funziona, per adesso almeno in locale.

Una volta verificata l’installazione è necessario procedere alla prima configurazione, editando il file /etc/dnsmasq.conf.
E’ buona norma effettuare prima un backup del vecchio file di configurazione, quindi

$ sudo cp /etc/dnsmasq.conf ~/dnsmask.bak.conf
$ sudo nano /etc/dnsmasq.conf

Se non si vuole editare le singole righe del file già presente, si può cancellare tutto e copiare il file qui sotto

#interface=eth0
#port=53

# Impostazioni di sicurezza
domain-needed
bogus-priv

# Esclusione del file /etc/resolv.conf
# e indicazione dei server di upstream esterni
no-resolv
no-pool

server=8.8.8.8
server=8.8.4.4

# Dominio che il DNS deve interpretare come locale
local=/local.lan/

# Reindirizzamenti
address=/double-click.net/127.0.0.1
address=/mioservizio.miodominio.lan/192.168.0.x

# Esclusione del file /etc/hosts
# Configurazione manuale degli hosts
no-hosts
addn-hosts=/etc/dnsmasq_static_hosts.conf

# Altre configurazioni
conf-dir=/etc/dnsmasq.d

Una volta salvato è necessario far ripartire il servizio con le nuove configurazioni

$ systemctl restart dnsmasq.service

Questo è un punto di partenza, però, visto che configurare le cose senza capire cosa si sta facendo non è il massimo, descriverò di seguito il significato delle varie righe

interface
Indica al server DNS su quale interfaccia di rete ascoltare le richieste DNS. Se non indicato ascolta su tutte.

port
Indica la porta da utilizzare per le richieste  DNS. La porta di default per questo servizio è la 53 e, se non ci sono esigenze particolari, è bene non cambiarla.

domain-needed
Questa direttiva fa in modo che richieste DNS su nomi host senza none di dominio non vengano indirizzati ai server di upstream (cioè i DNS esterni).
Se attiviamo questa direttiva, provando ad esempio il comando

$ nslookup google

darà un errore di host non raggiungibile, mentre

$ nslookup google.com

risolverà normalmente il nome.
Ammettiamo di avere un host interno che si chiama Telecamera01. Se, sbagliando, si tentasse di raggiungerlo indicando il nome Telecamera1, Dnsmasq, non riconoscendolo, inoltrerebbe la richiesta ad un DNS esterno, esponendo così il nome del nostro dispositivo interno (anche se leggermente errato) all’esterno e quindi ad un possibile rischio.

bogus-priv
Questo indica a Dnsmasq di non inoltrare a server esterni richieste DNS su indirizzi privati

no-resolv
Con questa direttiva si esclude la lettura del file /etc/resolv.conf, che solitamente contiene gli indirizzi dei server DNS esterni. Se si inserisce questa direttiva sarà necessario inserirli con la direttiva server.

no-pool
Indica a dnsmasq di non effettuare il pooling del file /etc/resolv.conf per verificare se ha subito cambiamenti.

server
Con questa direttiva si indicano i server DNS esterni

local
Indica a dnsmasq quali sono i nomi di dominio da considerare locali, quindi da non instradare a server di upstream esterni

address
Associa un nome di dominio ad un particolare indirizzo IP.
L’utilità di questa direttiva è duplice.

  • Possiamo definire nomi di dominio apparentemente esterni che in realtà però sono locali
  • Per sicurezza o privacy possiamo reindirizzare richieste a siti particolari (tipo double-click.net)


no-hosts

Esclude il file /etc/hosts.

addn-hosts
Indica a dnsmasq un file aggiuntivo contenente una lista di nomi host con il corrispondente indirizzo IP. Questo torna utile se si vogliono gestire, con un proprio file, quei dispositivi che hanno un loro indirizzo statico (se ne capirà l’utlità quando parleremo dell’installazione di un server DHCP).
Creando un file esterno (nel file di configurazione sopra /etc/dnsmasq_static_hosts.conf) con le seguenti righe, avremo la possibilità di accedere al nostro server DNS con mydns.local.lan o il router con gateway.local.lan, ecc.

127.0.0.1     mydns
192.168.1.2   mydns
192.168.1.1   gateway
192.168.1.50  sonoff01

conf-dir
Indica una directory dove tutti i file al suo interno sono da considerare file di configurazione.

Per adesso il nostro server DNS funziona solo in locale, cioè solo per richieste che arrivano dal nostro stesso server. Per renderlo disponibile a tutta la rete ci sono due strade.

  1. Sulle impostazioni manuali di ogni PC/dispositivo si indica il server DNS con l’indirizzo del server dove abbiamo installato Dnsmasq.
  2. Se si utilizza un server DHCP (ad esempio quello disponibile nel router), bisognerà impostare che nel rilascio dell’indirizzo, il server DNS sia impostato con l’IP del server dove abbiamo installato Dnsmasq.

Se non avete un server DHCP o le impostazioni di quello del router sono limitative, sappiate che Dnsmasq, oltre a fornire un servizio DNS può diventare anche un potente server DHCP, dandoci la possibilità di gestire in modo efficiente gli indirizzi di rete e la gestione dei nomi host e dominio.
Il prossimo articolo dedicato alla costruzione del nostro piccolo server domestico parlerà proprio di questo.

Tips

Per verificare lo stato del server

$ systemctl status dnsmasq.service

Per fermare il servizio

$ systemctl stop dnsmasq.service

Per far partire il server

$ systemctl start dnsmasq.service

Per farlo ripartire, quindi da utilizzare ogni volta che si apportano modifiche al file di configurazione

$ systemctl restart dnsmasq.service

Link utili

Advanced Dnsmasq Tips and Tricks | Linux.com | The source for Linux information
Dnsmasq – ArchWiki
Wikipedia – DNS (Domain Name System)

Permanent link to this article: https://www.iotnotes.net/2018/12/13/server-dns-con-raspberry-pi-e-dnsmasq/