Sommaire

1. Introduction
2. Installation
3. Configuration
   3.1 /etc/default/dhcp3-server
   3.2 /etc/dhcp3/dhcpd.conf
4. Les commandes
5. Liens et Ressources

1  Introduction

La mise en place d'un serveur DHCP permet de récupérer une adresse IP automatiquement via le serveur. Pour illuster son intérêt, supposons que vous ayez un ordinateur portable se fiant au protocol DHCP pour lui fournir son adresse IP. Il y a un serveur DHCP sur votre réseau local chez vous ainsi qu'au travail. Dans ce cas, un branchement du cable réseau, et le tour est joué. Autrement, j'espère que vous connaissez la définition des deux réseaux locaux et les adresses disponibles.

2  Installation

Pour installer le server dhcp, la commande est la suivante :
# apt-get install dhcp3-server
A la suite de cette commande, les packages dhcp3-server et dhcp3-common seront installés. Le système essayera ensuite de lancé dhcp3-server mais vous obtiendrez :
Starting DHCP server: dhcpd3 failed to start - check syslog for diagnostics.
invoke-rc.d: initscript dhcp3-server, action "start" failed.
C'est tout à fait normal, il faut le configurer un minimum pour pouvoir le lancer.

3  Configuration

Il y a deux fichiers à renseigner afin de configurer le serveur dhcp :

3.1  /etc/default/dhcp3-server

Ce fichier contient l'interface sur laquelle doit écouter le serveur. On modifie la ligne INTERFACES="", qui est d'ailleurs la seule ligne du fichier, en y ajoutant l'interface que l'on veut. Par exemple, mon serveur dhcp doit tourner sur l'interface eth1 donc, j'obtiens :
INTERFACES="eth1"

3.2  /etc/dhcp3/dhcpd.conf

Ce fichier permet de définir toute la configuration du serveur DHCP.

3.2.1  Utilisation simple

L'exemple suivant ne montre qu'une partie de la configuration pour mettre en évidence la déclaration d'un réseau et d'un hôte spécifique auquel on veut attribuer une ip fixe.
subnet 192.168.0.0 netmask 255.255.255.0 {
	range 192.168.0.5 192.168.0.20;
	option routers 192.168.0.1;
        option domain-name-servers 80.10.246.2, 80.10.246.129;
 }

 host server2 {
        hardware ethernet 00:C0:9F:AF:83:85;
        fixed-address 192.168.0.2;
 }
Cette exemple déclare un réseau local en 192.168.0.0/255.255.255.0 dont les adresses seront automatiquement attribuées entre 192.168.0.5 et 192.168.0.20. Le serveur principal est déclaré en 192.168.0.1. De plus, les DNS sont définis grâce à l'option domain-name-servers. L'adresse 192.168.0.2 sera associée à l'ordinateur dont l'adresse MAC est 00:C0:9F:AF:83:85. Ayant declaré des serveurs DNS dans la configuration du serveur DHCP, cela signifie que l'on présuppose que les machines du réseau local ont le droit de se connecter à Internet. Cependant, déclarer une passerelle par défaut et des DNS n'est pas suffisant pour permettre une connexion Internet aux ordinateurs du reseau local. Il faut activer le partage NAT et autoriser le forwarding. Jettez un coup d'oeil ici : Script De Configuration Des Interfaces Reseau Avec Firewall. De cette manière, on obtient une ip fixe pour certains ordinateurs (serveurs) et une ip non fixes pour les autres. Maintenant que tout est configuré, on lance le démon :
# /etc/init.d/dhcp3-server start
Et on vérifie bien que tout fonctionne.

3.2.2  Création des pools et class

La configuration suivante met en évidence l'utilisation des pools et des classes pour créer différents "sous-réseaux" ; elle est minimale et n'est qu'une base de départ. La mise en place de ces différents groupes a pour objectif de permettre une meilleur localisation des ressources sur le réseau. Il est ainsi possible de distinguer un serveur, d'un poste utilisateur et mieux encore, d'une machine étrangère au réseau ; un firewall basé sur cette architecture pourrait interdire ses ressources à des machines étrangères, ou leur interdire d'accéder à Internet. Cette méthode n'est en aucun cas une mesure fiable pour sécuriser un réseau, mais elle a le mérite d'écarter certains petits malins 8).
# Créer la classe de niveau 1 spécifique à un identifiant LAN_1*
class "lan_level_1" {
        match if substring (option dhcp-client-identifier,0,5) = "LAN_1";
}

