02 - DHCP

Introduction

DHCP (Dynamic Host Configuration Protocol)

Il s’agit d’un protocole permettant de configurer les adresses IP de machines sur le réseau.

Il permet de configurer l’adresses IP et de nombreux autres paramètres (masque de réseau, passerelle, DNS …)

Il existe pour IPv4 et IPv6 avec des fonctionnalités légèrement différentes.

Il a d’abord été conçu pour le protocole BootP qui permet à une station de travail sans disque dur de démarrer par le réseau à l’aide du protocole TFTP (Trivial File Transfer Protocol).

Il est maintenant indispensable dans la majorité des entreprises et surtout pour les fournisseurs d’accès.

L’utilisation de DHCP permet d’optimiser la gestion des adresses IP du réseau en ayant moins d’adresses que de clients.

Le protocole

DHCP utilise les ports UDP 67 et UDP 68.

UDP 67 est le port ouvert sur le serveur et UDP 68 est le port ouvert sur le client (pendant la négociation seulement).

Pour fournir une adresse IP à un hôte, quatre messages sont nécessaires:

  • DHCPDISCOVER : du client vers le serveur
  • DHCPOFFER : du serveur vers le client

  • DHCPREQUEST : du client vers le serveur

  • DHCPACK : du serveur vers le client

DHCP DISCOVER

Envoyé par le client.

L’adresse IP source est 0.0.0.0 (le client n’a pas d’adresse IP à ce stade)

L’adresse IP de destination est 255.255.255.255 (l’adresse IP du serveur est inconnue)

Le paquet est identifié comme DHCPDISCOVER

L’adresse MAC du client est présente pour identifier la réponse et pour que le serveur associe le client à l’adresse IP.

Il s’agit ici de broadcast.

DHCP OFFER

Envoyé par le serveur.

L’adresse IP source est l’adresse du serveur DHCP.

L’adresse IP de destination est 255.255.255.255 (le client n’a pas encore d’adresse IP).

Le paquet est identifié comme un DHCPOFFER.

Il contient l’adresse IP que le serveur propose au client.

Il contient l’adresse MAC du client pour que tous les clients sachent à qui est destiné le paquet.

Il s’agit donc ici d’unicast.

Il contient aussi les options DHCP comme le masque, la passerelle, les serveurs DNS…

DHCP REQUEST

Envoyé par le client.

L’adresse IP source est 0.0.0.0

L’adresse IP de destination est 255.255.255.255. Il s’agit ici de broadcast car plusieurs serveur DHCP ont peut-être répondu au client. De cette façon, ils sont informés du serveur qui a été retenu par le client et peuvent libéré l’adresse qui avait été offerte.

Le paquet est identifié comme un DHCPREQUEST.

Il contient l’adresse IP que le client accepte.

DHCP ACK

Envoyé par le serveur.

L’adresse source est l’adresse IP du serveur.

L’adresse de destination est 255.255.255.255.

À partir de ce moment là, le client peut utiliser l’adresse IP.

Le paquet est identifié comme un DHCPACK.

Il contient aussi toutes les options offertes au client.

Il contient l’adresse MAC du client pour que les clients sachent à qui est adressé le paquet.

Les baux d’adresses

Une adresse IP est allouée à un client pour une durée déterminée, ce n’est pas permanent.

À la fin du bail (plus une période de grâce), si l’adresse n’est pas réclamée par le client (il est éteint par exemple), l’adresse sera libérée et pourra être attribuée à un autre client.

La durée du baill varie selon les besoins de l’organisation.

Un bail trop long immobilise des adresses IP inutilement.

Un bail trop court génère du trafic réseau inutile et de la charge sur les serveurs DHCP.

Les durées classiques varient entre 24h et une semaine (mais d’autres peuvent être configurées).

Un client qui reste connecté en permanence conservera la même adresse IP grâce au renouvellement de bail.

Un hôte essaye de conserver la même adresse.

Pour ceci, à la moitié du bail, il essaye de la renouveler.

S’il n’obtient pas de réponse, il essayera à 75% du bail, puis à 87.5%.

S’il n’obtient toujours pas de réponse, il essayera tout le processus pour trouver un nouveau serveur DHCP.

Pour renouveler son bail, un hôte envoie directement le DHCPREQUEST et si tout va bien, le serveur lui renvoie un DHCPACK sinon un DHCPNACK, dans ce cas le client devra recommencer tout le processus.

Les commandes client

Du côté du client, il est possible de renouveler une adresse IP à l’aide de:

$ dhclient [interface]

Il est possible de libérer une adresse IP à l’aide de:

$ dhclient -r [interface]

Étendue DHCP

Une étendue DHCP est un groupe d’adresses distribué par le serveur DHCP et ayant les mêmes options.

C’est la première chose à configurer.

On définit quelles sont les adresses IP de l’étendue puis on ajoute les différentes options à l’étendue: masque, passerelle, DNS, WINS, NTP…

