dnsmasq: DNS local + DHCP en tu homelab Linux 2026
Si en tu red tienes más de tres dispositivos y quieres resolverlos por nombre en vez de por IP, dnsmasq te resuelve DNS y DHCP en menos de 10 minutos. Es el sirviente olvidado del homelab.
TL;DR — Lo que vas a tener al final
- Tiempo de setup: 4-6 horas para setup completo.
- Requisitos: CPU con VT-x, 16+ GB RAM, 64+ GB SSD.
- Resultado: Homelab con VMs/LXC, backups PBS, monitoring integrado.
- Troubleshooting: Logs de Proxmox, snapshots, restore drills mensuales.
Por qué dnsmasq y no BIND o Pi-hole
Para un homelab necesitas resolver tres cosas: 1. Resolver nombres locales (tu-nas, tu-impresora, tu-vps) sin tocar /etc/hosts de cada máquina 2. Asignar IPs automáticamente vía DHCP 3. (Opcional) Bloquear dominios de ads y trackers
dnsmasq hace las tres cosas en un solo binario de 200 KB, con config de 30 líneas. BIND es un servidor DNS completo, overkill para esto. Pi-hole está bien pero mete una dependencia web grande si solo quieres el bloqueo. dnsmasq + una lista de bloqueo en texto plano es más liviano y entendible.
La contra: dnsmasq no escala a miles de consultas por segundo. Para eso están Unbound o BIND. Pero para tu red hogareña con 30 dispositivos, sobra.
Índice
- Instalar dnsmasq
- Configuración base
- DHCP con leases estáticos
- Bloqueo de ads y cache
- Troubleshooting común
1. Instalar dnsmasq
Antes de instalar, verifica que ningún otro servicio esté usando los puertos 53 (DNS) ni 67 (DHCP). El error clásico es instalar dnsmasq cuando systemd-resolved ya está escuchando en 53, y entonces dnsmasq no arranca.
# Ver qué está escuchando en 53
sudo ss -ulnp | grep ':53 '
# Ver qué está escuchando en 67 (DHCP)
sudo ss -ulnp | grep ':67 '
# Instalar dnsmasq
sudo apt install -y dnsmasq # Debian/Ubuntu
sudo dnf install -y dnsmasq # Fedora/RHEL
Si systemd-resolved ya está escuchando: hay dos caminos. El más limpio es desactivar systemd-resolved (sudo systemctl disable --now systemd-resolved) y usar dnsmasq como único resolver. El otro es configurar systemd-resolved para que delegue a dnsmasq vía 127.0.0.1#5353 y dejar ambos corriendo. Para un homelab, lo más simple es lo primero.
2. Configuración base
Archivo principal y deshabilitar defaults de distro
El archivo de config está en /etc/dnsmasq.conf. Por defecto tiene 70+ líneas comentadas que son docs. Conviene hacer un backup, vaciar el archivo, y armar la config desde cero para entender cada flag.
# Backup del default
sudo cp /etc/dnsmasq.conf /etc/dnsmasq.conf.default
# Empezar de cero
sudo nano /etc/dnsmasq.conf
Pegá esta config mínima y funcional. Cada flag está comentada para que sepas qué hace.
# /etc/dnsmasq.conf - Configuración mínima homelab
# No leer /etc/resolv.conf del sistema, usar upstream explícitos
no-resolv
# Upstream DNS (Cloudflare + Google como fallback)
server=1.1.1.1
server=8.8.8.8
# Cache tamaño medio
cache-size=1000
# Escuchar solo en LAN (NO en 0.0.0.0)
listen-address=127.0.0.1
listen-address=192.168.1.10
# Dominio local
domain=homelab.local
# Expandir /etc/hosts para que los nombres locales funcionen
expand-hosts
# Logging para debug
log-queries
log-facility=/var/log/dnsmasq.log
Después de guardar, validá la sintaxis antes de reiniciar. Un error de tipeo en el archivo de config hace que dnsmasq no arranque, y el mensaje de error en systemd no siempre apunta a la línea exacta.
# Validar sintaxis
dnsmasq --test
# Si dice "OK", arrancar el servicio
sudo systemctl enable --now dnsmasq
Si dnsmasq --test dice “syntax check OK” pero el servicio no arranca: revisa que el puerto 53 no esté ocupado. sudo journalctl -u dnsmasq -n 50 te muestra el error específico. Si ves “address already in use”, matá el proceso que está en 53 (sudo fuser -k 53/udp) y volvé a intentar.
3. DHCP con leases estáticos
Rango DHCP básico
Sin DHCP server, cada dispositivo en tu LAN necesita IP fija manual. dnsmasq puede asignar IPs automáticamente en un rango y dejar las “importantes” para asignación estática.
# Agregar al final de /etc/dnsmasq.conf
# Rango DHCP (desde .100 a .200) y tiempo de lease (12h)
dhcp-range=192.168.1.100,192.168.1.200,12h
# Gateway y DNS que se anuncian a los clientes
dhcp-option=3,192.168.1.1 # router
dhcp-option=6,192.168.1.10 # nosotros (somos DNS)
# Dominio que se anexa a nombres de host
dhcp-option=15,homelab.local
Después de guardar y reiniciar, los dispositivos nuevos que se conecten a la red van a recibir IPs del rango automáticamente. El gateway (option 3) les dice hacia dónde mandar el tráfico de salida; el DNS (option 6) les dice dónde resolver nombres.
Si los clientes no reciben lease: casi siempre es porque otro DHCP server está corriendo en la red (tu router hogareño probablemente tenga uno). Apagá el del router o desactivá DHCP en el router completamente. Para ver quién está dando DHCP: sudo tcpdump -i eth0 -n port 67 -c 20.
Leases estáticos por MAC
Para servidores, NAS, impresoras y otros dispositivos que quieres que siempre tengan la misma IP, agregás entradas por MAC address. Es el equivalente a una reserva DHCP en un router.
# Formato: dhcp-host=MAC,IP,hostname
dhcp-host=00:11:22:33:44:55,192.168.1.50,nas
dhcp-host=AA:BB:CC:DD:EE:FF,192.168.1.51,impresora
dhcp-host=11:22:33:44:55:66,192.168.1.52,homeassistant
Para encontrar la MAC address de un dispositivo en tu red ya conectada: ip neigh show o arp -an. Las MACs en Linux vienen del comando ip link show.
Si después de configurar el lease estático el dispositivo sigue con la IP vieja: el cliente tiene un lease activo con la IP anterior. espera a que expire (12h en mi config) o reiniciá el cliente. También puedes forzar la renovación: sudo dhclient -r && sudo dhclient.
4. Bloqueo de ads y cache
Bloqueo básico de dominios
dnsmasq puede devolver 0.0.0.0 para dominios en una lista. Eso evita que el cliente llegue al sitio (porque la resolución falla). Es la misma técnica que usa Pi-hole internamente.
# Crear directorio para listas
sudo mkdir -p /etc/dnsmasq.d
# Descargar lista de dominios a bloquear (ejemplo: Steven Black hosts)
sudo curl -s https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
| awk '!/^#/ && NF==2 {print "address=/"$2"/0.0.0.0"}'
> /etc/dnsmasq.d/blocklist.conf
# Recargar dnsmasq
sudo systemctl reload dnsmasq
Cada línea en blocklist.conf dice “si alguien pide este dominio, devolvé 0.0.0.0”. Después de recargar, las páginas con esos dominios cargan sin los ads.
Si después de activar el bloque la resolución se vuelve lentísima: la lista es muy grande (más de 100k entradas) y dnsmasq está leyendo el archivo de disco en cada query. Pasá la lista a un formato binario compilado con sudo dnsmasq --conf-file=/etc/dnsmasq.d/blocklist.conf (formato address=/dominio/0.0.0.0) o usa cache-size=5000 para que cachee las negativas.
Configurar cache agresivo
El cache de dnsmasq acelera queries repetidas. Por default cachea 150 entradas, suficiente para un equipo solo, pero si toda tu LAN usa el mismo dnsmasq, subilo.
# En /etc/dnsmasq.conf
cache-size=10000
neg-ttl=60 # TTL de respuestas negativas (NXDOMAIN) en segundos
min-cache-ttl=3600 # TTL mínimo para cachear positivo
Si quieres ver si el cache está funcionando: sudo kill -USR1 $(pidof dnsmasq) manda las estadísticas al log. Después sudo tail /var/log/dnsmasq.log te muestra hits, misses, y tamaño actual del cache.
Logging de queries para debug
Durante el setup conviene loguear cada query para entender qué está pidiendo la red. En producción lo desactivás porque llena el disco.
# En /etc/dnsmasq.conf
log-queries
log-facility=/var/log/dnsmasq.log
# Ver queries en vivo
sudo tail -f /var/log/dnsmasq.log
Si el log crece mucho en pocas horas: rotalo con logrotate o deshabilitá log-queries y dejá solo log-dhcp para ver leases DHCP.
5. Troubleshooting común
“Los clientes reciben IP pero no resuelven nombres”
El DHCP funciona pero DNS no. Casi siempre es porque el cliente recibe como DNS la IP del router y no la de dnsmasq. verifica que dhcp-option=6 apunte a la IP de la máquina donde corre dnsmasq.
# Ver qué DNS anuncia dnsmasq en DHCP
sudo journalctl -u dnsmasq | grep "DHCPACK"
# Ver desde un cliente qué DNS recibió
nmcli device show eth0 | grep IP4.DNS
Si el cliente sigue usando el DNS del router: probablemente el cliente ya tenía un lease anterior con otro DNS. Forzá renovación (sudo dhclient -r && sudo dhclient) o espera a que expire.
“dnsmasq no arranca: failed to create listening socket”
Otro proceso está ocupando el puerto 53. Los candidatos típicos son systemd-resolved, bind9, o un dnsmasq viejo que quedó zombie.
# Ver quién está en 53
sudo ss -ulnp | grep ':53 '
sudo fuser 53/udp
# Matar al que esté ocupando
sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved
Si después de matar systemd-resolved la red deja de funcionar: el archivo /etc/resolv.conf quedó apuntando a 127.0.0.53 (el stub de systemd-resolved). Reemplazalo: echo "nameserver 127.0.0.1" | sudo tee /etc/resolv.conf.
“Los leases estáticos se ignoran”
La MAC está mal o el formato es incorrecto. dnsmasq es estricto con el formato: tiene que ser AA:BB:CC:DD:EE:FF con dos puntos y mayúsculas (o minúsculas, pero consistente).
# Ver MACs reales de los dispositivos en tu red
ip neigh show
arp -an
# Ver leases que dnsmasq conoce
cat /var/lib/misc/dnsmasq.leases
Si la MAC está bien pero igual ignora: probablemente hay un conflicto de IP. Si tienes dos dhcp-host con la misma IP, dnsmasq ignora la segunda. Buscá duplicados: grep dhcp-host /etc/dnsmasq.conf.
“Algunos sitios no cargan (SSL errors o timeout)”
El bloqueo está siendo demasiado agresivo. Algunas listas incluyen dominios que son CDN compartidos (cloudfront, fastly, jsdelivr) y bloquearlos rompe medio internet. prueba bloqueando solo la lista de ads conocida.
# Probar con un dominio bloqueado específico
dig @127.0.0.1 doubleclick.net
# Si devuelve 0.0.0.0, está bloqueado
# Si devuelve la IP real, no se está aplicando
Si necesitas excluir un dominio específico del bloqueo: agregá server=/dominio.com/1.1.1.1 (forzar upstream real) antes del address= del bloque. El orden importa en dnsmasq: la primera regla que matchea gana.
Resumen
dnsmasq es la forma más liviana de tener DNS local + DHCP en un homelab. Con 30 líneas de config resolvés nombres, asignás IPs, y bloqueás ads sin agregar dependencias pesadas. Los dos archivos a tocar son /etc/dnsmasq.conf y eventualmente /etc/dnsmasq.d/ para listas externas.
Para profundizar, leé la guía de [ZeroTier vs Tailscale](/zerotier-vs-tailscale-comparativa-2026/) si quieres que el DNS funcione a través de la VPN, o la de [nmap básico](/nmap-basico-auditar-red-local-2026/) para ver qué dispositivos terminaron en tu red.
Preguntas frecuentes
¿Por qué dnsmasq: DNS local + DHCP en tu homelab Linux 2026 es relevante para sysadmins Linux?
Forma parte del flujo diario de administración. Los conceptos explicados se aplican directamente a servidores en producción y resuelven problemas reales que enfrentan sysadmins hispanohablantes.
¿Qué necesito para empezar con dnsmasq: DNS local + DHCP?
Distribución Linux actualizada (Debian, Ubuntu, RHEL, Fedora o Arch), acceso root, y conexión a internet. Para producción: entorno de staging separado antes de aplicar cambios.
¿Cuáles son los errores más comunes con dnsmasq: DNS local + DHCP?
Los tres más frecuentes: (1) saltar la lectura de logs, (2) aplicar cambios directos en producción sin probar, (3) olvidar permisos y ownership. La documentación y un plan de rollback siempre.
¿Cuándo usar dnsmasq: DNS local + DHCP y cuándo una alternativa?
Esta solución es ideal para el caso descrito. Alternativas como Docker, Ansible o configuración manual pueden ser mejores según contexto: portabilidad, escala y reproducibilidad son los factores clave.
¿Cómo migro desde una configuración previa a dnsmasq: DNS local + DHCP?
Documentar el estado actual, probar la nueva configuración en staging, validar funcionalmente, y aplicar en producción con rollback plan listo. Los posts de SoyLinux incluyen troubleshooting para los problemas más comunes.
Lee también
- Guía Fedora 44: Novedades, Instalación y Upgrade para Sysadmins Linux
- Configura VLANs en Linux con nmcli: Guía paso a paso para sysadmins
- Protege tu SSH: Guía esencial para configurar Fail2ban en Linux
- Guía Definitiva: Configura Kubernetes con kubeadm en Ubuntu para Sysadmins Linux
- Configura Prometheus y Grafana: Guía DevOps para SysAdmins Linux

Pingback: Unbound 1.26.1: actualiza tu resolver DNS para cerrar dos RCE críticas - Soy Linux