DHCPv4

De Justine's wiki
Aller à la navigation Aller à la recherche

Introduction

Dynamic Host Configuration Protocol.

DHCP est avant tout un protocole réseau, qui a pour but de fournir une configuration réseau complète à un poste sans intervention humaine. Cela peut être une configuration minimale nécessaire:

  • Adresse IP
  • Masque de sous-réseau
  • Passerelle
  • Résolveur DNS
  • Nom de domaine local

D'autres informations sont possibles :

  • Serveur(s) NTP
  • Nom de réseau NetBios
  • Serveur NetBios
  • Le MTU
  • Les routes statiques
  • Le Proxy

L'intérêt, c'est de ne pas avoir à rentrer manuellement des configurations sur des centaines de machines; on peut gérer efficacement les adresses IP, les départs et les pannes, les mises à jour DNS... DHCP évite la mise en place de processus lourds pour la configuration du réseau.

Fonctionnement du protocole

Nous allons voir le protocole et ce qu'il se passe lors de la première allocation  : le processus d'initialisation. Nous avons un client et un serveur DHCP, et le client ne connnaît pas le réseau auquel il se connecte et a besoin d'informations. Il va pour cela générer une trame DHCPDISCOVER:

  • Elle est envoyée en broadcast, mon client n'ayant pas d'adresse, avec l'adresse MAC de braodcast
  • Il ne connait pas le serveur DHCP et doit découvrir le réseau.
  • L'adresse IPv4 source est inconnue et sera donc 0.0.0.0
  • L'adresse de dest en broadcast : 255.255.255.255
  • On est en UDP; le port src est 68 et dst 67.
  • Les options DHCP remplies par le client sont
    • Client IP Address : 0.0.0.0
    • Your (Client) IP address, l'adresse IP offerte par le serveur : 0.0.0.0
    • Client MAC address : @MAC client