Un étendue est composée d’une plage d’adresses IP que le serveur peut attribuer aux clients.

Exemple: 10.2.2.1 à 10.2.2.35.

Il est possible de définir des plages d’exclusion dans une étendue, ces adresses ne seront pas attribuées par le serveur.

À noter que l’adresse IP du serveur doit être fixe, ne doit pas faire partie de la plage d’adresses disponibles pour le serveur et doit se trouver dans le même réseau que la plage d’adresses car le protocole DHCP communique avec 255.255.255.255 qui ne passe pas les routeurs.

Options désignation
routers Liste des adresses IPv4 des routeurs préférés situés dans le même LAN que le client
range Indique l’intervalle des adresses IP qui sera réellement fournit par le serveur DHCP.
domain-name-servers Liste des serveurs DNS capable de résoudre les noms d’hôte de domaine. (dans un environnement de test, on peut utiliser par exemple le DNS de Google 8.8.8.8 et/ou 8.8.4.4)
domain-name Spécifie le nom de domaine que le client doit utiliser pour résoudre un nom qualifié de domaine DNS.
broadcast-address Indique l’adresse de diffusion du réseau
default-lease-time Spécifie la durée par défaut du bail, cette durée est exprimée en seconde.
max-lease-time Temps C’est la durée maximale d’allocation autorisée par le serveur. Si un client demande un bail plus long, le bail sera accordé mais il ne sera valide que durant Temps secondes.
netbios-name-servers Cette option permet d’indiquer aux clients Windows l’adresse du serveur WINS pour la résolution de nom.

Mise en place du lab

Le lab consiste à installer un serveur DHCP ayant trois interfaces réseau:

  • Une en NAT

  • Une dans le 192.168.10.0/24 (Lan Segment)

  • Une dans le 10.10.10.0/24 (Lan Segment)

Pensez à donner une adresse IP fixe aux deux interfaces du serveur DHCP qui ne sont pas en NAT.

Pour créer les fichiers des interfaces réseau que vous venez d'ajouter, éditez le fichier de chacune des interfaces /etc/sysconfig/network-scripts/ifcfg-<interface> puis collez la configuration ci-dessous en adaptant les paramètres à votre situation :
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
IPADDR=a.b.c.d
PREFIX=24
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
NAME=nom_interface
DEVICE=nom_interface
ONBOOT=yes

Vous placerez une machine Linux dans le réseau 192.168.10.0/24 et une machine Windows dans le 10.10.10.0/24.

Ces deux machines seront les clients DHCP.

Installation du serveur DHCP:

$ dnf -y install dhcp-server

Éditer le fichier /etc/dhcp/dhcpd.conf.

Créez votre subnet pour le réseau 192.168.10/24:

option domain-name "dom.com";
option domain-name-servers ns1.example.org, ns2.example.org;

default-lease-time 600;
max-lease-time 7200;

log-facility local7;

subnet 192.168.10.0 netmask 255.255.255.0 {
  range 192.168.10.2 192.168.10.254;
  option domain-name-servers 8.8.8.8;
  option domain-name "internal.example.org";
  option routers 192.168.10.1;
  option broadcast-address 192.168.10.255;
  default-lease-time 600;
  max-lease-time 7200;
}

Pour la deuxième étendue, la placer à la fin du fichier dhcpd.conf.

Pour démarrer le service DHCP :

# systemctl start dhcpd

Laboratoire

Créez maintenant l’étendue pour l’autre interface réseau (10.10.10.0/24).

Assurez-vous que les baux pour cette étendue soit d’une durée d’une semaine.

Le serveur DNS distribué doit être celui du cégep.

Démarrez les machines clientes et assurez-vous qu’elles obtiennent les bonnes adresses IP, masque de réseau et passerelle par défaut.

Vous pouvez voir les adresses attribuées (les leases) dans le fichier:

/var/lib/dhcpd/dhcpd.leases

Écoutez DHCP sur l’une des interfaces et regardez les paquets échangés.

$ tcpdump -i <interface> -pvn port 67 and port 68

Pouvez-vous voir les paquets DISCOVER, OFFER, REQUEST et ACK?

Les exclusions

Il est possible de vouloir que certaines adresses IP ne soient pas distribuées par DHCP dans une plage d’adresses IP.

Par exemple, vos serveurs occupent les adresses 100 à 150 dans la plage d’adresses.

Ou bien ces adresses ont été réservées pour un autre usage.

On parle de plage d’exclusion.

Certaines applications DHCP permettent de configurer des plages d’exclusion spécifiquement.

Avec le DHCP ISC, on choisira plutôt de configurer plusieurs plages d’adresses non consécutives qui ne recouvrent pas les adresses à exclure.

Exemple: pour exclure la plage 100 à 150 dans le réseau 192.168.1.0/24.

subnet 192.168.10.0 netmask 255.255.255.0 {
  range 192.168.10.2 192.168.10.99;
  range 192.168.10.151 192.168.10.254;
  option domain-name-servers 8.8.8.8;
  option domain-name "internal.example.org";
  option routers 192.168.10.1;
  option broadcast-address 192.168.10.255;
  default-lease-time 600;
  max-lease-time 7200;
}

