DHCP

De Le Wiki du Forum-Debian.fr
Aller à la navigation Aller à la recherche

/!\ Ce document n'a pas été validé par la communauté. Soyez prudent vis-à-vis de son contenu! /!\

Attention: Si au cours de vos manipulations un problème survenait, vous ne pouvez en aucun cas incriminer ce site. Posez vos questions sur le forum.


Nous allons installer un serveur DHCP (à destination d'un petit réseau domestique, nous n'allons pas nous lancer dans la configuration d'une usine à gaz...) sur une squeeze.

DHCP, qu'est-ce que c'est ?

Le DHCP est un protocole qui permet d'attribuer dynamiquement une adresse IP à un système informatique qui se connecte au réseau.

Lorqu'il est convenablement configuré et fonctionnel, ce service est très pratique... Il permet d'administrer un réseau sans avoir à configurer machine après machine. Toutes vos "box" possèdent ce service par défaut, d'une manière plus ou moins élaborée.

Détail du protocole DHCP

Lorsque vous connectez une machine à un réseau Ethernet TCP/IP, cette machine, pour fonctionner correctement, doit disposer :

  1. d'une adresse IP unique dans votre réseau et appartenant au même réseau;
  2. d'un masque de sous réseau, le même pour tous les hôtes du réseau (le "netmask");
  3. d'une adresse d'un ou plusieurs DNS, pour pouvoir résoudre les noms des hôtes;
  4. de l'adresse de la passerelle qui permet d'accéder à Internet (le "gateway")

Pour configurer vos hôtes locaux, vous avez trois possibilités :

  1. avec « zeroconf » (rfc3927). ce système s'il est fonctionnel ne permet aucune administration du réseau;
  2. vous passez de machine en machine, et configurez les paramètres réseau;
  3. vous installez un serveur DHCP sur votre réseau et vous dites à vos clients de configurer leur réseau par dhcp.

Détail de fonctionnement du protocole

1) Le client DHCP démarre, il envoie une trame « DHCPDISCOVER », destinée à trouver un serveur DHCP.

Listening on LPF/eth0/6c:f0:49:07:15:8b Sending on LPF/eth0/6c:f0:49:07:15:8b Sending on Socket/fallback DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 4

2) Le (ou les) serveur(s) DHCP du réseau réponde(nt) par un « DHCPOFFER ». Cette trame contient une proposition de bail, la « MAC Address » du client, et l'adresse IP du serveur. Le client accepte normalement la première réponse venue.
DHCPOFFER from 192.168.0.254
3) Le client envoie alors un DHCPREQUEST à tous les serveurs (toujours en « Broadcast ») pour indiquer quelle offre il accepte.
DHCPREQUEST on eth0 to 255.255.255.255 port 67
4) Le serveur DHCP concerné répond définitivement par un DHCPACK qui constitue une confirmation du bail. L'adresse du client est alors marquée comme utilisée et ne sera plus proposée à un autre client pour toute la durée du bail.
DHCPACK from 192.168.0.254
bound to 192.168.0.2 -- renewal in 2850 seconds.

Un serveur DHCP a, à sa disposition, une plage d'adresses dans laquelle il est enfermé. Il tient à jour une base de données des adresses déjà utilisées et en cours d'utilisation. C'est ce qui explique que bien qu'attribuées dynamiquement, l'IP servie est souvent la même pour un client.

Lorsqu'il attribue une adresse, il le fait par l'intermédiaire d'un bail. Ce bail a normalement une durée limitée dans le temps. Tout ceci est configurable. L'avantage d'un bail long est une diminution du trafic vers le serveur dhcp. L'inconvénient, c'est qu'il faut planifier plus longtemps à l'avance des modification dans l'architecture de son réseau.

Après expiration du bail, ou résiliation par le client, les informations concernant ce bail restent mémorisées dans la base de données du serveur pendant un certain temps.

Installation du serveur DHCP

Sur Debian, ceci se fait très simplement en installant les paquetages isc-dhcp-server et isc-dhcp-common.

# apt-get update
# apt-get install isc-dhcp-server isc-dhcp-common

Configuration

Définition de l'interface