# Créer la classe de niveau 2 spécifique à un identifiant LAN_2*
class "lan_level_2" {
        match if substring (option dhcp-client-identifier,0,5) = "LAN_2";
}

# Créer le réseau privé 192.168.0.0/24
subnet 192.168.0.0 netmask 255.255.255.0 {
        # Associer la plage [100-120] pour les machines inconnues sur le réseau
        pool {
                deny members of "lan_level_1";
                deny members of "lan_level_2";
                range 192.168.0.100 192.168.0.120;
        }
        # Associer la plage [10-20] aux machines de niveau 1
        pool {
                allow members of "lan_level_1";
                deny members of "lan_level_2";
                range 192.168.0.10 192.168.0.20;
        }
        # Associer la plage [2-5] aux machines de niveau 2
        pool {
                deny members of "lan_level_1";
                allow members of "lan_level_2";
                range 192.168.0.3 192.168.0.5;

                # Configuration du second serveur via son adr MAC
                host etch {
                        hardware ethernet 00:C0:9F:AF:83:85;
                        fixed-address 192.168.0.2;
                }
        }
}
Pour définir les classes, je fais mention de l'option dhcp-client-identifier. Il faut ajouter cette option dans le ficher /etc/dhcp3/dhclient.conf pour les différents utilisateurs en fonction des groupes.
send dhcp-client-identifier "LAN_1_PC1"
Dans l'éventualité où vous auriez des stations windows sur votre réseau, il faut faire comme cela depuis un prompt :
# ipconfig /setclassid "Connexion au réseau local" LAN_1_PC1
Le poste se voit affecter l'id "LAN_1_PC1".

3.2.3  DHCP et update DNS

La configuration présentée s'intègre dans le cadre d'un serveur DHCP s'appuyant sur les points suivants : La création de la clef TSIG et la configuration du serveur DNS seront bientôt disponibles dans l'article serveur DNS.
# Mettre à jour le serveur DNS
ddns-update-style interim;
ddns-updates on;

# Charger la signature (TSIG) pour pouvoir autoriser les transactions
# avec BIND
include "/etc/bind/ns-example-com_rndc-key";

# Déclarer le serveur DHCP en tant que master
authoritative;

# Refuser les adresses mac en double
deny duplicates;

# Refuser les messages DHCPDECLINE indiquant un conflit réseau.
ignore declines;

# Enregistrer uniquement le nom d'hôte si le FQDN n'est pas géré par le 
# serveur
ignore client-updates;

# Lister des serveurs DNS pour le réseau
option domain-name-servers 192.168.0.1;

# Informer les clients de la présence d'un serveur de temps local
ntp-servers 192.168.0.1

# Gérer les leases
default-lease-time 18000;
max-lease-time 36000;

# Créer les différentes classes
class "level_1" {
  match if substring (option dhcp-client-identifier,0,5) = "LAN_1";
}

class "level_2" {
  match if substring (option dhcp-client-identifier,0,5) = "LAN_2";
}

# Mettre en place le réseau local 192.168.0.0/24
subnet 192.168.0.0 netmask 255.255.255.0 {

  # Lister les options du réseau
  option subnet-mask 255.255.255.0;
  option routers 192.168.0.1;

  # Associer un nom de domaine pour la zone
  option domain-name "example.com";

  # Gérer l'update DNS (le reverse est fait par défaut)
  ddns-domainname "example.com";

  # Définir les zones DNS que DHCP doit mettre à jour
  zone example.com. {
    primary 127.0.0.1;
    key ns-example-com_rndc-key;
  }
  zone 0.168.192.in-addr.arpa.
  {
    primary 127.0.0.1;
    key ns-example-com_rndc-key;
  }

  # Gérer les machines "visiteurs"
  pool {
    deny members of "level_1";
    deny members of "level_2";
    range 192.168.0.100 192.168.0.120;
  }

  # Gérer les machines identifiées mais sans autorisation
  pool {
    allow members of "level_1";
    deny members of "level_2";
    range 192.168.0.20 192.168.0.50;
  }

  # Gérer les machines identifiées avec autorisation
  pool {
    deny members of "level_1";
    allow members of "level_2";
    range 192.168.0.10 192.168.0.15;
  }
}
Pour le serveur de temps local, il faut configurer le client dhcp en ajoutant l'option ntp-servers pour la directive request. Pour obtenir le hostname des machines clientes, il est impératif d'envoyer le hostname au serveur avec la directive send host-name

4  Les commandes

Il est possible de mettre à jour l'adresse d'un client sur l'interface eth0 par l'utilisation de la commande : dhclient eth0

5  Liens et Ressources

Les RFCs :