Cette page décrit la configuration de Dnsmasq sur un serveur local tournant sous Rocky Linux 8. 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 DHCPD 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
Ouvrir 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
# firewall-cmd --permanent --zone=internal --add-service=dhcp # firewall-cmd --permanent --zone=internal --add-service=dns # firewall-cmd --reload # firewall-cmd --list-all internal (active) target: default icmp-block-inversion: no interfaces: enp2s0 sources: services: dhcp dns ssh ports: protocols: forward: no masquerade: yes forward-ports: source-ports: icmp-blocks: rich rules:
Le fichier /etc/hosts
du serveur local doit comporter au moins les deux lignes suivantes :
# /etc/hosts 127.0.0.1 localhost.localdomain localhost 192.168.2.1 proxy.microlinux.lan proxy
C’est surtout la deuxième ligne qui est d’une importance capitale. Elle fait correspondre le nom de la machine locale avec l’adresse IP dans le réseau local.
Installation
Dnsmasq est fourni par les dépôts officiels de Red Hat Enterprise Linux et Rocky Linux :
# dnf install -y dnsmasq
La configuration de Dnsmasq s’effectue par le biais du fichier de configuration /etc/dnsmasq.conf
. Le fichier fourni par défaut comporte près de 530 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 # mv dnsmasq.conf dnsmasq.conf.orig
Éditer une configuration minimale :
# /etc/dnsmasq.conf
domain-needed
bogus-priv
interface=enp2s0
dhcp-range=192.168.2.100,192.168.2.200,24h
local=/microlinux.lan/
domain=microlinux.lan
expand-hosts
server=208.67.222.222
server=208.67.220.220
no-resolv
log-facility=/var/log/dnsmasq.log
- Les deux premières options
domain-needed
etbogus-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’optionlocal
. - 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 unping
sur la machinealphamule
, Dnsmasq retournera automatiquement l’adresse IP de l’hôtealphamule.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 OpenDNS. - 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 directivelog-facility
permet de centraliser les logs en un seul fichier, ce qui est bien plus propre.
Activer et démarrer Dnsmasq :
# systemctl enable dnsmasq --now
Vérifier l’état du service :
# systemctl status dnsmasq ● dnsmasq.service - DNS caching server. Loaded: loaded (/usr/lib/systemd/system/dnsmasq.service; enabled; vendor preset: disabled) Active: active (running) since Tue 2024-03-05 08:09:55 CET; 1min 20s ago
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 ceci :
# /etc/dnsmasq.conf ... dhcp-host=00:1E:C9:43:A7:BF,poste-01,192.168.2.2 dhcp-host=00:1D:09:15:4A:D8,poste-02,192.168.2.3 ...
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.2.100
et 192.168.2.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 wifi 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.2.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.2.1 proxy.microlinux.lan proxy 192.168.2.2 poste-01 192.168.2.3 poste-02 192.168.2.4 macbook ... 192.168.2.252 hp-officejet 192.168.2.253 nas 192.168.2.254 wifi
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.
Relancer Dnsmasq pour prendre en compte les modifications :
# systemctl restart dnsmasq
Les postes clients sur le réseau utilisent les informations sur les noms d’hôtes fournies par Dnsmasq. Pour que le serveur lui-même puisse les prendre en compte aussi, il faudra éditer /etc/resolv.conf
comme ceci :
# /etc/resolv.conf
nameserver 127.0.0.1
Vérifions :
[microlinux@proxy:~] $ host poste-01 poste-01 has address 192.168.2.2 [microlinux@proxy:~] $ host poste-02 poste-02 has address 192.168.2.3
Afficher en direct l’attribution des baux DHCP
Sur le serveur, on peut suivre en direct l’attribution des baux DHCP en affichant en continu le journal /var/log/dnsmasq.log
:
# tail -f /var/log/dnsmasq.log Mar 4 09:28:42 ... DHCPREQUEST(enp3s1) 192.168.2.3 00:1d:09:15:4a:d8 Mar 4 09:28:42 ... DHCPACK(enp3s1) 192.168.2.3 00:1d:09:15:4a:d8 poste-02 Mar 4 09:28:42 ... DHCPREQUEST(enp3s1) 192.168.2.2 00:1e:c9:43:a7:bf Mar 4 09:28:42 ... DHCPACK(enp3s1) 192.168.2.2 00:1e:c9:43:a7:bf poste-01
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.
4 commentaires
AFG · 5 mars 2024 à 12 h 08 min
pourquoi Rocky Linux (2Go d’install mini) et pas OpenWRT (x86_64) qui fait ça par défaut, avec une UI webserver, dans 300 Mo?
kikinovak · 5 mars 2024 à 13 h 57 min
Actuellement j’ai ça :
Je ne vois pas trop le bénéfice de remplacer un système qui occupe 3% du disque par un autre système qui occupe 0.5% du disque. Plus généralement je pense que la « meilleure » distribution c’est celle avec laquelle on est à l’aise pour peaufiner ses configs. D’ailleurs, j’aurais très bien pu utiliser le système pfSense préinstallé. Là comme ailleurs, différents chemins mènent à Saint-Bauzille-de-Putois. :o)
Toto · 9 mars 2024 à 7 h 50 min
Pour le DHCP, les machines qui reçoivent une IP ne sont pas pinguables par leur nom?
Dnsmasq ne sait pas enregistrer la correspondance dynamique ?
kikinovak · 9 mars 2024 à 8 h 36 min
Non, il faut également écrire le nom d’hôte dans
/etc/hosts
. C’est expliqué dans l’article :