Aller au contenu

Dnsmasq sur un routeur sous Debian 13

Dnsmasq

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 :

/etc/hosts
127.0.0.1    localhost.localdomain localhost
192.168.3.1  squidbox.sandbox.lan  squidbox

Installation

Dnsmasq est fourni par les dépôts de paquets officiels de Debian :

$ sudo apt update
$ sudo apt install --no-install-recommends dnsmasq

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 :

/etc/dnsmasq.conf
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-needed et bogus-priv évitent que Dnsmasq ne relaie les requêtes incomplètes ou locales à un ou plusieurs serveurs DNS en amont.

  • L'option interface spécifie l'interface réseau que l'on souhaite utiliser.

  • L'option dhcp-range dé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 local indique 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 domain attribue le nom de domaine spécifié aux clients. Pour des raisons évidentes, il doit coïncider avec le domaine défini dans l'option local.

  • L'option expand-hosts concerne 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 machine alphamule, Dnsmasq retournera automatiquement l'adresse IP de l'hôte alphamule.sandbox.lan.

  • L'option server spé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-resolv indique à 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 directive log-facility permet 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 :

$ sudo systemctl restart dnsmasq

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 :

/etc/dnsmasq.conf
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 :

/etc/dnsmasq.conf
dhcp-host=B8:CA:3A:D6:5A:43,1C:3E:84:32:7E:87,macbook,192.168.3.4

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 :

/etc/hosts
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 :

$ sudo systemctl restart dnsmasq

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 :

/etc/resolv.conf
nameserver 127.0.0.1

Vérifions :

$ host poste-01
poste-01 has address 192.168.3.2
$ host poste-02
poste-02 has address 192.168.3.3

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.