Muntar un servidor DNS intern amb dnsmasq
A moltes xarxes internes, especialment en entorns mixtos o improvisats —laboratoris, oficines petites, infraestructures de testing o desplegaments ràpids— tenir un servidor DNS intern estable i predictible marca una diferència clara en el flux de treball diari.
No sempre necessites un BIND ni una solució pesada. A la pràctica, quan no busques zones complexes, sinó un DNS caché local, resolució de noms per a màquines internes i, en alguns casos, control de DHCP, dnsmasq pot ser una eina més que raonable.
Per què dnsmasq?
Perquè és petit, ràpid de configurar, estable i fa bé la seva feina: resoldre noms locals, cachejar peticions externes, i (si ho necessites) assignar adreces IP per DHCP. És comú a routers domèstics i dispositius embeguts, però també molt útil en servidors de propòsit general quan no vols complicar-te més del necessari.
A més, a diferència de systemd-resolved o NetworkManager, dnsmasq et dona control directe sense sorpreses ocultes. I això, quan necessites que alguna cosa simplement funcioni i puguis depurar fàcilment, és clau.
Instal·lació i primer diagnòstic
A qualsevol distribució basada en Debian o Ubuntu:
sudo apt update
sudo apt install dnsmasq
A sistemes basats en Red Hat o derivats:
sudo dnf install dnsmasq
Un cop instal·lat, verifica si el servei està corrent:
systemctl status dnsmasq
Important: algunes distros modernes ja porten dnsmasq en mode lightweight integrat a NetworkManager. Si no t’interessa això i vols tenir control complet, assegura’t de no tenir conflictes. Desactiva qualsevol instància gestionada automàticament:
sudo systemctl stop NetworkManager
sudo systemctl disable NetworkManager
O bé, en comptes de desactivar-lo completament, assegura’t que no gestiona dnsmasq
Configuració: arxiu principal i estructura recomanada
L’ arxiu principal és a:
/etc/dnsmasq.conf
Però per no complicar aquest arxiu global, pots fer servir un enfocament modular. dnsmasq inclou qualsevol arxiu que posis a:
/etc/dnsmasq.d/
Això et permet mantenir una configuració base neta i després afegir definicions específiques per servei, per client, per zona, etc.
La meva recomanació: deixa el dnsmasq.conf gairebé buit, amb això com a base:
conf-dir=/etc/dnsmasq.d
I les teves configuracions reals en arxius separats, com local.conf, dhcp.conf, forwarding.conf, etc.
Configurar DNS intern bàsic amb resolució de noms locals
Imagina que tens diverses màquines en una xarxa interna (per exemple: server1.local.lan, dev1.local.lan, etc.). No estan en cap domini extern ni vols gestionar-les amb zones DNS completes.
Creem un arxiu /etc/dnsmasq.d/local.conf:
domain=local.lan
local=/local.lan/
# Adreça del servidor
listen-address=127.0.0.1,192.168.100.1
# Entrades estàtiques
host-record=server1.local.lan,192.168.100.10
host-record=dev1.local.lan,192.168.100.20
Notes clau:
- domain = local.lan defineix el domini per defecte que es farà servir per a noms incomplets.
- local =/local.lan/ indica que dnsmasq ha de resoldre aquest domini de manera local, no reenviar-lo.
- listen-address evita que dnsmasq escolti a totes les interfícies. És millor especificar les que has de fer servir.
- host-record actua com una entrada a /etc/hosts, però al servidor.
Integrar resolucions externes (reenviador)
Si vols que dnsmasq actuï també com a caché DNS per a dominis externs (per exemple, google.com), necessites definir servidors upstream.
Arxiu: /etc/dnsmasq.d/upstream.conf
# Reenviadors externs
server=1.1.1.1
server=8.8.8.8
# No reenviar dominis locals a aquests servidors
domain-needed
bogus-priv
Per qué fer servir domain-needed i bogus-priv?
- domain-needed impedeix que dnsmasq reenviï peticions sense punt (per exemple, localhost), la qual cosa evita tràfic innecessari i possibles fuites de noms interns.
- bogus-priv bloqueja respostes a adreces IP privades (com 192.168.0.0/16) des de servidors públics, la qual cosa ajuda a detectar configuracions externes sospitoses.
Servir com a DHCP i anunciar noms
Si també necessites que dnsmasq actuï com a servidor DHCP, pots fer servir:
Arxiu: /etc/dnsmasq.d/dhcp.conf
# Rang d'IPs que dnsmasq assignarà per DHCP
dhcp-range=192.168.100.50,192.168.100.150,12h
# Assignacions fixes
dhcp-host=AA:BB:CC:DD:EE:01,server1,192.168.100.10
dhcp-host=AA:BB:CC:DD:EE:02,dev1,192.168.100.20
# Anunciar nom de host
expand-hosts
domain=local.lan
Punts rellevants:
- expand-hosts permet que els noms definits per DHCP s’associïn al domini declarat (.local.lan).
- Pots combinar això amb els host-record, tot i que no és necessari si fas servir dhcp-host.
- Si defineixes una MAC coneguda, pots assignar IPs fixes fàcilment. Evita conflictes.
Evitar conflictes amb altres serveis o eines
Una causa habitual de fallades és que altres serveis estiguin fent servir el port 53. Fes servir ss per a comprovar-ho:
sudo ss -lnptu | grep :53
Si veus que systemd-resolved o named estan en aquest port, tindràs problemes. Solució típica per a systemd-resolved:
sudo systemctl disable --now systemd-resolved
sudo rm /etc/resolv.conf
sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
Però si prefereixes fer servir dnsmasq completament, crea un resolv.conf apuntant al teu servidor local:
echo "nameserver 127.0.0.1" | sudo tee /etc/resolv.conf
Diagnóstic: comprovar que està funcionant
- Verifica que dnsmasq està corrent i escoltant:
sudo systemctl status dnsmasq
sudo ss -ltnpu | grep :53
- Consulta local:
dig @127.0.0.1 server1.local.lan
- Revisar logs de resolució:
Pots activar logs detallats en /etc/dnsmasq.d/logging.conf:
log-queries
log-facility=/var/log/dnsmasq.log
I després veure què es resol:
tail -f /var/log/dnsmasq.log
Casos especials i ajustos útils
DNS Split-Horizon
Pots definir regles per domini:
server=/internal.lan/192.168.100.1
server=/example.com/1.1.1.1
Això permet que dnsmasq reenviï només algunes zones a certs servidors.
TTL baix per a proves
min-cache-ttl=10
Molt útil quan estàs fent proves amb canvis freqüents de DNS.
Resoldre hosts definits en /etc/hosts
Per defecte, dnsmasq també llegeix /etc/hosts, però pots desactivar-lo si prefereixes control total:
no-hosts
Checklist per a instal·lació i configuració bàsica
Xarxa interna amb resolució de noms i cache DNS:
- Instalar dnsmasq.
- Desactivar serveis que facin servir el port 53 si no els necessites.
- Configurar arxius a /etc/dnsmasq.d/.
- Definir host-record o dhcp-host per a les màquines internes.
- Establir domain, local, i expand-hosts.
- Definir server= per a DNS externs (1.1.1.1, etc).
- Verificar que dnsmasq està corrent i resolent.
- Apuntar /etc/resolv.conf al servidor local (127.0.0.1).
- (Opcional) Activar logs i revisar.
En un entorn de xarxa interna, la diferència entre tenir noms que resolen sempre i estar copiant IPs a mà és clara. Amb dnsmasq, pots muntar una cosa funcional en menys d’una hora, mantenir-lo fàcilment i estendre’l quan faci falta.