DHCP
/!\ 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.
Lorsque vous connectez une machine à un réseau Ethernet TCP/IP, cette machine, pour fonctionner correctement, doit disposer :
- d'une adresse IP unique dans votre réseau et appartenant au même réseau;
- d'un masque de sous réseau, le même pour tous les hôtes du réseau;
- d'une adresse de DNS, pour pouvoir résoudre les noms des hôtes;
- de l'adresse de la passerelle qui permet d'accéder au Net (le "gateway")
Pour configurer vos hôtes locaux, vous avez trois possibilités :
- avec « zeroconf » (rfc3927). ce système s'il est fonctionnel ne permet aucune administration du réseau;
- vous passez de machine en machine, et configurez les paramètres réseau;
- 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
- Le client DHCP démarre, il envoie une trame « DHCPDISCOVER », destinée à trouver un serveur DHCP.
- 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.
- Le client envoie alors un DHCPREQUEST à tous les serveurs (toujours en « Broadcast ») pour indiquer quelle offre il accepte.
- 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.
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. 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
- Sample configuration file for ISC dhcpd for Debian
- The ddns-updates-style parameter controls whether or not the server will
- attempt to do a DNS update when a lease is confirmed. We default to the
- behavior of the version 2 packages ('none', since DHCP v2 didn't
- have support for DDNS.)
ddns-update-style none;
- 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;
- If this DHCP server is the official DHCP server for the local
- network, the authoritative directive should be uncommented.
- authoritative;
- Use this to send dhcp log messages to a different log file (you also
- have to hack syslog.conf to complete the redirection).
log-facility local7;
- No service will be given on this subnet, but declaring it helps the
- DHCP server to understand the network topology.
- subnet 10.152.187.0 netmask 255.255.255.0 {
- }
- This is a very basic subnet declaration.
- subnet 10.254.239.0 netmask 255.255.255.224 {
- range 10.254.239.10 10.254.239.20;
- option routers rtr-239-0-1.example.org, rtr-239-0-2.example.org;
- }
- This declaration allows BOOTP clients to get dynamic addresses,
- which we don't really recommend.
- subnet 10.254.239.32 netmask 255.255.255.224 {
- range dynamic-bootp 10.254.239.40 10.254.239.60;
- option broadcast-address 10.254.239.31;
- option routers rtr-239-32-1.example.org;
- }
- A slightly different configuration for an internal subnet.
- subnet 10.5.5.0 netmask 255.255.255.224 {
- range 10.5.5.26 10.5.5.30;
- option domain-name-servers ns1.internal.example.org;
- option domain-name "internal.example.org";
- option routers 10.5.5.1;
- option broadcast-address 10.5.5.31;
- default-lease-time 600;
- max-lease-time 7200;
- }
- Hosts which require special configuration options can be listed in
- host statements. If no address is specified, the address will be
- allocated dynamically (if possible), but the host-specific information
- will still come from the host declaration.
- host passacaglia {
- hardware ethernet 0:0:c0:5d:bd:95;
- filename "vmunix.passacaglia";
- server-name "toccata.fugue.com";
- }
- Fixed IP addresses can also be specified for hosts. These addresses
- should not also be listed as being available for dynamic assignment.
- Hosts for which fixed IP addresses have been specified can boot using
- BOOTP or DHCP. Hosts for which no fixed address is specified can only
- be booted with DHCP, unless there is an address range on the subnet
- to which a BOOTP client is connected which has the dynamic-bootp flag
- set.
- host fantasia {
- hardware ethernet 08:00:07:26:c0:a5;
- fixed-address fantasia.fugue.com;
- }
- You can declare a class of clients and then do address allocation
- based on that. The example below shows a case where all clients
- in a certain class get addresses on the 10.17.224/24 subnet, and all
- other clients get addresses on the 10.0.29/24 subnet.
- class "foo" {
- match if substring (option vendor-class-identifier, 0, 4) = "SUNW";
- }
- shared-network 224-29 {
- subnet 10.17.224.0 netmask 255.255.255.0 {
- option routers rtr-224.example.org;
- }
- subnet 10.0.29.0 netmask 255.255.255.0 {
- option routers rtr-29.example.org;
- }
- pool {
- allow members of "foo";
- range 10.17.224.10 10.17.224.250;
- }
- pool {
- deny members of "foo";
- range 10.0.29.10 10.0.29.230;
- }
}
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
#option time-servers 192.168.0.252; max-lease-time 7200; default-lease-time 86400;
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 { 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 tftp-server-name "192.168.0.6"; next-server 192.168.0.6; filename "pxelinux.0"; }
Les réservation d'adresses
Nous attriburons 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; }
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-updates on;
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/dhcp/dhcpd.conf
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; };
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 option existent, elles permettent de mieux servir vos clients. A vous de les découvrir...
Lol 12 novembre 2010 à 10:05 (EAT)