LE serveur va faire une offre sous forme de DHCPOFFER:

  • Elle part de l'adresse MAC du serveur  à l'adresse MAC du client
  • Il saisit les adresse IPv4 source et destination (qui est l'adresse offerte). Le client ne traitera pas cette adresse de dst.
  • Il va ressaisir l'offre au client dans les informations au client, ainsi que les options : son IP, la passerelle, le masque, le nom de domaine et le serveur DNS, etc. Le client déduira son propre FQDN.

Le client répond par un DHCPREQUEST, pour l'instant il ne s'autoconfigure pas.

  • En broadcast : ff:ff:ff:ff:ff:ff et 255.255.255.255
  • C'est une demande de confirmation
  • Il va répéter des informations reçues lors du DHCPDISCOVER : l'IP offerte, l'IP du DHCP, et son hostname à lui.
  • Le hostname serve à ce que le serveur DHCP informe le serveur DNS pour que celui-ci en tienne compte.

On aura alors la première allocation, si le serveur DHCP est d'accord il envoie un DHCPACK:

  • Envoyé en unicast au client
  • Il rappelle les adresses MAC et IPv4
  • Il répète l'adresse offerte et les autres infos fournies.

Le client a cette adresse et peut relâcher cette IP en cas de besoin (un arrêt propre : extinction de la machine). Le pool DHCP étant limité, le serveur peut réutiliser l'adresse. C'est assez peu fait parce que ce n'est pas obligatoire. Cela se fait par l'envoi de la part d'un client d'un DHCPRELEASE :

  • Envoyé au serv qui a fourni l'adresse
  • L'adressage reste celui en place
  • Client IP Address contient l'adresse IPv4 actuelle du client, qui a été fournie par le serveur DHCP
  • Your (Client) IP Address sera à 0.0.0.0, puisque le serveur n'est pas en train de fournir une adresse.

Quand un poste plante, il ne peut pas rendre l'adresse. Il la relâchera à la fin du bail prévu initialement. Sa durée est contenue dans l'option "IP Address Lease", qui est une durée pendant laquelle le client peut utiliser l'adresse. Cette option est appellée T1. Le client va générer T3 et T2:

  • T3<T2<T1
  • Généralement : T2 = 0.85 * T1 et T3 = 0.5*T1
  • Avec un bail de 10 minutes obtenue à T0 :
    • T1 = 10 mn
    • T2 = 8,5 mn
    • T3 = 5 mn
    • Le client va demande une prolongation de bail avant la fin des 10 minutes : à T0 + T3 (soit T0 + 5 minutes). Elle est sous forme de DHCPREQUEST envoyée directement au serveur DHCP; l'IP reçue à T0 est toujours valide, on demande juste à l'utiliser plus longtemps.
    • Le "Client IP Address" sera l'IP actuellement utilisée
    • Le "Your (Client) IP Address" sera à 0.0.0.0, pour la même raison qu'auparavant.
    • On aura l'option "Option-dhcp-Requested-IP-Addr" contenant l'IP dont on demande le renouvellement, cela indique que l'on est sur un renouvellement de bail.
    • Le serveur répondra par un DHCPACK si il est d'accord.
    • Si le client n'as pas de réponse, il attend T2 et renvoie un DHCPREQUEST, mais ce coup-ci en broadcast : Peut-être que le serveur DHCP original est down, alors on essaye de parler à un autre serveur.
    • Si pas de réponse, le bail finira par expirer. L'adresse sera relâchée et on revient à l'état non configuré avec du DHCPDISCOVER
    • Le serveur DHCP peut renouveler aussi de lui-même les bails, avec un DHCPNACK envoyé directement au client. Si il n'obtient pas de réponse, il libère l'adresse; mais si il reçoit un DHCPREQUEST de la part du client, le bail est renouvelé.

Un exemple de fichier dhcpd.conf très complet

authoritative;
default-lease-time 3600;
max-lease-time 7200;
log-facility local7;
allow unknown-clients;

mes-options=option vendor-class-identifier;

class "MAC1" {
    match if substring(hardware,0,2) = 00:01:02;
        }
    
class "MAC2" {
match if (binary-to-ascii (16,8,":",substring(hardware,0,3))="01:03:04")
or (binary-to-ascii (16,8,":",substring(hardware,0,3))="01:03:05")
or (binary-to-ascii (16,8,":",substring(hardware,0,3))="01:03:06");
log (info, (binary-to-ascii (16,8,":",substring(hardware,0,3))));
        }

class "MAC3" {
match if not (binary-to-ascii (16,8,":",substring(hardware,0,3))="01:03:04")
and not (binary-to-ascii (16,8,":",substring(hardware,0,3))="01:03:05")
and not (binary-to-ascii (16,8,":",substring(hardware,0,3))="01:03:06");
log (info, (binary-to-ascii (16,8,":",substring(hardware,0,3))));
        }

class "marque1" {  
match if substring(option user-class,1,7)="marque1"; }

class "marque2" {  
match if substring(option user-class,1,7)="marque2"; }

class "MSFT" {
match if substring(option vendor-class-identifier,0,4)="MSFT";
        }

class "LINUX" {
match if substring(option vendor-class-identifier,0,5)="udhcp";
        }

subnet 172.30.0.0 netmask 255.255.0.0 {
    pool { allow members of "marque1";
    deny members of "MSFT";
    deny members of "LINUX";
    deny members of "MAC1";
    deny members of "MAC2";
     deny members of "MAC3";
     deny members of "marque2";
     range 172.30.60.1 172.30.60.10; }

    pool { allow members of "marque2";
    deny members of "MSFT";
    deny members of "LINUX";
    deny members of "MAC1";
    deny members of "MAC2";
     deny members of "MAC3";
     deny members of "marque1";
     range 172.30.70.1 172.30.70.10; }

    pool { deny members of "MSFT";
    deny members of "LINUX";
    deny members of "MAC1";
    deny members of "MAC2";
     deny members of "MAC3";
    range 172.30.100.1 172.30.100.10; }
        option domain-name-servers 172.30.0.254, 8.8.8.8;
         option domain-name "labo.local";
         option routers 172.30.0.254;

    pool { allow members of "MSFT";  range 172.30.10.1 172.30.10.10; }
    pool { allow members of "LINUX"; range 172.30.20.1 172.30.20.10; }
    pool { allow members of "MAC1";  range 172.30.30.1 172.30.30.10; }
    pool { allow members of "MAC2";  range 172.30.40.1 172.30.40.10; }
    pool { allow members of "MAC3";  range 172.30.50.1 172.30.50.10; }
                    }