Dynamic Host Configuration Protocol (DHCP) est un protocole réseau dont le rôle est d’assurer la configuration automatique des paramètres IP d’une station, notamment en lui affectant automatiquement sa configuration IP.
DHCP peut aussi configurer l’adresse de la passerelle par défaut ainsi que des serveurs de noms DNS par exemple
Le mécanisme de base de la communication est BOOTP (avec trame UDP). Quand une machine est démarrée, elle n'a aucune information sur sa configuration réseau, et surtout, l'utilisateur ne doit rien faire de particulier pour trouver une adresse IP. Pour faire ça, la technique utilisée est le broadcast : pour trouver et dialoguer avec un serveur DHCP, la machine va simplement émettre un paquet spécial de broadcast (broadcast sur 255.255.255.255 avec d'autres informations comme le type de requête, les ports de connexion…) sur le réseau local. Lorsque le serveur DHCP recevra le paquet de broadcast, il renverra un autre paquet de broadcast ( le client n'a pas encore d'adresse IP et donc il n'est pas joignable directement) contenant toutes les informations requises pour le client.
Il existe plusieurs types de paquets DHCP susceptibles d'être émis soit par le client pour le ou les serveurs, soit par le serveur vers un client :
Lorsqu'un client DHCP initialise un accès à un réseau TCP/IP, le processus d'obtention du bail IP se déroule en 4 phases :
Enfin le client utilise l'adresse pour se connecter au réseau.
Installer le service DHCP
$ yum install dhcp
Toute la configuration du serveur dhcp se trouve dans le fichier /etc/dhcp/dhcpd.conf.
Par défaut, toutes les lignes sont commentées. Le serveur n'est donc pas en action.
Pour des raisons d'optimisation des ressources réseau, les adresses IP sont délivrées avec une date de début et une date de fin de validité. C'est ce qu'on appelle un “bail”. Un client qui voit son bail arriver à terme peut demander au serveur une prolongation du bail par un DHCPREQUEST. De même, lorsque le serveur verra un bail arriver à terme, il émettra un paquet DHCPNAK pour demander au client s'il veut prolonger son bail. Si le serveur ne reçoit pas de réponse valide, il rend disponible l'adresse IP.
On peut optimiser l'attribution des adresses IP en jouant sur la durée des baux. Si aucune adresse n'est libérée au bout d'un certain temps, plus aucune requête DHCP ne pourra être satisfaite, faute d'adresses à distribuer.
Sur un réseau où beaucoup d'ordinateurs se branchent et se débranchent souvent (réseau d'école ou de locaux commerciaux par exemple), il est intéressant de proposer des baux de courte durée. A l'inverse, sur un réseau constitué en majoritéde machines fixes, très peu souvent rebootées, des baux de longues durées suffisent. N'oubliez pas que le DHCP marche principalement par broadcast, et que cela peut bloquer de la bande passante sur des petits réseaux fortement sollicités.
default-lease-time 86400; # Bail de 24H max-lease-time 172800; # Bail maxi de 48H
En général, on donne :
Tous ces éléments sont attribués pour la durée de bail fixée. Si, au bout de cette durée, l'hôte ne sollicite pas à nouveau une adresse au serveur, cette adresse est jugée disponible pour un autre hôte.
Exemple d'une réservation basique:
# Déclaration d'un réseau subnet 192.168.1.0 netmask 255.255.255.0 { range 192.168.1.100 192.168.1.199; # Plage IP option domain-name-servers 192.168.1.11; # DNS option routers 192.168.1.1; # Passerelle }
On peut réserver une adresse IP dans une plage, pour une adresse MAC donnée, il suffit de déclarer un “host” dans le “subnet”.
Démonstration avec 2 réservations :
# Plage DHCP subnet 10.21.27.0 netmask 255.255.255.0 { range 10.21.27.100 10.21.27.199; option domain-name-servers 10.21.27.253; option routers 10.21.27.254; # Réservations DHCP host superlinux-eth { hardware ethernet 10:bf:48:13:f6:cc; fixed-address 10.21.27.100; } host superlinux-wlan { hardware ethernet 68:5d:43:2a:f3:af; fixed-address 10.21.27.101; } }
Si on veut bloquer une adresse MAC, afin qu'elle ne reçoive pas d'IP, voici quelques lignes à ajouter dans le dhcpd.conf (on suppose que 00:00:00:00:00 est l'adresse MAC)
host banni { hardware ethernet 00:00:00:00:00; deny booting; }
Une fois la config terminée, on lance notre DHCP:
$ systemctl start dhcpd
Et on ajoute le service au démarrage :
$ systemctl enable dhcpd
Les trames arp, bootp ne traversent pas les routeurs. Sur un réseau segmenté par des routeurs il est donc impossible de servir tous les segments avec le même serveur DHCP. Il faut donc mettre un serveur DHCP sur chaque segment, ou alors utiliser un agent de relais DHCP.
Un agent relais DHCP relaie les messages DHCP échangés entre un client et un serveur DHCP situés sur des sous-réseaux différents.
Il est généralement installé sur un routeur pour pouvoir diriger les messages vers le serveur DHCP, mais ce n'est pas obligatoire. L'agent doit connaître l'adresse du serveur DHCP mais ne peut pas être lui-même client DHCP.
Comme les clients contactent les serveurs DHCP à l'aide d'une diffusion, dans un inter-réseau, on doit théoriquement installer un serveur DHCP par sous-réseau.
Serveur DHCP et agent de relais ont des adresses ip statiques. Le dialogue traverse le routeur et se fait en unicast.
Sous Linux il existe un agent relais DHCP (dhcrelay). Ce produit de l'ISC (Internet Software Consortium) permet de router des requêtes BOOTP et DHCP provenant de clients d'un réseau sur lequel il n'y a pas de serveur DHCP vers un autre segment sur lequel un serveur pourra répondre.
L'agent relais DHCP écoute les requêtes et les réponses BOOTP et DHCP. Quand une requête arrive, l'agent route la requête vers la liste de serveurs spécifiée sur la ligne de commande. Quand une réponse arrive d'un serveur, l'agent transmet la réponse (broadcast ou unicast cela dépend de la réponse) sur le segment d'où provenait la requête (broadcast) ou directement vers le client (unicast).
$ yum install dhcp
dhcrelay [-p port] [-d] [-q] [-i if0 [... -i ifN ] ]server0 [ ...serverN ]
L'agent
La commande “dpkg-reconfigure ” peut également permettre de configurer l'agent et indiquer à quel serveur l'agent doit passer les requêtes:
dhcrelay 192.168.1.1 -d
Pour exécuter dhcrelay en mode démon copier puis modifier le fichier dhcrelay.service en tant qu'utilisateur root:
$ cp /lib/systemd/system/dhcrelay.service /etc/systemd/system/ $ vi /etc/systemd/system/dhcrelay.service
Modifier l'option ExecStart dans la section [Service] et ajouter une ou plusieurs adresses IPv4 du serveur à la fin de la ligne, par exemple:
ExecStart=/usr/sbin/dhcrelay -d --no-pid 192.168.1.1
On peut également spécifier des interfaces sur lesquelles l'agent relais DHCP écoute les requêtes DHCP, à l'option ExecStart avec l'argument -i (sinon, il écoutera toutes les interfaces), par exemple:
ExecStart=/usr/sbin/dhcrelay -d --no-pid 192.168.1.1 -i em1
Pour activer les modifications apportées, redémarrer le service:
$ systemctl --système démon-recharger $ systemctl restart dhcrelay