DHCP

De The Linux Craftsman
Aller à la navigation Aller à la recherche
Client Serveur
Protocole udp udp
Port 67 68
Configuration Iptables X iptables -I INPUT 2 -p udp --dport 67 -j ACCEPT

Introduction

  • Dynamic Host Configuration Protocol (DHCP) est un protocole réseau ;
  • Défini dans la RFC1531 et présenté pour la première fois en 1993 ;
  • Son rôle est d'assurer la configuration automatique des paramètres IP d'une station ;
  • DHCP configure l'adresse IP et le masque de la station cliente mais peut également configurer sa passerelle par défaut ainsi que ses serveurs DNS et NBNS (WINS).
  • DHCP est arrivé d'un problème : la conception d'IP suppose la configuration de chaque ordinateur connecté sur le réseau ;
  • Quasi impossible pour des réseaux de grande taille ;
  • Source d'erreur pour les FAI qui possèdent plus de clients que d'adresse IP publique.

Fonctionnement

L'ordinateur équipé d'une carte réseau mais dépourvu d'IP :

  1. Envoie par diffusion un datagramme DHCP DISCOVER sur le port 67 ;
  2. Tout serveur en mesure de répondre sur le réseau du client, envoie un datagramme DHCP OFFER en diffusion sur le port 68 et à destination du client (@MAC) ;
  3. Le client retient une des offres reçues, et diffuse un datagramme DHCP REQUEST comportant l'IP du serveur et l'IP retenue ;
  4. Le serveur DHCP envoie un datagramme DHCP ACK qui assigne au client l'adresse IP, le masque ainsi que la durée du bail pour cette adresse. C'est ce paquet qui contient les paramètres annexes comme la passerelle, les serveurs DNS, …

Préparation

Dans un premier temps, il faudra avoir une connexion à Internet, utiliser un serveur DNS et désactiver SELinux.

Pour ceux qui auraient manqué des étapes, les voici:

Une fois ces étapes effectuées, entrons dans le vif du sujet !

Installation

  • Sur CentOS 6 et 7
# yum -y install dhcp
  • Sur CentOS 8 :
# yum -y install dhcp-server

Configuration du service

Le fichier de configuration du démon DHCP est : /etc/dhcp/dhcpd.conf


# Pour spécifier une interface d'écoute
DHCPD_INTERFACE="eth0";

subnet 192.168.50.0 netmask 255.255.255.0 {
	# Ce serveur DHCP fait autorité pour ce sous-réseau
	authoritative;
	# Spécifie le routeur que le client prendra comme passerelle
	option routers 192.168.50.254;
	# Spécifie un serveur NTP
	option ntp-servers 192.168.50.254;
	# Le client prendra la chaîne comme suffixe DNS (eg. ping www au lieu de www.tala-informatique.fr)
	option domain-name "tala-informatique.fr";
	# Spécifie le serveur DNS du réseau
	option domain-name-servers 192.168.50.253;
	# Utilise cette portion d'IP pour l'attribution d'adresse
	# Cette plage doit exclure les adresses spécifiées plus bas pour les hôtes !
	range 192.168.50.10 192.168.50.50;

	# Durée de conservation du bail	
	default-lease-time 7200;
	max-lease-time 10800;

	# DHCP donnera le nom d'hôte (eg. tc1) à la machine
	use-host-decl-names on;

	host tc1 {
		hardware ethernet 00:80:64:1A:E9:14;
		fixed-address 192.168.50.1;
		# A mettre uniquement si l'option "use-host-decl-names" n'est pas explicitement spécifiée ou à "off"
		option host-name "tc1";
	}
}

Démarrage et enregistrement dans le chargeur de démarrage

  • Pour SystemVInit:
# service dhcpd start
# chkconfig dhcpd on
  • Pour SystemD :
# systemctl start dhcpd.service
# systemctl enable dhcpd.service

Parcours des logs

Les logs de dhcpd se trouvent dans /var/log/messages :

