Table of Contents
Centos: Mise en oeuvre d'un serveur DHCP
Table of Contents
Introduction
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
Fonctionnement du protocole DHCP
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 :
- DHCPDISCOVER (pour localiser les serveurs DHCP disponibles)
- DHCPOFFER (réponse du serveur à un paquet DHCPDISCOVER, qui contient les premiers paramètres)
- DHCPREQUEST (requête diverse du client pour par exemple prolonger son bail)
- DHCPACK (réponse du serveur qui contient des paramètres et l'adresse IP du client)
- DHCPNAK (réponse du serveur pour signaler au client que son bail est échu ou si le client annonce une mauvaise configuration réseau)
- DHCPDECLINE (le client annonce au serveur que l'adresse est déjà utilisée)
- DHCPRELEASE (le client libère son adresse IP)
- DHCPINFORM (le client demande des paramètres locaux, il a déjà son adresse IP)
Attribution d'une adresse DHCP
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 :
- Le client émet un message de demande de bail IP (DHCPDISCOVER) qui est envoyé sous forme d'une diffusion sur le réseau avec adresse IP source 0.0.0.0 et adresse IP destination 255.255.255.255 et adresse MAC.
- Les serveurs DHCP répondent en proposant une adresse IP avec une durée de bail et l'adresse IP du serveur DHCP (DHCOFFER)
- Le client sélectionne la première adresse IP (s'il y a plusieurs serveurs DHCP) reçue et envoie une demande d'utilisation de cette adresse au serveur DHCP (DHCPREQUEST requête en broadcast car DHCPOFFER ne contient par son adresse IP)). Son message envoyé par diffusion comporte l'identification du serveur sélectionné qui est informé que son offre a été retenue ; tous les autres serveurs DHCP retirent leur offre et les adresses proposée redeviennent disponibles.
- Le serveur DHCP accuse réception de la demande et accorde l'adresse en bail (DHCPACK), les autres serveurs retirent leur proposition.
Enfin le client utilise l'adresse pour se connecter au réseau.
Installation et configuration
Installation de DHCP
Installer le service DHCP
$ yum install dhcp
Configuration du serveur DHCP
Le fichier de configuration
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.
Définir un bail
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
Réserver une adresse IP dans la plage
En général, on donne :
- Une adresse de début (la première qui sera attribuée)
- Une adresse de fin (la dernière)
- Une ou plusieurs plages d'adresses à exclure de la location (ceci permet de faire cohabiter un modèle de configuration IP dynamique avec un modèle statique)
- Un masque de sous-réseau
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; } }
Refuser un hôte
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; }
Lancement du service
Une fois la config terminée, on lance notre DHCP:
$ systemctl start dhcpd
Et on ajoute le service au démarrage :
$ systemctl enable dhcpd
Agent de relais DHCP dans un réseau routé
Routeur et agent relais DHCP (RFC 1542)
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.
Rôle de l'agent de relais 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.
- Si le routeur prend en charge la RFC 1542, il peut faire office d'agent de relais DHCP, et ainsi relayer les diffusions de demande d'adresse IP des clients DHCP dans chaque sous-réseau.
- Si le routeur ne prend pas en charge la RFC 1542, une machine serveur peut être configurée comme agent de relais DHCP, il suffira de lui spécifier l'adresse du serveur DHCP. Les demandes des clients DHCP seront relayées vers le serveur DHCP par l'agent de relais DHCP qui transmettra les offres aux clients.
Serveur DHCP et agent de relais ont des adresses ip statiques. Le dialogue traverse le routeur et se fait en unicast.
Dialogue client DHCP, agent de relai DHCPet serveur DHCP
- Après avoir envoyé une trame de broadcast, le client DHCP dialoque avec l'agent de relai DHCP en unicast.
- L'agent demande une adresse au serveur DHCP dont il connaît l'adresse (2)
- Le serveur retourne à l'agent une adresse
- qui est donnée au client DHCP par l'agent
Mise en oeuvre d'un agent de relais
Présentation
Description
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.
Mode de fonctionnement
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).
Installation et configuration
Installer dhcp
$ yum install dhcp
Utilisation de dhcrelay en ligne de commande
dhcrelay [-p port] [-d] [-q] [-i if0 [... -i ifN ] ]server0 [ ...serverN ]
L'agent
- écoute sur toutes les interfaces à moins que certaines soient spécifiées avec l'option -i,
- utilise, comme le protocole Bootp, le port 67 par défaut (voir /etc/services ) modifiable avec l'option -p,
- fonctionne en avant-plan avec l'option -d (option debug), sinon en arrière-plan,
- n'affiche pas les informations de démarrage avec l'option -q,
- utilise les serveurs spécifiés sur la ligne de commande server0, …serveurN.
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
Configuration du daemon dhcrelay
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