DnsmasqCette 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

AstuceC’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 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 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 directive log-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
...

ImportantChoisissez 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

ImportantDnsmasq 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 :

    [root@proxy:~] # df -h /
    Filesystem      Size  Used Avail Use% Mounted on
    /dev/sda2       108G  2.6G  100G   3% /
    

    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 :

    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.

Laisser un commentaire

Emplacement de l’avatar

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *