dnsmasq : DHCP + DNS leger pour LAN

dnsmasq : DHCP + DNS leger pour LAN

dnsmasq fait DHCP, DNS forwarder, TFTP, et cache local en un seul binaire de 200 Ko. Indispensable pour les routeurs OpenWrt, les LAN d'entreprise modestes, le provisioning PXE, et les labs.

Introduction

dnsmasq :

  • Serveur DHCP IPv4 + IPv6 (DHCPv6, SLAAC)
  • DNS forwarder + cache (pas autoritaire)
  • Support TFTP integre (PXE)
  • Resolution des noms LAN automatique
  • Configuration ultra-simple (un fichier)
  • Disponible sur Linux, BSD, OpenWrt

Cas d'usage :

  • Routeur/firewall (souvent integre, ex: OpenWrt, pfSense)
  • LAN bureau / lab / datacenter petit
  • PXE boot
  • DHCP simple avec reservations statiques

Note : dnsmasq n'est pas un serveur DNS autoritaire. Pour ca, regardez BIND9 ou NSD.

Prerequis

  • VPS / serveur Linux Debian / Ubuntu
  • Acces root
  • Interface reseau dediee au LAN (pas dans le meme broadcast que votre VPS public!)

Etape 1 : Installation

sudo apt update
sudo apt install -y dnsmasq dnsmasq-utils
dnsmasq --version

⚠️ Sur Ubuntu, systemd-resolved ecoute deja sur 53. Desactivez-le ou changez le port dnsmasq :

sudo systemctl disable --now systemd-resolved
sudo unlink /etc/resolv.conf
echo "nameserver 1.1.1.1" | sudo tee /etc/resolv.conf

Etape 2 : Configuration de base

sudo nano /etc/dnsmasq.d/lan.conf
# Interface
interface=ens4
bind-interfaces

# Pas d'ecoute sur l'interface publique
except-interface=ens3

# DNS forwarder
domain-needed
bogus-priv
no-resolv

# Upstream DNS
server=9.9.9.9
server=1.1.1.1

# Cache
cache-size=10000
no-negcache

# Logs
log-queries
log-dhcp

Etape 3 : DHCP

# DHCP range
dhcp-range=192.168.50.100,192.168.50.200,12h

# DHCP options (passees aux clients)
dhcp-option=option:router,192.168.50.1
dhcp-option=option:dns-server,192.168.50.1
dhcp-option=option:domain-name,verycloud.lan
dhcp-option=option:netbios-ns,192.168.50.1

# Lease database
dhcp-leasefile=/var/lib/misc/dnsmasq.leases

Etape 4 : Reservations statiques

Pour donner toujours la meme IP a certains appareils :

dhcp-host=AA:BB:CC:DD:EE:01,192.168.50.10,web01
dhcp-host=AA:BB:CC:DD:EE:02,192.168.50.11,db01
dhcp-host=AA:BB:CC:DD:EE:03,192.168.50.12,proxy01,infinite

infinite = lease infini (utile pour les serveurs).

Etape 5 : Domain local

Pour resoudre automatiquement les noms des appareils :

local=/verycloud.lan/
domain=verycloud.lan
expand-hosts

Maintenant si un client DHCP s'appelle laptop-mathys, on peut le pinger via laptop-mathys.verycloud.lan.

Etape 6 : Demarrer et tester

sudo systemctl restart dnsmasq
sudo systemctl status dnsmasq

Verifiez les logs :

sudo journalctl -u dnsmasq -f

Sur un client LAN, demandez un bail :

sudo dhclient -r eth0 && sudo dhclient eth0

Verifiez le leasefile :

sudo cat /var/lib/misc/dnsmasq.leases

Etape 7 : Mappings hosts

Pour ajouter des entrees DNS manuelles (non DHCP) :

address=/internal-app/192.168.50.50
address=/grafana.verycloud.lan/192.168.50.51

Ou utilisez /etc/hosts standard (dnsmasq le lit automatiquement) :

192.168.50.50 internal-app internal-app.verycloud.lan
192.168.50.51 grafana.verycloud.lan

Etape 8 : TFTP / PXE Boot

Pour ajouter le PXE boot a votre dnsmasq (voir tuto 28 pour le detail) :

enable-tftp
tftp-root=/srv/tftp
dhcp-boot=pxelinux.0

Tres pratique : dnsmasq fait DHCP + TFTP + DNS d'un coup, parfait pour un lab.