Le « daemon » dhcpd écoute par défaut sur toutes les interfaces réseau actives sur le serveur. Pour des raison de sécurité ce n'est pas souhaitable. Pour Debian Squeeze, il faudra éditer le fichier /etc/default/isc-dhcp-server. Par défaut, sur une Debian Lenny vous trouverez le fichier /etc/default/dhcp. Si vous souhaitez que votre dhcp écoute sur une seule interface, il faut la définir ici:

INTERFACES="eth0"

Le fichier /etc/dhcp/dhcpd.conf

La configuration de votre dhcp se trouve dans un seul fichier : /etc/dhcp/dhcpd.conf

Voici le fichier "original"

# cat /etc/dhcp/dhcpd.conf

  1. Sample configuration file for ISC dhcpd for Debian
  1. The ddns-updates-style parameter controls whether or not the server will
  2. attempt to do a DNS update when a lease is confirmed. We default to the
  3. behavior of the version 2 packages ('none', since DHCP v2 didn't
  4. have support for DDNS.)

ddns-update-style none;

  1. option definitions common to all supported networks...

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

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

  1. If this DHCP server is the official DHCP server for the local
  2. network, the authoritative directive should be uncommented.
  3. authoritative;
  1. Use this to send dhcp log messages to a different log file (you also
  2. have to hack syslog.conf to complete the redirection).

log-facility local7;

  1. No service will be given on this subnet, but declaring it helps the
  2. DHCP server to understand the network topology.
  1. subnet 10.152.187.0 netmask 255.255.255.0 {
  2. }
  1. This is a very basic subnet declaration.
  1. subnet 10.254.239.0 netmask 255.255.255.224 {
  2. range 10.254.239.10 10.254.239.20;
  3. option routers rtr-239-0-1.example.org, rtr-239-0-2.example.org;
  4. }
  1. This declaration allows BOOTP clients to get dynamic addresses,
  2. which we don't really recommend.
  1. subnet 10.254.239.32 netmask 255.255.255.224 {
  2. range dynamic-bootp 10.254.239.40 10.254.239.60;
  3. option broadcast-address 10.254.239.31;
  4. option routers rtr-239-32-1.example.org;
  5. }
  1. A slightly different configuration for an internal subnet.
  2. subnet 10.5.5.0 netmask 255.255.255.224 {
  3. range 10.5.5.26 10.5.5.30;
  4. option domain-name-servers ns1.internal.example.org;
  5. option domain-name "internal.example.org";
  6. option routers 10.5.5.1;
  7. option broadcast-address 10.5.5.31;
  8. default-lease-time 600;
  9. max-lease-time 7200;
  10. }
  1. Hosts which require special configuration options can be listed in
  2. host statements. If no address is specified, the address will be
  3. allocated dynamically (if possible), but the host-specific information
  4. will still come from the host declaration.
  1. host passacaglia {
  2. hardware ethernet 0:0:c0:5d:bd:95;
  3. filename "vmunix.passacaglia";
  4. server-name "toccata.fugue.com";
  5. }
  1. Fixed IP addresses can also be specified for hosts. These addresses
  2. should not also be listed as being available for dynamic assignment.
  3. Hosts for which fixed IP addresses have been specified can boot using
  4. BOOTP or DHCP. Hosts for which no fixed address is specified can only
  5. be booted with DHCP, unless there is an address range on the subnet
  6. to which a BOOTP client is connected which has the dynamic-bootp flag
  7. set.
  8. host fantasia {
  9. hardware ethernet 08:00:07:26:c0:a5;
  10. fixed-address fantasia.fugue.com;
  11. }
  1. You can declare a class of clients and then do address allocation
  2. based on that. The example below shows a case where all clients
  3. in a certain class get addresses on the 10.17.224/24 subnet, and all
  4. other clients get addresses on the 10.0.29/24 subnet.
  1. class "foo" {
  2. match if substring (option vendor-class-identifier, 0, 4) = "SUNW";
  3. }
  1. shared-network 224-29 {
  2. subnet 10.17.224.0 netmask 255.255.255.0 {
  3. option routers rtr-224.example.org;
  4. }
  5. subnet 10.0.29.0 netmask 255.255.255.0 {
  6. option routers rtr-29.example.org;
  7. }
  8. pool {
  9. allow members of "foo";
  10. range 10.17.224.10 10.17.224.250;
  11. }
  12. pool {
  13. deny members of "foo";
  14. range 10.0.29.10 10.0.29.230;
  15. }
  16. }