Feb 14 09:01:06 fw dhcpd: Internet Systems Consortium DHCP Server 4.1.1-P1
Feb 14 09:01:06 fw dhcpd: Copyright 2004-2010 Internet Systems Consortium.
Feb 14 09:01:06 fw dhcpd: All rights reserved.
Feb 14 09:01:06 fw dhcpd: For info, please visit https://www.isc.org/software/dhcp/
Feb 14 09:01:06 fw dhcpd: WARNING: Host declarations are global.  They are not limited to the scope you declared them in.
Feb 14 09:01:06 fw dhcpd: Not searching LDAP since ldap-server, ldap-port and ldap-base-dn were not specified in the config file
Feb 14 09:01:06 fw dhcpd: Wrote 0 deleted host decls to leases file.
Feb 14 09:01:06 fw dhcpd: Wrote 0 new dynamic host decls to leases file.
Feb 14 09:01:06 fw dhcpd: Wrote 5 leases to leases file.
Feb 14 09:01:06 fw dhcpd: Listening on LPF/eth3/00:0c:29:db:3a:1f/192.168.210.0/24
Feb 14 09:01:06 fw dhcpd: Sending on   LPF/eth3/00:0c:29:db:3a:1f/192.168.210.0/24
Feb 14 09:01:06 fw dhcpd:
Feb 14 09:01:06 fw dhcpd: No subnet declaration for eth2 (no IPv4 addresses).
Feb 14 09:01:06 fw dhcpd: ** Ignoring requests on eth2.  If this is not what
Feb 14 09:01:06 fw dhcpd:    you want, please write a subnet declaration
Feb 14 09:01:06 fw dhcpd:    in your dhcpd.conf file for the network segment
Feb 14 09:01:06 fw dhcpd:    to which interface eth2 is attached. **
Feb 14 09:01:06 fw dhcpd:
Feb 14 09:01:06 fw dhcpd: Listening on LPF/eth1/00:0c:29:db:3a:0b/192.168.200.0/24
Feb 14 09:01:06 fw dhcpd: Sending on   LPF/eth1/00:0c:29:db:3a:0b/192.168.200.0/24
Feb 14 09:01:06 fw dhcpd:
Feb 14 09:01:06 fw dhcpd: No subnet declaration for eth0 (192.168.100.200).
Feb 14 09:01:06 fw dhcpd: ** Ignoring requests on eth0.  If this is not what
Feb 14 09:01:06 fw dhcpd:    you want, please write a subnet declaration
Feb 14 09:01:06 fw dhcpd:    in your dhcpd.conf file for the network segment
Feb 14 09:01:06 fw dhcpd:    to which interface eth0 is attached. **
Feb 14 09:01:06 fw dhcpd:
Feb 14 09:01:06 fw dhcpd: Sending on   Socket/fallback/fallback-net

Interfaces d'écoutes

On voit clairement les interfaces où dhcpd va répondre :

Feb 14 09:01:06 fw dhcpd: Listening on LPF/eth1/00:0c:29:db:3a:0b/192.168.200.0/24
Feb 14 09:01:06 fw dhcpd: Sending on   LPF/eth1/00:0c:29:db:3a:0b/192.168.200.0/24

et celles où rien ne se passera :

Feb 14 09:01:06 fw dhcpd: No subnet declaration for eth2 (no IPv4 addresses).
Feb 14 09:01:06 fw dhcpd: ** Ignoring requests on eth2.  If this is not what
Feb 14 09:01:06 fw dhcpd:    you want, please write a subnet declaration
Feb 14 09:01:06 fw dhcpd:    in your dhcpd.conf file for the network segment
Feb 14 09:01:06 fw dhcpd:    to which interface eth2 is attached. **
Feb 14 09:01:06 fw dhcpd:
Feb 14 09:01:06 fw dhcpd: No subnet declaration for eth0 (192.168.100.200).
Feb 14 09:01:06 fw dhcpd: ** Ignoring requests on eth0.  If this is not what
Feb 14 09:01:06 fw dhcpd:    you want, please write a subnet declaration
Feb 14 09:01:06 fw dhcpd:    in your dhcpd.conf file for the network segment
Feb 14 09:01:06 fw dhcpd:    to which interface eth0 is attached. **

