Dnsmasq sur un routeur sous Debian 13
Cette page décrit la configuration de Dnsmasq sur un routeur tournant sous Debian 13. Dnsmasq est un serveur léger qui fournit les services DHCP et DNS pour des réseaux locaux, même de taille importante. Il est extrêmement facile à configurer, et l'on pourra l'utiliser pour remplacer une configuration plus classique basée sur un serveur DHCP et Bind. Ce dernier n'est pas très adapté pour les DNS de réseaux locaux, notamment à cause de sa syntaxe farfelue.
Prérequis
J'ouvre les ports suivants dans le pare-feu :
-
53 en TCP et UDP pour les requêtes DNS
-
67 en UDP pour les requêtes DHCP
$ sudo firewall-cmd --permanent --zone=internal --add-service=dhcp
success
$ sudo firewall-cmd --permanent --zone=internal --add-service=dns
success
$ sudo firewall-cmd --reload
success
Voilà ce que ça donne :
$ sudo firewall-cmd --list-all
internal (default, active)
target: default
ingress-priority: 0
egress-priority: 0
icmp-block-inversion: no
interfaces: enp2s0
sources:
services: dhcp dns ssh
ports:
protocols:
forward: yes
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
Le fichier /etc/hosts du routeur doit comporter au moins les deux lignes
suivantes :
Installation
Dnsmasq est fourni par les dépôts de paquets officiels de Debian :
Configuration
La configuration de Dnsmasq s'effectue par le biais du fichier de
/etc/dnsmasq.conf. Le fichier fourni par défaut comporte près de 700 lignes
de commentaires et sert également de documentation. On pourrait très bien
activer l'une ou l'autre option en la décommentant. Dans le cas présent, il
vaut mieux effectuer une copie de sauvegarde et commencer par un fichier
vide :
$ cd /etc/
$ sudo mv -v dnsmasq.conf dnsmasq.conf.orig
renamed 'dnsmasq.conf' -> 'dnsmasq.conf.orig'
J'édite une configuration minimale :
domain-needed
bogus-priv
interface=enp2s0
dhcp-range=192.168.3.100,192.168.3.200,24h
local=/sandbox.lan/
domain=sandbox.lan
expand-hosts
server=1.1.1.1
server=1.0.0.1
no-resolv
log-facility=/var/log/dnsmasq.log
-
Les deux premières options
domain-neededetbogus-privévitent que Dnsmasq ne relaie les requêtes incomplètes ou locales à un ou plusieurs serveurs DNS en amont. -
L'option
interfacespécifie l'interface réseau que l'on souhaite utiliser. -
L'option
dhcp-rangedéfinit la plage d'adresses dynamiques utilisée par le serveur DHCP. Dans le cas présent, les adresses attribuées auront une durée de validité de 24 heures. Passé ce délai, elles devront être renouvelées par les clients. -
L'option
localindique que les réponses aux requêtes pour le domaine spécifié doivent être fournies directement par Dnsmasq, et non pas par un serveur DNS en amont. -
L'option
domainattribue le nom de domaine spécifié aux clients. Pour des raisons évidentes, il doit coïncider avec le domaine défini dans l'optionlocal. -
L'option
expand-hostsconcerne les requêtes DNS sans le domaine et se charge d'ajouter celui-ci automatiquement. Concrètement, lorsqu'on essaie d'envoyer un ping sur la machinealphamule, Dnsmasq retournera automatiquement l'adresse IP de l'hôtealphamule.sandbox.lan. -
L'option
serverspécifie l'adresse IP d'un ou plusieurs serveurs DNS en amont. Dans l'exemple ci-dessus, on utilise les deux serveurs DNS de chez Cloudflare. -
L'option
no-resolvindique à Dnsmasq de ne pas prendre en compte le contenu du fichier/etc/resolv.conf. -
Dans la configuration par défaut, Dnsmasq écrit ses logs un peu partout dans
/var/log. La directivelog-facilitypermet de centraliser les logs en un seul fichier, ce qui est bien plus propre.
Mise en service
Sur les systèmes de la famille Debian, un service est automatiquement activé et lancé après son installation. Je relance le service pour prendre en compte ma configuration :
Je vérifie s'il tourne correctement :
$ systemctl status dnsmasq
● dnsmasq.service - dnsmasq - A lightweight DHCP and caching DNS server
Loaded: loaded (/usr/lib/systemd/system/dnsmasq.service; enabled;
preset: enabled)
Active: active (running) since Tue 2026-02-03 09:34:05 CET; 3h 2min ago
Invocation: c6d5f1c5fb4a4187a0093a3290f35297
Docs: man:dnsmasq(8)
Je branche un poste client configuré en DHCP côté réseau local
(192.168.3.0/24), je le démarre et je jette un œil sur les logs de Dnsmasq.
Au bout de quelques secondes, je peux suivre en direct l'attribution du bail
DHCP à mon poste :
$ sudo tail -f /var/log/dnsmasq.log
... dnsmasq-dhcp[1137]: DHCPDISCOVER(enp2s0) b0:83:fe:90:4d:64
... dnsmasq-dhcp[1137]: DHCPOFFER(enp2s0) 192.168.3.117 b0:83:fe:90:4d:64
... dnsmasq-dhcp[1137]: DHCPREQUEST(enp2s0) 192.168.3.117 b0:83:fe:90:4d:64
... dnsmasq-dhcp[1137]: DHCPACK(enp2s0) 192.168.3.117 b0:83:fe:90:4d:64
Attribuer des adresses statiques
On pourra attribuer une adresse IP et un nom d'hôte fixe en fonction de l'adresse MAC des interfaces réseau respectives, en ajoutant une série d'entrées comme celles-ci :
dhcp-host=00:1E:C9:43:A7:BF,poste-01,192.168.3.2
dhcp-host=00:1D:09:15:4A:D8,poste-02,192.168.3.3
Gare aux conflits d'adresses IP
Choisissez les adresses IP attribuées de manière statique en-dehors de la plage d'adresses dynamiques. Dans l'exemple, cette plage se situe entre 192.168.3.100 et 192.168.3.200.
Si l'on souhaite attribuer une adresse IP et un nom d'hôte fixe à un portable que l'on connecte aussi bien par le Wi-Fi que par une connexion filaire, on peut utiliser la syntaxe suivante :
Gérer les hôtes statiques
L'ajout d'hôtes statiques est extrêmement simple avec Dnsmasq. Il suffit
d'ajouter l'entrée correspondante dans le fichier /etc/hosts du serveur, et
celui-ci se chargera de propager l'info au niveau du réseau local :
127.0.0.1 localhost.localdomain localhost
192.168.3.1 squidbox.sandbox.lan squidbox
192.168.3.2 poste-01
192.168.3.3 poste-02
192.168.3.4 macbook
...
192.168.3.252 hp-officejet
192.168.3.253 nas
192.168.3.254 wifi
Configurer les hôtes statiques
Dnsmasq lit les informations sur les hôtes statiques dans le fichier
/etc/hosts, et non pas dans /etc/dnsmasq.conf. La résolution correcte
des noms d'hôtes dans le réseau local se fait donc au prix d'une petite
redondance.
Je relance Dnsmasq pour prendre en compte les modifications :
Les postes clients sur le réseau utilisent les informations sur les noms
d'hôtes fournies par Dnsmasq. Il va falloir éditer /etc/resolv.conf comme
ceci pour que le serveur lui-même puisse les prendre en compte aussi :
Vérifions :
La rédaction de cette documentation demande du temps et des quantités significatives de café espresso. Vous appréciez ce blog ? Offrez un café au rédacteur en cliquant sur la tasse.

