Bonjour à tous, dans cet article, nous allons voir comment mettre en place un serveur DHCP sous Linux. Dans un réseau, DHCP est essentiel, car il permet d'attribuer automatiquement des configurations réseaux aux appareils connectés à notre réseau. Avant de commencer l'installation et la configuration, je vais revenir sur ce qu'est DHCP.

DHCP c'est quoi ?

DHCP (Dynamic Host Configuration Protocol) est un protocole qui permet d'attribuer automatiquement une configuration réseau à une machine sur un réseau. Ce dernier permet de fournir à minima une adresse IP et le masque de sous-réseau. Il peut aussi indiquer d'autres paramètres à la machine, notamment la passerelle par défaut, le nom de domaine ou encore les serveurs DNS.

L'avantage de DHCP est qu'il permet d'automatiser la distribution des configurations réseau, ce qui évite d'intervenir sur chaque machine individuellement. De plus, il dispose d'un pool d'adresse qu'il peut distribuer. Il évite aussi les conflits d'adresse (1 machine = 1 adresse). Le serveur DHCP attribut les adresses IP pendant une durée fixe, on parle ici du bail DHCP. Cela permet de libérer les adresses IP attribuées à des machines qui serait par exemple éteinte depuis plusieurs jours.

Le protocole DHCP est basé sur un modèle client / serveur. Il faut donc un serveur qui va centraliser toutes les demandes et configuration.

Client DHCP : machine qui utilise le protocole DHCP pour obtenir sa configuration réseau, il écoute sur le port 68.
Serveur DHCP : hôte qui renvoie la configuration réseau aux clients DHCP, il écoute sur le port 67.

Pour échanger ensemble le client et le serveur utilise le protocole de transport UDP, qui permet de délivrer les configurations plus rapidement, car ce dernier est plus léger et ne comporte pas de vérification de bonne réception des informations. L'échange DHCP est plutôt simple, il est composé de 4 étapes. Voici un petit schéma pour illustrer cela :

Schéma Echange DHCP

Détaillons rapidement ce schéma :

  1. Le client DHCP diffuse sur tout le sous-réseau (broadcast) grâce à l'adresse 255.255.255.255 une requête DHCP DISCOVER sur le port 67. L'objectif ici est de trouver un serveur DHCP.
  2. Le serveur DHCP qui écoute sur le port 67 va renvoyer au client sur le port 68 une proposition de configuration réseau (DHCP OFFER).
  3. Le client va renvoyer une requête (DHCP REQUEST) où il va indiquer l'IP choisi au serveur.
  4. Le serveur valide au client la configuration avec un DHCP ACK.

Dans certains cas, le serveur DHCP, ne se trouve pas sur le même sous-réseau. On utilise alors des relais DHCP, qui ont pour rôle de transmettre les requêtes au serveur DHCP. Il est aussi possible d'avoir plusieurs serveurs DHCP qui répondent à un même client, dans ce cas le client choisira la première configuration qu'il a reçu.

Maintenant que vous avez découvert le fonctionnement de DHCP ou que cela vous a rafraichi la mémoire. On va passer à l'installation.

Installation de kea-dhcp

Dans cet article, je ne vais aborder que l'installation d'un serveur DHCP pour l'IPv4.

L'installation du serveur DHCP dans cet article est sur une machine Debian, mais elle est similaire sur les autres distributions basées sur Debian.
J'ai choisi le serveur kea-dhcp qui est l'un des plus connus. Il est aussi le successeur de ISC-DHCP qui était jusqu'en 2022 le serveur DHCP historique sous Linux.

La configuration de kea dhcp s'appuie sur des fichiers JSON. Kea DHCP est aussi capable d'utiliser une base de données comme MySQL ou PostgreSQL pour stocker les données. Dans cet article, je vais réaliser une configuration standard, qui est basée sur la mémoire et un fichier CSV pour le stockage des données.

Si vous souhaitez plus d'informations voici la doc de kea dhcp

Installation

Commençons par mettre à jour le cache des paquets sur notre serveur Linux.

apt update

Une fois le cache des paquets à jours, installons kea-dhcp pour IPv4.

apt install kea-dhcp4-server

Lorsque l'installation est terminée, le service kea-dhcp4-server va démarrer automatiquement. Vous pouvez le vérifier avec la commande suivante.

systemctl status kea-dhcp4-server

Vous devriez avoir le résultat suivant vous indiquant que le service est bien actif.
Statut service kea-dhcp

Configuration

La configuration par défaut de kea-dhcp se trouve dans /etc/kea. Vous y trouverez un fichier kea-dhcp4.conf qui contient la configuration par défaut.
Afin de commencer créer notre propre configuration, nous allons renommer le fichier kea-dhcp4.conf, afin de conserver la configuration d'origine (ça peut toujours servir).

mv /etc/kea/kea-dhcp4.conf /etc/kea/kea-dhcp4.conf.bak

Nous allons maintenant créer notre configuration.

nano /etc/kea/kea-dhcp4.conf