Délivrance des baux

Quand une machine demande un bail au serveur DHCP, on peut le suivre dans les logs... ce qui est très pratique quand on n'a pas envie de recopier son adresse MAC !

Feb 14 09:08:33 fw dhcpd: DHCPDISCOVER from 00:0c:29:e6:c5:aa via eth1
Feb 14 09:08:33 fw dhcpd: DHCPOFFER on 192.168.200.253 to 00:0c:29:e6:c5:aa via eth1
Feb 14 09:08:33 fw dhcpd: DHCPREQUEST for 192.168.200.253 (192.168.200.254) from 00:0c:29:e6:c5:aa via eth1
Feb 14 09:08:33 fw dhcpd: DHCPACK on 192.168.200.253 to 00:0c:29:e6:c5:aa via eth1

Mise à jour sécurisée du DNS

Il est possible de configurer dhcpd pour qu'il envoie des mises à jour à named

Configuration de dhcpd

Section global

Pour cela, il faut ajouter les lignes suivantes au début du fichier:

ddns-update-style interim;
ignore client-updates;
update-static-leases on;

key DHCP_DAEMON {
        algorithm hmac-md5;
        secret "m6y00sQNwZQkQKq92ODj/5iSGIejHKGuURLVxHDE/iM=";
}

zone tala-informatique.fr. {
  primary 192.168.200.253;
  key DHCP_DAEMON;
}

zone 200.168.192.in-addr.arpa. {
  primary 192.168.200.253;
  key DHCP_DAEMON;
}

La méthode interim est le standard. Le client peut demander au serveur DHCP de mettre à jour le serveur DNS en lui passant ses propres paramètres et le serveur est configuré pour honorer (allow client-updates) ou pas la demande du client (ignore client-updates)

ddns-domainname et ddns-rev-domainname permettent de spécifier au serveur DNS de quelle zone il s'agit pour qu'il ajoute les enregistrements de type A et PTR dans les bons fichiers de zones.

Section subnet

Dans la section subnet il faut ajouter une section group qui permettra de délimiter les hôtes mis à jour de manière automatique

group {
   option domain-name "tala-informatique.fr";
   ddns-domainname "tala-informatique.fr";

   host proxy {
       hardware ethernet 00:0C:29:A1:CA:BC;
       fixed-address 192.168.200.249;
       ddns-hostname "proxy";
   }
}

Vérification

A chaque mise à jour on peut constater dans /var/log/messages

# tail -f /var/log/messages
Dec 27 22:50:47 fw dhcpd: Added new forward map from proxy.tala-informatique.fr to 192.168.200.249
Dec 27 22:50:47 fw dhcpd: added reverse map from 249.200.168.192.in-addr.arpa. to proxy.tala-informatique.fr
Dec 27 22:50:47 fw dhcpd: DHCPREQUEST for 192.168.200.249 from 00:0c:29:a1:ca:bc via eth1
Dec 27 22:50:47 fw dhcpd: DHCPACK on 192.168.200.249 to 00:0c:29:a1:ca:bc via eth1

Relais DHCP

Quand les machines qui demandent une configuration de niveau 3 OSI ne sont pas sur le même domaine de broadcast que le serveur DHCP, il faut installer un relais DHCP.

Dhcrelay.png

Pour cela, il faut agir sur le routeur en lui ajoutant l'agent de relais DHCP.

Installation

Pour CentOS 6 / 7

# yum -y install dhcp

Pour CentOS 8+

# dnf -y install dhcp-relay

Configuration sur CentOS 6/7

Partons du postulat suivant :

  • le serveur DHCP est à l'adresse 192.168.2.250
  • le routeur possède les interfaces suivantes: eth0, eth1

Nous allons modifier le fichier /etc/sysconfig/dhcrelay comme cela :