Une sauvegarde s'impose :

# cp /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.ori

Voici notre fichier "modifié"

# cat /etc/dhcp/dhcpd.conf ddns-update-style none; authoritative;

option domain-name "isalo.org"; default-lease-time 7200; max-lease-time 86400; log-facility local7;

subnet 192.168.0.0 netmask 255.255.255.0 {

       pool {
               option domain-name-servers 192.168.0.1,41.188.9.130;
               range 192.168.0.199 192.168.0.249;
       }
       option routers 192.168.0.254;
       option domain-name "isalo.org";
       option domain-name-servers 192.168.0.1,41.188.9.130;
       option netbios-name-servers 192.168.0.6;
       option netbios-node-type 8;
       option tftp-server-name "192.168.0.6";
       next-server 192.168.0.6;
       filename "pxelinux.0";

} host s_lan_0 { hardware ethernet 00:25:11:79:8a:76; fixed-address 192.168.0.1; option host-name lol; }

Explications

ddns-update-style: Vous pouvez demander au serveur DHCP de mettre à jour un serveur DNS si l'adresse IP d'un serveur dans votre réseau local a changé (car elle a été attribuée une adresse IP différente par DHCP). Si vous n'avez pas de serveurs DNS dans notre LAN ou donnez des adresses IP statiques (qui est une bonne idée pour les serveurs ...) vous ne voudrez pas mettre à jour les enregistrements DNS, vous mettrez donc "none"

ddns-update-style none;

Ce serveur fait autorité sur le réseau

authoritative;

Les options globales La durée des baux... En secondes. Vous pouvez laisser les durées par défaut. En augmentant ces durées, vous diminuerez le trafic généré par les demandes de renouvellement de baux. La valeur par défaut (600 minutes) semble un peu faible, j'ai choisi de passer cette valeur à 7200. Pour des essais, vous pouvez parfaitement passer ces valeurs à 120 ou moins... Vous disposez d'un serveur NTP, précisez-le ici.

option time-servers 192.168.0.254;
default-lease-time 7200;
max-lease-time 7200;

Précision : Les option globales, définies avant toute autre définition sont applicables à l'ensemble des "clients". Si vous souhaitez préciser des options pour chaque "pool" il faudra mettre ces options dans la partie "pool" concernée.

Le réseau 192.168.0.0/24, avec la réserve d'adresses dynamiques, les IP des DNS, l'adresse du routeur, la définition du domaine de recherche, et trois lignes permettant de trouver un serveur PXE qui se trouve sur le réseau à l'IP 192.168.0.6 subnet 192.168.0.0 netmask 255.255.255.0 {

       pool {
              range 192.168.0.199 192.168.0.249; # La plage d'adresses IP à distribuer
       }
       option domain-name-servers 192.168.0.1,41.188.9.130; # Les DNS
       option routers 192.168.0.254; # La passerelle
       option domain-name "isalo.org"; # Le domaine
       option netbios-name-servers 192.168.0.6; # L'adresse du serveur Netbios
       option tftp-server-name "192.168.0.6"; # L'adresse du serveur tftp (pour un PXE)
       next-server 192.168.0.6;
       filename "pxelinux.0";

}

Les réservations d'adresses

Nous attribuerons automatiquement l'IP 192.168.0.1 à la machine qui dispose de l'adresse MAC 00:25:11:79:8a:76.

host s_lan_0 { hardware ethernet 00:25:11:79:8a:76; fixed-address 192.168.0.1; option host-name lol; }

Avertissement: La sécurité par attribution d'IP à des adresses MAC est facilement contournable par la technique dite "ARP Spoofing" - usurpation d'adresse MAC.

Les logs

Si vous souhaitez séparer vos logs :

Ajoutez :

local7.debug     /var/log/dhcpd.log

