documentation/services/networking/isc-dhcp-server.md

6.2 KiB

ISC-DHCP-SERVER

ISC-DHCP-SERVER est une implémentation du protocole DHCP qui permet à un hôte via une requête DHCP au serveur de récupérer une adresse IP, des informations à propos des dns et l'adresse de la passerelle. Il est actuellement un peu vieillisant mais il est très robuste, il est envisagé de le remplacer par son successeur kea quand il sera plus stable.

Principe

Le protocole DHCP utilise le transport UDP et les ports 67 du serveur et 68 du client.

Configuration initiale

Le protocole DHCP fonctionne de la manière suivante :

  1. le client qui cherche à configurer son interface réseaux envoie une requête DHCPDISCOVER sur le lien en broadcast avec comme adresse cible 255.255.255.255 en spécifiant son adresse MAC dans la requête

  2. le serveur vérifie s'il est configuré pour répondre au client :

    • si ce n'est pas le cas il lui renvoie un DHCPDECLINE

    • sinon il lui fait une offre cohérente par rapport à sa configuration et son état actuel via un paquet DHCPOFFER

  3. le client lui répond avec une requête DHCPREQUEST dans lequel il précise l'adresse qu'il souhaiterait que le serveur dhcp lui alloue

  4. le serveur statue finalement sur l'adresse qu'il alloue effectivement au client dans un paquet DHCPACK où il précise en plus de l'adresse des options configurations supplémentaires comme l'adresse des serveurs de noms ou l'adresse de la passerelle. Il précise aussi pour combien de temps il réalise cette allocation (on parle de bail ou de lease).

Rafraichir le bail

Au bout du temps configuré par le serveur DHCP, il est possible pour le client de demander au serveur de renouveller l'allocation de l'adresse s'il l'utilise encore. Pour cela, il se contente de reprendre à partir de la troisième étape précédente.

Filtrage et protection

Attention, il n'est pas rare qu'on composant actif (un switch par exemple) sur le lien dispose par défaut de fonctionnalité bloquant par sécurité le traffic dhcp. C'est une option de sécurité désactivable. Il est aussi possible parfois d'utiliser cette fonctionnalité à notre avantage pour améliorer la sécurité de notre infrastructure en précisant l'adresse de notre serveur dhcp permettant au switch de bloquer les acquittements dhcp excepté celle provenant de nos serveurs.

Certains switchs permettent aussi de configurer certains ports pour qu'ils interdisent aux machines de communiquer avec une autre adresse que celle qu'elles ont récupéré par dhcp.

Installation

On se contente de tirer le logiciel des repository debian sudo apt install isc-dhcp-server.

Configuration

La page de manuel détaillant les options de configurations de radvd est consultable en utilisant man 5 dhcpd.conf. Le ficihier de configuration principale se trouve dans /etc/dhcp/dhcpd.conf et un fichier de configuration additionel se trouve dans /etc/default/isc-dhcp-dserver.

/etc/dhcp/dhcpd.conf

Le logiciel se configure en fonction des plages de sous-réseaux qu'on souhaite que le serveur dhcp administre. Il permet en plus de préciser des options de configurations par défaut et des options de configuration générale. Un sous réseau se définit dans un bloc subnet pour lequel on précise le sous-réseau, le masque associé et l'interface sur laquelle il servira ces requêtes :

subnet 100.64.0.0 netmask 255.255.0.0 {
  interface "ens23";
}

Il y a deux manières (utilisées au crans) de régler comment le serveur dhcp alloue des ips à ces clients. La première est de lui donner dans un fichier externer une liste d'association ip MAC au format suivant :

host gulf.cachan-adh.crans.org {
  hardware ethernet 02:65:6C:01:01:01;
  fixed-address 185.230.76.12;
}

et de préciser l'option suivante dans le bloc de configuration du sous-réseaux.

include "/var/local/services/dhcp/generated/dhcp.adh.crans.org.list";

Les clients présents dans cette liste seront alors considéré comme connus par le serveur dhcp. Pour les clients qu'il ne connait pas il peut alors décider de les accepter ou de les refuser en précisant soit allow unknown-clients; soit deny unknown-clients; dans le bloc de sous-réseaux.

L'autre manière de procéder est de lui laisser gérer lui même l'allocation des adresses ips à utiliser en lui précisant simplement dans quels plages il a le droit de venir se servir, pour cela on précise l'option suivante dans le bloc :

pool {
  range 100.65.1.0 100.65.255.254;
}

Vu qu'a priori les clients ne sont pas connus, il faut assez fréquemment préciser en conjoncure de cette option l'option allow unknown-clients;.

Il reste ensuite à régler la durée pour laquelle les adresses sont alloués :

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

Ainsi que les options de configuration réseaux a passé au client :

    option subnet-mask 255.255.0.0; # Précise le sous-réseaux dans lequel l'adresse assignée se trouve
    option broadcast-address 100.64.255.255; # Précise l'adresse de broadcast que le client doit configurer
    option routers 100.64.0.99; # Précise l'adresse de la passerelle
    option domain-name-servers 100.64.0.101,100.64.0.102; # Précise l'adresse des serveurs de noms
    option domain-name "adh-nat.crans.org"; # Précise le nom de domaine de l'hote
    option domain-search "adh-nat.crans.org"; # Précise la liste de recherche par défaut pour les fqdn

/etc/default/isc-dhcp-server

Ce fichier contrôle les options utilisées pour lancer le daemon isc-dhcp-server. Dans notre cas on se contente de préciser sur quels interfaces le serveur devrait écouter en ipv4, mais il est possible de préciser d'autres options.

INTERFACESv4="ens22 ens23 ens1 enp1s3"

Attention pour que le serveur démarre effectivement, il faut que les interfaces listées ici soient bien démarrées et disposent d'une ipv4, sinon celui-ci refusera de se lancer.

Mise à jour de la configuration

Depuis que le crans ne fournit plus internet à ces adhérent⋅es, le dhcp ne sert plus qu'à fournir les adresses IP au VM des adhérent⋅es. Le DHCP fournit alors l'adresse IP contenu dans le LDAP adhérent. Pour synchroniser le LDAP et le DHCP, le cron services-dhcp exécute toutes les 2 minutes un script python