Etape 9 : DHCP options avancees

# Force le DNS Pi-hole pour tous les clients DHCP
dhcp-option=option:dns-server,192.168.50.2

# NTP
dhcp-option=option:ntp-server,192.168.50.1

# Tag base sur la MAC ou IP
dhcp-host=set:office,192.168.50.20-192.168.50.49

# Tag base sur le vendor class
dhcp-vendorclass=set:windows,MSFT

# Specifique aux Windows
dhcp-option=tag:windows,option:netbios-ns,192.168.50.1

Etape 10 : DHCP IPv6 (SLAAC + DHCPv6)

# IPv6 ranges
dhcp-range=fd12:3456::,ra-only,infinite
dhcp-range=fd12:3456::100,fd12:3456::200,64,12h

# Router Advertisement
ra-param=ens4
enable-ra

Etape 11 : Logs et stats

# Stats temps reel (envoie SIGUSR1)
sudo killall -SIGUSR1 dnsmasq
sudo journalctl -u dnsmasq | tail -20

Affiche :

  • Cache size, hits, misses
  • DHCP leases actifs
  • Top queries

Pour Prometheus : dnsmasq_exporter.

Etape 12 : Mode resolveur DNS seul (sans DHCP)

Si vous voulez juste un cache DNS local rapide :

# Pas de DHCP
no-dhcp-interface=ens3,ens4

# Pas d'ecoute sur LAN (juste localhost)
interface=lo
bind-interfaces

# Upstream
no-resolv
server=1.1.1.1
server=9.9.9.9

cache-size=10000

Et configurez /etc/resolv.conf :

nameserver 127.0.0.1

Le DNS local est tres rapide grace au cache.

Depannage

"dnsmasq: failed to create listening socket"

Port 53 deja pris. Verifiez :

sudo ss -tunlp | grep :53

Souvent systemd-resolved. Desactivez-le.

Clients n'obtiennent pas de bail DHCP

Verifiez :

  • Interface correcte dans interface=...
  • Pas de firewall qui bloque (port 67, 68 UDP)
  • Reseau bien isole (pas de DHCP concurrent)
sudo tcpdump -i ens4 port 67 or port 68

Resolution lente / cache pas utilise

Verifiez le cache :

sudo killall -SIGUSR1 dnsmasq
sudo journalctl -u dnsmasq | grep cache

Si cache-size=0, augmentez. Si no-cache actif, retirez-le.

"no such file" sur leasefile

sudo touch /var/lib/misc/dnsmasq.leases
sudo chown dnsmasq:dnsmasq /var/lib/misc/dnsmasq.leases

Conflit avec un autre DHCP

Si vous voyez 2 reponses DHCP differentes sur le LAN, c'est un conflit. Tuez l'autre serveur (souvent un autre routeur).

Commandes utiles

# Service
sudo systemctl status dnsmasq
sudo systemctl restart dnsmasq

# Verifier la config sans demarrer
sudo dnsmasq --test

# Stats temps reel
sudo killall -SIGUSR1 dnsmasq
sudo journalctl -u dnsmasq | tail -30

# Voir les leases actifs
sudo cat /var/lib/misc/dnsmasq.leases

# Format : timestamp_expire MAC IP hostname client-id
# 1700000000 aa:bb:cc:dd:ee:01 192.168.50.100 laptop-mathys 01:aa:bb:cc:dd:ee:01

# Lister les DHCP options envoyees
sudo dhcpdump -i ens4

# Tester resolution
dig @192.168.50.1 google.com
nslookup web01.verycloud.lan 192.168.50.1

Conclusion

dnsmasq est l'outil tout-en-un pour les LAN simples :

  • DHCP + DNS + TFTP en un binaire
  • Tres leger (RAM, CPU)
  • Configuration en un fichier
  • Resolution auto des hostnames LAN

Limites :

  • Pas autoritaire DNS (pour servir un domaine public, utilisez BIND9/NSD/PowerDNS)
  • Pas adapte aux grosses infrastructures (utilisez ISC DHCP / Kea)

Pour aller plus loin :

  • Combinez avec Unbound ou Pi-hole pour la couche resolveur
  • Pour DHCP enterprise, regardez ISC Kea (successeur d'ISC DHCP)
  • Pour DDNS, utilisez nsupdate ou Knot DNS

Ressources

Join our Discord community server

For any questions, suggestions, or just to chat with the community, join us on Discord!

900+Members