Au fichier /etc/rsyslog.conf ou syslog.conf (en fonction de votre configuration)

et relancez le daemon syslog :

# service rsyslog restart ou # /etc/init.d/sysklogd restart

Coupler DHCP avec BIND9

Cette option n'a pas encore été testée... A prendre avec précaution.

Cerise sur le gateau, vous disposez d'un serveur DNS bind. Nous pouvons alors coupler DHCP et BIND pour que ce dernier mette automatiquement à jour les IP dans ses fichiers de configuration:

dans /etc/dhcp/dhcpd.conf

Remplacer :

ddns-update-style none;

Par :

include "/etc/bind/rndc.key"; ddns-update-style interim; ddns-domainname "isalo.org."; ddns-rev-domainname "in-addr.arpa."; ignore client-updates; zone test.edu. { primary 127.0.0.1; key rndc-key; } zone 192.in-addr.arpa. { primary 127.0.0.1; key rndc-key; }

dans /etc/bind/named.conf ou named.conf.local

Configurez vos zones comme suit :

controls { inet 127.0.0.1 allow { localhost; } keys { "rndc-key"; }; };

include "/etc/bind/rndc.key";

zone "isalo.org" {

       type master;
       file "/etc/bind/db.isalo.org";
       allow-update { key "rndc-key"; };
       notify no;
       };

zone "192.in-addr.arpa" {

       type master;
       file "/etc/bind/db.192";
       allow-update { key "rndc-key"; };
       notify no;
       };

Refuser des adresses MAC ou des plages d'adresses MAC

Est-il possible de bloquer les demandes de certains matériels réseau en fonction de leur adresse MAC : Oui!

Il faudra utiliser ces commandes :

match if substring(hardware, 1, 3) = xx:xx:xx;

ou

match if binary-to-ascii(16, 8, ":", substring(hardware, 1, 3)) = "xx:xx:xx";

Attention dans la chaîne ASCII de comparaison le zéro de poids fort des octets doit être omis, par exemple : 08:00:27 -> 8:0:27


L'exemple suivant permet de mettre dans le groupe "banni" une plage d'adresses MAC et de leur fournir une IP particulière : class "banni" {

       match if binary-to-ascii(16, 8, ":", substring(hardware, 1, 3)) = "8:0:27";

} subnet 192.168.0.0 netmask 255.255.255.0 {

 option routers 192.168.0.254;
 pool {     deny members of "banni";
    range 192.168.0.70 192.168.0.71;
 }
 pool {
    range 192.168.0.72 192.168.0.73;
 }

} L'exemple suivant permet de mettre dans le groupe "banni" une plage d'adresses MAC et de leur refuser une IP : class "banni" {

       match if substring(hardware, 1, 3) = 08:00:27;

} subnet 192.168.0.0 netmask 255.255.255.0 {

 option routers 192.168.0.254;
 pool {
    deny members of "banni";
    range 192.168.0.70 192.168.0.71;
 }

} Vous devriez avoir dans /var/log/syslog ceci :

DHCPDISCOVER from 08:00:27:02:65:60 via eth0: network 192.168.0.0/24: no free leases

Discussion forum

Test

Sur une machine cliente :

# ifup eth0
Internet Systems Consortium DHCP Client 4.1.1-P1
Copyright 2004-2010 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/

Listening on LPF/eth0/6c:f0:49:07:15:8b
Sending on   LPF/eth0/6c:f0:49:07:15:8b
Sending on   Socket/fallback
DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 4
DHCPOFFER from 192.168.0.1
DHCPREQUEST on eth0 to 255.255.255.255 port 67
DHCPACK from 192.168.0.1
bound to 192.168.0.2 -- renewal in 3552 seconds.

Conclusion

Voilà, notre dhcp est configuré et opérationnel ! Très simple à mettre en place comme vous l'avez vu, votre dhcp est maintenant prêt à vous rendre de très nombreux services pour une gestion centralisée de votre réseau.

De nombreuses options existent, elles permettent de mieux servir vos clients. A vous de les découvrir...

Référence : [Le fichier dhcpd.conf]

Lol 12 novembre 2010 à 10:05 (EAT)