On va pouvoir commencer à écrire notre config DHCP, l'objectif ici est que notre serveur DHCP délivre des adresses IP sur un sous-réseau en 192.168.10.0/24. On va aussi faire en sorte que notre serveur DHCP indique les DNS à utiliser, la passerelle par défaut et le domaine.
Comme je le disais précédemment la config est au format JSON, voici donc la configuration qui répond à ces objectifs :

{
"Dhcp4": {
    #Interface DHCP
    "interfaces-config": {
        "interfaces": [ "eth0" ]
    },

    #Duree bail DHCP
    "valid-lifetime": 172800,
    "renew-timer": 86400,

    "authoritative": true,

    #Configuration de la base des baux DHCP
    "lease-database": {
        "type": "memfile",
        "persist": true,
        "name": "/var/lib/kea/kea-leases4.csv",
        "lfc-interval": 3600
    },

    #Config DHCP
    "subnet4": [
        {
            "id": 1,
            "subnet": "192.168.10.0/24",
            "pools": [
                { "pool": "192.168.10.20 - 192.168.10.200" }
            ],
            "option-data": [
                {
                    "name": "domain-name-servers",
                    "data": "192.168.10.254, 8.8.8.8"
                },
                {
                    "name": "domain-search",
                    "data": "pixwok.fr"
                },
                {
                    "name": "routers",
                    "data": "192.168.10.254"
                }
            ],
            "reservations": [
                {
                    "hw-address": "38:50:98:C9:70:7D",
                    "ip-address": "192.168.10.2"
                }
            ]
        }
      ]
   }
}

Je vais vous détailler la configuration afin que vous puissiez par la suite adapter cette configuration pour votre réseau.

On commence dans notre configuration par indiquer l'interface d'écoute de notre serveur DHCP, ici notre serveur écoute sur l'interface eth0 de notre machine.

"interfaces-config": {
        "interfaces": [ "eth0" ]
 },

Pour obtenir le nom de votre interface, vous pouvez utiliser la commande ip link

La suite de notre configuration indique la durée d'un bail DHCP (les valeurs sont exprimées en secondes).

Le paramètre valid-lifetime indique la durée de validité des baux DHCP délivrés par notre serveur. Dans notre cas, la durée est de 48h.

Le paramètre renew-timer indique que le client DHCP peut commencer le processus de renouvellement de son bail avec le serveur au bout de 24h soit la moitié du bail.

Le paramètre suivant est "authoritative": true ce dernier permet de refuser une requête de renouvellement d'adresse IP d'un client DHCP qui n'appartient pas au réseau géré par notre serveur DHCP.

Comme je le disais plutôt kea-dhcp peut utiliser différentes méthodes de stockage des baux. Voici la config qui permet cela.

"lease-database": {
        "type": "memfile",
        "persist": true,
        "name": "/var/lib/kea/kea-leases4.csv",
        "lfc-interval": 3600
},

On indique ici que la base de données est stockée en mémoire (memfile) et qu'elle sera persistante (persist: true). Le paramètre suivant indique l'emplacement de stockage des données. Le dernier paramètre permet de purger la base toutes les heures. Cette partie est la configuration par défaut proposée par le fichier de config par défaut.

La partie suivante est la plus intéressante, car c'est ici que l'on va définir sur quel réseau on distribue nos adresses et surtout quelles informations vont être distribuées.

"subnet4": [
        {
            "id": 1,
            "subnet": "192.168.10.0/24",
            "pools": [
                { "pool": "192.168.10.20 - 192.168.10.200" }
            ],
            "option-data": [
                {
                    "name": "domain-name-servers",
                    "data": "192.168.10.254, 8.8.8.8"
                },
                {
                    "name": "domain-search",
                    "data": "pixwok.fr"
                },
                {
                    "name": "routers",
                    "data": "192.168.10.254"
                }
            ],
            "reservations": [
                {
                    "hw-address": "38:50:98:C9:70:7D",
                    "ip-address": "192.168.10.2"
                }
            ]
        }
      ]

On commence par indiquer le sous-réseau sur lequel distribué nos configurations avec subnet: 192.168.10.0/24 comme indiqué plutôt on va distribuer des configurations réseau sur le réseau 192.168.10.0/24. On définit ensuite un pool DHCP. Il s'agit de la plage d'adresse IP que peut distribuer notre serveur DHCP. Dans notre cas, on distribue les adresse allant de 192.168.10.20 à 192.168.10.200.
Comme je l'indiquais plutôt, on peut aussi délivrer d'autres informations aux clients DHCP. C'est ce que l'on retrouve dans la partie options-data.

  • domain-name-servers : indique les serveurs DNS à utiliser ici 192.168.10.254 et 8.8.88
  • domain-search : domaine de recherche sur notre réseau local
  • routers : addresse de notre passerelle par défaut.

La dernière partie de la configuration permet de réserver des adresses IP pour des hôtes. Pour ce faire, on indique au serveur DHCP l'adresse MAC de la machine et l'adresse IP à lui attribuer.

Une fois votre configuration enregistrée, vous pouvez tester sa syntaxe avec la commande suivante.

kea-dhcp4 -t /etc/kea/kea-dhcp4.conf 

Si votre configuration est valide, vous pouvez redémarrer le service kea-dhcp.

systemctl restart kea-dhcp4-server

C'est bon, vous avez un serveur DHCP opérationnel !