LINUX:IPv4-Serveur DHCP
→ retour aux Notions de réseau
But
Un serveur DHCP est destiné à distribuer des adresses IP, ici pour le protocole IPv4, aux machines du réseau local par défaut qui le demandent.
Ce serveur doit être installé sur une machine qui fait partie du réseau local et qui a une adresse stable, qui ne change pas via la méthode manuelle. Notons qu'il est possible de distribuer des adresses à un autre réseau. Mais une installation spéciale doit être mis en oeuvre pour faire transiter les paquets du protocole DHCP d'un réseau à l'autre. Par défaut, ces paquets sont bloqués par les routeurs. Nous n'aborderons pas cet aspect dans cet article.
Dans cet article, nous irons au plus simple et seulement pour le protocole IPv4.
Installation
Il faut au préalable installer le paquet qui contient le serveur DHCP:
dnf install dhcp-server
Ce paquet est valable pour les deux protocoles IPv4 et Ipv6.
Projet
Nous allons appliquer ce serveur selon le schéma ci-dessous.

Le routeur de notre ISP (Proximus) procure une Bbox qui inclut un serveur DHCP pour le protocole IPv4. Mais les options sont réduites à la seule définition de la plage d'utilisation ou à son inactivation.
Donc les machines qui y sont directement reliées (réseau: "192.168.1.0/24"), recevront leur adresses IPv4 de cette Bbox.
En dessous, nous avons un second réseau "192.168.2.0/24". Les machines de ce second réseau sont configurées au niveau adressage IPv4 en mode automatique, autrement elles attendent une adresse IPv4 d'un serveur DHCP.
Ces deux réseaux sont reliés par un routeur Linux. Les deux interfaces réseau de ce routeur devront être configurées en mode manuel pour leur adressage IPv4.
- Son interface "enp0s25" connecté sur la réseau "192.168.1.0/24" a l'adresse IP "192.168.1.80".
- Son interface "enp6s0" connecté sur la réseau "192.168.2.0/24" a l'adresse IP "192.168.2.80".
Sur ce routeur, on va activer un serveur DHCP pour ce second réseau. Notons qu'il n'est pas obligatoire de placer le serveur DHCP sur un routeur.
Configuration
Le fichier de configuration est à placer dans le répertoire "/etc/dhcp". Il se nomme "dhcpd.conf".
Le fichier existant est vide. On va se baser sur celui donné en exemple dans la documentation "/usr/share/doc/dhcp-server/dhcpd4.conf.example".
Voici le contenu du fichier "dhcpd.conf":
default-lease-time 3600;
max-lease-time 7200;
log-facility local7;
authoritative;
subnet 192.168.2.0 netmask 255.255.255.0 {
range 192.168.2.50 192.168.2.70;
option routers 192.168.2.80;
option domain-name "home.dom";
option domain-name-servers 195.238.2.21, 195.238.2.22;
}
Description des options spécifiques:
- authoritative : assigne ce serveur comme étant prioritaire
- subnet ... netmask ... : définit le réseau pour lequel les options qui sont incluses dans cette section, lui sera appliqué.
- range : définit la tranche de 21 adresses IPv4 qui seront distribuées aux machines requérantes de 192.168.2.50 à 192.168.2.70.
- option routers : définit la route par défaut.
- option domain-name : définit le nom de domaine.
- option domain-name-servers : désigne des noms de serveurs DNS.
Le nom du fichier "/var/lib/dhcpd/dhcpd.leases" qui contiendra les adresses IPv4 distribuées. Ce fichier doit exister et vide lors du premier démarrage et il doit appartenir et être accessible à l'utilisateur/groupe "dhcpd/dhcpd".
Un second fichier doit être configuré spécialement dans notre configuration: "/etc/sysconfig/dhcpd"
Notre routeur a deux interfaces réseaux:
- enp0s25 relié au réseau "192.168.1.0/24"
- enp6s0 relié au réseau "192.168.2.0/24"
Or le serveur DHCP ne doit distribuer ses adresses IPv4 que sur le second réseau et notre configuration ne comporte qu'une section "subnet". Ce fichier doit contenir le nom de l'interface réseau concerné. Ce fichier est "/etc/sysconfig/dhcpd" et on adapte la variable:
DHCPDARGS=" enp6s0 "
Si notre configuration contenait deux sections "subnet", une pour chaque réseau, le fichier ci-dessus reprendrait les noms des deux interfaces dans le même ordre que les sections "subnet" pour une attribution correcte.
FireWall
Sur le serveur comme sur le client, il faut ouvrir des ports dans le FireWall. Nous utilisons IPTABLES.
En Entrée, on ajoute les lignes suivantes dans le fichier "/etc/sysconfig/iptables":
# DHCP -A INPUT -m conntrack --ctstate NEW -p udp --sport 67 --dport 68 -j ACCEPT
Dans le même fichier, si on surveille également ce qui sort, on ajoute les lignes suivantes:
# DHCP -A OUTPUT -m conntrack --ctstate NEW -p udp --sport 68 --dport 67 -j ACCEPT
Activation
Maintenant, on va activer et lancer le service concerné:
systemctl enable dhcpd.service systemctl start dhcpd.service
Pour utiliser ce nouveau service, il faudra configurer les machines clients en mode automatique, nommée également "dhcp".
Configuration des machines clientes
Dans le fichier de configuration réseau de NetworkManager "/etc/NetworkManager/system-connections/enp0s25.nmconnection", l'interface étant "enp0s25", cette configuration est très réduite.
... [ipv4] method=auto ...
Routeur
Rappelons qu'un routeur doit assurer le transfert des messages d'un réseau à l'autre. Pour cette raison, un paramètre spécifique doit être activé.
On crée un fichier, par exemple, "/etc/sysctl.d/router.conf" dans lequel on ajoute la ligne:
net.ipv4.ip_forward = 1
Pour l'activer, soit on redémarre la machine soit on lance la commande:
sysctl -p /etc/sysctl.d/router.conf
Vérification
Voyons le résultat sur les machines clientes.
L'adresse IP attribuée est la suivante avec la commande:
ifconfig
donne:
enp0s25: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.2.50 netmask 255.255.255.0 broadcast 192.168.2.255
....
La première adresse de la tranche disponible, lui a été attribuée.
Et la table de routage avec la commande:
route -n
qui donne:
Table de routage IP du noyau Destination Passerelle Genmask Indic Metric Ref Use Iface 0.0.0.0 192.168.2.80 0.0.0.0 UG 100 0 0 enp0s25 192.168.2.0 0.0.0.0 255.255.255.0 U 100 0 0 enp0s25
La troisième ligne concerne la route par défaut.
Routes statiques
Si notre réseau était en contact direct avec d'autres routeurs, un routeur serait choisi comme route par défaut et pour les autres, il faudrait ajouter des routes statiques afin de pouvoir atteindre ces autres réseaux.
Pour exercice, supposons que nous devions définir trois autres réseaux transitant chacun par un routeur spécifique:
- vers le réseau 192.168.5.0/24 (ou 255.255.255.0) par le routeur 192.168.2.170
- vers le réseau 10.8.4.0/24 (ou 255.255.255.0) par le routeur 192.168.2.180
- vers le réseau 172.15.5.0/25 (ou 255.255.255.128) par le routeur 192.168.2.190
Remarquez que le troisième est définit sur base de 25 bits, ce qui définit un réseau plus réduit selon la tranche 172.15.5.0 à 172.15.5.127.
Dans la configuration du serveur DHCP, il y a deux possibilités.
Option 1
La solution la plus ancienne est la suivante qui est à mettre dans la section "subnet":
...
subnet 192.168.2.0 netmask 255.255.255.0 {
...
option static-routes 192.168.5.0 192.168.2.170 , 10.8.4.0 192.168.2.180 , 172.15.5.0 192.168.2.190;
}
Notons que cette option doit contenir les trois routes et non une option par route.
La première valeur correspond à l'adresse du réseau et la seconde à l'adresse IP du routeur.
Sur la machine client, la commande:
route -n
donne:
Table de routage IP du noyau Destination Passerelle Genmask Indic Metric Ref Use Iface 0.0.0.0 192.168.2.80 0.0.0.0 UG 100 0 0 enp0s25 192.168.2.0 0.0.0.0 255.255.255.0 U 100 0 0 enp0s25 192.168.5.0 192.168.2.170 255.255.255.0 UG 100 0 0 enp0s25 10.0.0.0 192.168.2.180 255.0.0.0 UG 100 0 0 enp0s25 172.15.0.0 192.168.2.190 255.255.0.0 UG 100 0 0 enp0s25
Nous remarquons tout de suite que les réseaux de destination ne sont pas ceux auxquels on s'attend.
En effet ces réseaux ont été remplacés par ceux de leurs classes correspondantes:
- Le premier est bon. Il appartient à la classe C basé sur 24 bits. Heureusement nous avions demandé un réseau sur 24 bits: 192.168.5.0/24
- Le second ne correspond pas. Il appartient à la classe A basé sur 8 bits: 10.0.0.0/8 au lieu de 10.8.4.0/24
- Le troisième ne correspond pas. Il appartient à la classe B basé sur 16 bits: 172.15.0.0/16 au lieu de 172.15.5.0/25
Heureusement, dans les cas les plus fréquents dans les petits réseaux privés, on utilise les réseaux de la classe C "192.168.X.0/24". Mais pour les deux autres cas, on aura des problèmes de routage.
Option 2
La solution la plus récente mais pas toujours supportée est la suivante qui est à mettre dans la section "subnet":
...
subnet 192.168.2.0 netmask 255.255.255.0 {
...
option classless-static-routes 24.192.168.5 192.168.2.170 , 24.10.8.4 192.168.2.180 , 25.172.15.5.0 192.168.2.190;
}
Notons que cette option doit contenir les trois routes et non une option par route.
La première valeur correspond à l'adresse du réseau sous un format spécial et la seconde à l'adresse IP du routeur.
Le format de la première valeur débute par le nombre de bits du masque de réseau suivi par les valeurs nécessaires pour le réseau.
- Pour un masque de 24 bits, il faut trois zones de 8 bits d'où les trois premières valeurs de l'adresse du réseau.
- Par contre, pour un masque de 25 bits, il faut trois zones de 8 bits et une zone pour le 25ème bit ('1000 0000') d'où les quatre valeurs de l'adresse du réseau. (troisième route)
Si vous ne respectez pas cette règle, vous aurez un message d'erreur lors du lancement du serveur.
Sur la machine client, la commande:
route -n
donne:
Table de routage IP du noyau Destination Passerelle Genmask Indic Metric Ref Use Iface 0.0.0.0 192.168.2.80 0.0.0.0 UG 100 0 0 enp0s25 192.168.2.0 0.0.0.0 255.255.255.0 U 100 0 0 enp0s25 192.168.5.0 192.168.2.170 255.255.255.0 UG 100 0 0 enp0s25 10.8.4.0 192.168.2.180 255.255.255.0 UG 100 0 0 enp0s25 172.15.5.0 192.168.2.190 255.255.255.128 UG 100 0 0 enp0s25
Maintenant les routes attendues sont au rendez-vous.
Conclusion
Si cette option n'est pas supportée, il reste la solution de configurer cette route statique directement sur la machine clientes. Cette solution sort d'un contexte d'automatisation. Pour un desktop qui reste en place, c'est un moindre mal mais peu pratique car il faut effectuer une intervention ciblée et locale. Par contre pour un portable, ce n'est pas envisageable.
Une seconde solution préconisée si elle est possible, est de ne définir qu'une route par défaut à envoyer aux machines clients et de garnir les tables de routages des routeurs de façon complète.
Remarquons que sur le routeur de notre ISP (Proximus) (Bbox), il n'est pas possible d'ajouter des routes statiques. Dans ce cas, soit on ajoute des routes statiques sur les machines clientes, soit on désactive le serveur DHCP du routeur de l'ISP et on active notre propre serveur DHCP pour ce réseau, soit on change de routeur par un routeur personnel.
Remarques
Il existe de très nombreuses options sur ce serveur DHCP.
Par exemple:
- Il est possible d'imposer un adressage et ses options à une machine spécifique sur base de son adresse MAC.
- La mise à jour dynamique des adresses IP et noms de machines sur notre propre serveur DNS est possible.
- D'autres options permettent, par exemple, de définir les adresses d'autres types de serveurs autres que DNS. Je n'ai jamais eu la nécessité d'ajouter ces dernières.
→ retour aux Notions de réseau