Les réservations d’adresse IP

Il est possible que vous souhaitiez qu’une machine obtienne toujours la même adresse IP sur votre réseau (la machine peut agir comme serveur ou bien avoir des droits particuliers basés sur l’adresse IP…).

Si cette machine est un laptop par exemple, elle peut avoir besoin de se connecter sur d’autres réseaux et utiliser le DHCP.

Si vous ne voulez pas avoir à changer la configuration IP manuellement à chaque fois que vous changez de réseau, vous pouvez configurer une réservation d’adresse.

La réservation d’adresse se base sur l’adresse MAC du client.

Vous devez configurer une correspondance permanente entre une adresse MAC et une adresse IP.

Pour spécifier une réservation d’adresse, vous aurez besoin de 3 éléments:

  • Un nom pour la réservation

  • L’adresse MAC du client

  • L’adresse IP que vous lui attribuez

host fixedappliance {
  hardware ethernet 00:0c:29:6c:ef:2e;
  fixed-address 10.10.10.14;
}

Laboratoire

Notez l’adresse IP de votre client DHCP Linux.

Excluez cette adresse du DHCP.

Libérez l’adresse actuelle et demandez en une nouvelle.

Assurez-vous que vous obtenez une adresse différente qui n’Est pas dans la plage d’exclusion.

Maintenant, créez une réservation d’adresse pour votre client (prenez une adresse IP différente de celle qui lui a été attribuée).

Libérez l’adresse actuelle et demandez en une nouvelle.

Assurez-vous que le client a obtenu l’adresse IP que vous lui aviez réservé.

Le relais DHCP

Comme nous l’avons vu, un serveur DHCP ne peut fournir des adresses que dans un réseau pour lequel il dispose d’une interface à cuse des échanges en broadcast qui ne passent pas les routeurs.

Pour remédier à cela, il est possible d’utiliser un relais DHCP.

Le relais DHCP sera capable d’accepter les paquets DHCP en broadcast venant du client et de répondre au client.

Il communiquera ensuite avec le serveur DHCP en unicast.

Le client envoie ses communications comme d’habitude.

La suite représente les messages envoyés et reçus par le client.

DHCPDISCOVER

Il est envoyé en broadcast comme d’habitude.

DD1

Et les reçoit comme d’habitude.

DHCPOFFER

Notez la présence du paramètre GIADDR le qui identifie le routeur par lequel le message DHCP sera relayé au serveur DHCP.

C’est ce paramètre qui indique au serveur dans quelle plage d’adresse IP il doit choisir une adresse IP pour le client.

DO1

DHCPREQUEST

Notez que le serveur est toujours identifié comme étant le réel serveur DHCP.

DR1

DHCPACK

DA1

Du côté du serveur DHCP

DHCPDISCOVER

Notez que les communications ont lieu en unicast.

L’adresse du routeur est ajoutée tout de suite pour que le serveur DHCP sache dans quelle plage d’adresse il doit chercher.

DD2

DHCPOFFER

Toujours en unicast entre le serveur DHCP et le relais DHCP.

DO2

DHCPREQUEST

DR2

DHCPACK

DA2

Configuration du relais

Il n’y a rien à faire de particulier sur le serveur DHCP, seulement créer la plage d’adresse qui sera utilisée par les clients distants.

Sur le relais

Sur le relais, il faut activer le routage des paquets:

$ sysctl -w net.ipv4.ip_forward=1

Ensuite il faut configurer le relais en lui donnant simplement l’adresse IP du serveur DHCP:

$ dhcrelay [ip dhcp]

Sur le serveur

Configurez l’étendue pour laquelle vous souhaitez distribuer des adresses.

Ajoutez une déclaration de subnet pour l’interface sur laquelle arriveront les paquets du relais.

Ajoutez une route vers le réseau du client

Sur le client

Le client peut maintenant obtenir une adresse IP dans un autre réseau.

Optionnel sur le relais

Pour configurer le relais comme un service, copiez le fichier de configuration dans le bon répertoire:

$ cp /lib/systemd/system/dhcrelay.service /etc/systemd/system/

Modifiez le fichier à la ligne ExecStart pour ajouter l’adresse IP du serveur DHCP:

ExecStart=/usr/sbin/dhcrelay -d --no-pid <ip serveur DHCP>

Rechargez le service:

$ systemctl --system daemon-reload
$ systemctl restart dhcrelay

Laboratoire

Configurez un relais DHCP pour que le serveur DHCP puisse distribuer 172.16.78.0/24 à travers un relais DHCP.

Testez avec un client.

Configurez le relais comme un service.

Ajoutez une nouvelle plage d’adresses IP au serveur DHCP. Assurez-vous qu’aucune adresse de cette nouvelle plage n’est donnée aux clients.

Comment ferez-vous ça?

relais