====== MONTER UN SERVEUR DHCP ====== ===== LE PROTOCOLE DHCP ===== **DHCP** (**D**ynamic **H**ost **C**onfiguration **P**rotocol) est un protocole client-serveur qui a pour objet d’affecter automatiquement une adresse IP ainsi que des paramètres fonctionnels aux hôtes du réseau. Il est exploité par tout équipement qui ne peut pas être configuré de façon statique par un administrateur réseau. ===== FONCTIONNEMENT ===== * **Découverte d’un serveur :** les clients DHCP font une requête sur le réseau dans l’espoir de trouver un serveur DHCP (une bouteille à la mer!). Cette requête initiale ne peut être qu’un broadcast : la station à l’origine de la requête ne connaît même pas sa propre adresse, il est donc peu probable qu’elle connaisse par avance l’adresse d’un serveur DHCP. Les paquets envoyés pour la découverte portent le nom normalisé de DHCPDISCOVER. * **Première réponse du serveur ;** si un serveur DHCP présent sur le réseau entend la requête d’un client, il lui fera une proposition d’adresse et de paramètres réseau. Comme le client auquel le serveur d’adresse répond n’a pas encore d’adresse IP, cette réponse se fera également sous forme de broadcast. Les paquets envoyés pour la réponse du serveur portent le nom normalisé de DHCPOFFER. *** Acceptation de l’offre :** le client DHCP satisfait de l’offre qui lui a été faite, va l’accepter. À ce stade, cette réponse pourrait être envisagée en unicast puisque le client a déjà une proposition d’adresse IP et connaît celle du serveur. Toutefois, cet échange se fera encore en broadcast. En effet : si un deuxième serveur DHCP est en concurrence avec le premier pour fournir une adresse, ce broadcast d’acceptation envoyé à un autre serveur mais reçu par les deux prétendants fait office de fin de non-recevoir pour le serveur non choisi. Les paquets envoyés pour l’acceptation de l’offre du serveur portent le nom normalisé de DHCPREQUEST.  * **Accusé de réception du serveur :** enfin, le serveur prend acte de l’affectation de l’adresse, et clos la transaction par un accusé de réception. Le serveur profite de ce dernier échange pour annoncer la durée de l’allocation de l’adresse. On appelle cette durée le bail DHCP, et sa durée varie selon la configuration du serveur entre quelques heures et quelques jours. Les paquets envoyés pour accusé de réception portent le nom normalisé de DHCPACK. ===== LE SERVICE DHCP SUR LES SYSTÈMES LINUX ===== Le service est lancé par un script normalisé dans /etc/init.d. Son nom varie selon les distributions et implémentations. {{:si5:screenshot_from_2014-01-02_17_29_40.png|}} ===== CONFIGURATION DU SERVEUR ===== L’essentiel de la configuration d’un serveur DHCP se trouve dans le fichier : /etc/.../dhcpd.conf On y trouvera les directives de fonctionnement, les options générales du serveur, et la déclaration des ressources à allouer. Chacune des lignes de paramètres devra se terminer par un point-virgule. ==== directives principales de comportement du serveur dans dhcpd.conf ==== default-lease-time durée;   authoritative;   log-facility cible; ^dhcpd.conf : comportement du serveur^^ |default-lease-time "durée"|Indique la durée du bail DHCP en secondes.| |authoritative|Facultatif. Un client qui demande le renouvellement d’une adresse hors plage doit y renoncer.| |log-facility cible|Gestion des journaux : renvoie les événements vers le "facility" cible du serveur syslog.| ==== Les paramètres transmis aux clients ==== On peut dans le fichier de configuration définir des paramètres fonctionnels qui seront transmis aux clients. Ces paramètres sont annoncés par la directive option. **Déclaration d’options dans le fichier dhcpd.conf** option domain-name suffixe;  option domain-name-servers serveurs_dns;  option nis-domain domaine_nis;  option nis-servers serveurs-nis; ^dhcpd.conf : déclaration d’options^^ |suffixe|Suffixe DNS pour les clients.| |serveur_dns|Serveur DNS utilisé par les clients. Si plusieurs serveurs doivent être proposés, les valeurs sont séparées par des virgules.| |domaine_nis|En voie de raréfaction. Domaine NIS pour les clients.| |serveurs_nis|En voie de raréfaction. Serveur NIS utilisé par les clients. Si plusieurs serveurs doivent être proposés, les valeurs sont séparées par des virgules.| ==== déclaration de plages d’adresses ==== Les adresses à allouer sont définies dans une ou plusieurs sections subnet du fichier dhcpd.conf. Au sein de ces sections, on trouvera en plus des plages d’adresses les options DHCP qui seront envoyées avec les propositions d’adresses. Les options les plus courantes sont la passerelle par défaut à utiliser avec l’adresse proposée, ainsi que les serveurs DNS à utiliser. Les options peuvent être déclarées en dehors ou au sein des sections subnet, elles concerneront alors selon le cas l’ensemble des adresses allouées ou seulement celles du sous-réseau. En cas de conflit entre options (la même option est déclarée dans la configuration générale et dans la section subnet), c’est l’option du subnet qui prévaut. **Déclaration de subnet dans le fichier dhcpd.conf** subnet reseau netmask masque {   range debut fin;   option routers routeur;  } ^dhcpd.conf : déclaration de subnet^^ |reseau|L’adresse de réseau dans lequel se trouveront les adresses à attribuer.| |masque|Masque associé au réseau géré.| |debut|Définition de la plage des adresses qui seront proposées aux clients. La première adresse de la plage.| |fin|Définition de la plage des adresses qui seront proposées aux clients. La dernière adresse de la plage.| |routeur|La passerelle par défaut associée aux adresses proposées.| ==== paramètres spécifiques à une machine ==== Il est possible d’affecter spécifiquement à une machine des options particulières. Cette machine fera alors l’objet d’une déclaration particulière avec la directive host, un peu comme on configurerait un subnet à une seule adresse. On pourra utiliser cette méthode pour affecter spécifiquement à un hôte du réseau une adresse IP fixe pour une machine qui, bien que client DHCP, devrait systématiquement utiliser la même adresse. On peut par exemple imaginer une imprimante réseau dont l’interface de configuration peu confortable encourage à la laisser en configuration dynamique, et pour laquelle la réservation dhcp garantirait l’attribution de l’adresse voulue. **Réservation d’adresse dans dhcpd.conf** host machine {   hardware ethernet adresse_mac;   fixed-address adresse_ip;   option routers routeur;   option domain-name suffixe;   option domain-name-servers serveur_dns;  } ^dhcpd.conf : configuration d’hôte^^ |machine|Déclaration de paramètres pour un hôte. Si l’identification par adresse mac est utilisée, le nom machine est sans importance.| |adresse_mac|L’adresse MAC de l’hôte à configurer.| |adresse_ip|Adresse IP de l’hôte en cours de configuration.| ==== serveur à plusieurs interfaces ==== Les serveurs DHCP possédant plusieurs interfaces réseau doivent restreindre leurs communications aux seules cartes compétentes. Par exemple, si un serveur possède une interface configurée en 10.11.12.1 et une autre en 192.168.200.1, et qu’il propose des adresses dans le subnet 192.168.200.0, il est évident qu’il ne doit écouter les requêtes et proposer des adresses que sur l’interface correspondante (192.168.200.1). Pour que le serveur écoute sur certaines interfaces, il faut spécifier ces interfaces dans /etc/default/dhcp3-server en rajoutant la ligne : INTERFACES="eth0 eth1" Dans ce cas l'écoute se fait sur eth0 et eth1. ==== visualisation des baux dhcp ==== Le serveur DHCP conserve une information sur chacun des baux alloués dans un fichier dhcpd.leases se trouvant dans le répertoire /var/lib/dhcp/. Ce fichier est accessible à la consultation mais ne devrait pas être modifié. **Exemple de fichier dhcpd.leases** Notez les horaires de renouvellement et d’expiration du bail DHCP. lease {    interface "eth0";    fixed-address 192.168.1.51;    option subnet-mask 255.255.255.0;    option routers 192.168.1.254;    option dhcp-lease-time 864000;    option dhcp-message-type 5;    option domain-name-servers 194.2.0.20,194.2.0.50;    option dhcp-server-identifier 192.168.1.1;    renew 6 2010/07/10 14:55:34;    rebind 3 2010/07/14 14:33:58;    expire 4 2010/07/15 20:33:58;   } ===== CONFIGURATION DES CLIENTS ===== La commande **dhclient** permet aux stations clientes d’effectuer les requêtes DHCP. Si la commande n’est pas lancée manuellement par un administrateur, elle est appelée par les scripts d’initialisation réseau. Si la station client ne possède pas d’adresse IP, elle effectue toutes les étapes de la procédure de requête DHCP. Dans le cas contraire, elle demande au serveur un renouvellement de bail. dhclient peut également être utilisée pour libérer une adresse affectée précédemment par un serveur DHCP. **Exemple d’utilisation de dhclient pour requérir une adresse** Notez les étapes de l’affectation d’adresse DHCPDISCOVER, DHCPOFFER, DHCPREQUEST et DHCPACK. root@serveur# dhclient eth1  Internet Systems Consortium DHCP Client V3.1.3   Copyright 2004-2009 Internet Systems Consortium.   All rights reserved.   For info, please visit https://www.isc.org/software/dhcp/     Listening on LPF/eth1/00:22:68:98:8a:da   Sending on   LPF/eth1/00:22:68:98:8a:da   Sending on   Socket/fallback   DHCPDISCOVER on eth1 to 255.255.255.255 port 67 interval 8   DHCPOFFER of 172.18.142.243 from 172.18.142.225   DHCPREQUEST of 172.18.142.243 on eth1 to 255.255.255.255 port 67   DHCPACK of 172.18.142.243 from 172.18.142.225   bound to 172.18.142.243 -- renewal in 49 seconds.   root@serveur# **Exemple de libération d’adresse IP** On constate un paquet DHCPRELEASE envoyé à l’exécution de la commande.  root@serveur# dhclient -r eth1  There is already a pid file /var/run/dhclient.pid with pid 2735   killed old client process, removed PID file   Internet Systems Consortium DHCP Client V3.1.3   Copyright 2004-2009 Internet Systems Consortium.   All rights reserved.   For info, please visit https://www.isc.org/software/dhcp/     Listening on LPF/eth1/00:22:68:98:8a:da   Sending on   LPF/eth1/00:22:68:98:8a:da   Sending on   Socket/fallback   DHCPRELEASE on eth1 to 172.18.142.225 port 67   root@serveur# ===== LES AGENTS RELAIS DHCP ===== Les échanges DHCP se faisant par broadcast et les broadcasts ne passant pas les routeurs, les requêtes DHCP comme les réponses des serveurs n’ont aucune action en dehors du réseau local. La solution simple consiste évidemment à mettre un serveur DHCP sur chacun des segments où ils sont nécessaires. Toutefois, si on ne souhaite utiliser qu’un seul serveur pour plusieurs réseaux, il existe une solution : **les agents relais DHCP**. ==== principe de fonctionnement ==== L’intégralité de la configuration DHCP, comprenant la déclaration de tous les subnets et toutes les plages d’adresses, locaux ou distant, se trouvera sur un serveur DHCP unique. Une partie des clients en revanche se trouvera sur un segment ethernet différent. Pour que les communications puissent s’établir entre les clients distants et le serveur, l’agent relais DHCP qui se trouvera lui aussi sur le segment devra traiter les broadcasts reçus, et relayer la requête sous forme d’unicast vers le serveur DHCP. Les unicasts pouvant passer les routeurs, l’information arrivera à bon port. Le serveur DHCP répondra alors sous forme d’unicast à destination de l’agent relais, et l’agent relais enverra un broadcast qui sera récupéré par la station cliente. Le client DHCP n’a pas conscience de traiter avec un agent relais, mais pense qu’un serveur DHCP réel est présent sur son segment. {{:si5:screenshot_from_2014-01-02_17_55_43.png|}} ==== configuration de l’agent de relais ==== L’agent de relais est lancé de façon interactive par la commande dhcrelay. Sur la plupart des distributions, cette commande est appelée depuis un script de lancement de service, et ses paramètres de fonctionnement sont lus dans un fichier de configuration. **Syntaxe de la commande dhcrelay** dhcrelay -i interface adresse_serveur ^dhcrelay : options et paramètres^^ |-i interface|Facultatif. Spécifie l’interface par laquelle l’agent de relais sera à l’écoute du serveur DHCP et des requêtes des clients.| |adresse_serveur|L’adresse IP du serveur auquel transmettre les requêtes DHCP.|