# Command line options here
DHCRELAYARGS=""
# DHCPv4 only
INTERFACES="eth0 eth1"
# DHCPv4 only
DHCPSERVERS="192.168.3.250"

Si vous avez plusieurs serveurs DHCP, ajoutez seulement leurs adresses IP séparées par un espace.

Configuration sur CentOS 8+

Sur CentOS 8 ou ultérieur (eg. Rocky), il faut copier le fichier exemple dans le répertoire des services :

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

Maintenant nous pouvons modifier la ligne suivante :

ExecStart=/usr/sbin/dhcrelay -d --no-pid

Pour ajouter des options :

ExecStart=/usr/sbin/dhcrelay -d --no-pid -i eth0 -i eth1 192.168.3.250

Cela mettra le service dhcrelay en écoute sur eth0 et eth1 pour relayer les requêtes au serveur dhcp à l'adresse 192.168.3.250.

Comme nous venons d'ajouter un fichier dans le répertoire de systemD, il faut lui demander de recharger sa configuration :

# systemctl daemon-reload

On peut maintenant enregistrer le service au démarrage et le démarrer :

# systemctl enable dhcrelay --now

Démarrage

On n'oublie pas de démarrer et d'enregistrer le service dans le gestionnaire de démarrage :

# service dhcrelay start
# chkconfig dhcrelay on

DHCP Esclave

Dans cette section, nous allons nous intéresser à la continuité de service en installant un deuxième serveur DHCP qui agira quand le serveur maître sera indisponible.

Si vous avez déjà configuré votre serveur maître, c'est très bien, nous allons utiliser cette configuration pour le serveur esclave, si vous n'avez pas encore configuré votre serveur maître, retour à la case départ !

Principe

Le serveur maître et le serveur esclave échange sur un port TCP, généralement le 520, leurs informations sur les baux délivré. Il sont donc synchronisés et peuvent très bien marcher en tandem.

On part du postulat suivant :

  • DHCP maître : 192.168.3.251
  • DHCP esclave : 192.168.3.250

Configuration du maître

Dans le fichier /etc/dhcp/dhcpd.conf vous devez mettre le bloc suivante au début, avant les déclarations de subnet:

failover peer "dhcp" {
  primary;
  address 192.168.3.251;
  port 520;
  peer address 192.168.3.250;
  peer port 520;
  max-response-delay 60;
  max-unacked-updates 10;
  mclt 3600;
  split 128;
  load balance max seconds 3;
}

Ensuite, il suffit de faire référence à l'esclave dans chaque déclaration de subnet que l'on veut redonder:

subnet 192.168.3.0 netmask 255.255.255.0 {
   authoritative;
   pool{
      failover peer "dhcp";
      option routers 192.168.1.254;

      range 192.168.1.10 192.168.1.50;
   }
}

Configuration de l'esclave

Dans le fichier /etc/dhcp/dhcpd.conf c'est la même histoire que pour le maître en inversant les IP, en remplaçant primary par secondary et en supprimant les informations de balance de charge:

failover peer "dhcp" {
  secondary;
  address 192.168.3.250;
  port 520;
  peer address 192.168.3.251;
  peer port 520;
  max-response-delay 60;
  max-unacked-updates 10;
  mclt 3600;
}

Ensuite, il suffit de faire référence à l'esclave dans chaque déclaration de subnet que l'on à redondé sur le maître ainsi que d'enlever la directive authoritative:

subnet 192.168.3.0 netmask 255.255.255.0 {
   pool{
      failover peer "dhcp";
      option routers 192.168.1.254;

      range 192.168.1.10 192.168.1.50;
   }
}

Iptables

N'oublions pas d'ouvrir le port TCP 520 sur les deux machines:

# iptables -I INPUT 2 -p tcp --dport 520 -j ACCEPT

Relais

Si vous avez un dhcrelay sur votre ou vos pares-feu, n'oubliez pas de modifier la directive DHCPSERVERS pour y ajouter l'adresse de l'esclave !