# python_cheats/cheatsheets/configuration_dhcp.txt

# [COURS] GUIDE DHCP AVEC ISC DHCP SERVER - ULTRA DÉTAILLÉ POUR DÉBUTANTS

## * INTRODUCTION

### Pourquoi ce guide ?

Ce guide complète le guide DNSmasq en proposant une **alternative professionnelle** : le serveur DHCP ISC.

**Différences principales :**

| Caractéristique | DNSmasq | ISC DHCP Server |
|----------------|---------|-----------------|
| **Complexité** | Simple | Plus complexe |
| **Fonctionnalités** | DHCP + DNS | DHCP uniquement |
| **Usage** | Petits réseaux | Réseaux professionnels |
| **Performance** | Léger | Robuste |
| **Logs** | Simples | Très détaillés |
| **Failover** | Non | Oui (haute disponibilité) |
| **DDNS** | Basique | Avancé |

**Quand utiliser ISC DHCP Server ?**

[OK] **OUI si :**
- Tu veux apprendre le DHCP "professionnel"
- Tu gères un réseau d'entreprise
- Tu as besoin de failover (2 serveurs DHCP en redondance)
- Tu veux une configuration très fine et détaillée
- Tu prépares une certification réseau (CCNA, LPIC, etc.)

[X] **NON si :**
- Tu veux juste un DHCP simple pour la maison
- Tu veux aussi gérer le DNS (prends DNSmasq)
- Tu débutes complètement (commence par DNSmasq)

**Dans ce guide, tu apprendras :**
- Installation et configuration d'ISC DHCP Server
- Configuration avancée (pools, classes, options)
- Mise en place d'un système de failover (2 serveurs)
- Intégration avec BIND DNS (DDNS)
- Dépannage avancé
- Scripts d'automatisation

---

## [LISTE] PRÉREQUIS

**Avant de commencer, assure-toi d'avoir :**

[OK] Une VM Linux (Ubuntu/Debian) configurée en mode pont (voir guide DNSmasq)
[OK] Une IP fixe sur la VM (192.168.1.100 dans nos exemples)
[OK] Accès Internet sur la VM
[OK] Connaissances de base en ligne de commande Linux
[OK] Avoir lu le guide DNSmasq (pour comprendre les concepts DHCP)

**Configuration réseau recommandée :**

```
[WEB] Internet
   v
[RESEAU] Box/Routeur (192.168.1.1) - DHCP DÉSACTIVÉ
   │
   ├─ [CODE] VM Linux (192.168.1.100) <- Serveur DHCP ISC
   │     └─ Distribue : 192.168.1.50 à 192.168.1.150
   │
   └─ [ECRAN] Ton PC (recevra une IP automatiquement)
```

---

## [OUTIL] ÉTAPE 1 : INSTALLATION D'ISC DHCP SERVER

### [ENTREE] Installation du paquet

**1. Mets à jour la liste des paquets**

```bash
sudo apt update
```

**Explication :**
- Rafraîchit la liste des paquets disponibles
- Nécessaire avant toute installation

---

**2. Installe ISC DHCP Server**

```bash
sudo apt install isc-dhcp-server -y
```

**Explication :**
- `isc-dhcp-server` = Le paquet du serveur DHCP professionnel
- `-y` = Accepte automatiquement l'installation

**Résultat attendu :**

```
Reading package lists... Done
Building dependency tree... Done
The following NEW packages will be installed:
  isc-dhcp-server
...
Setting up isc-dhcp-server (4.4.1-2.3ubuntu2.4) ...
Job for isc-dhcp-server.service failed because the control process exited with error code.
```

**[ATTENTION] C'est NORMAL que le service échoue au démarrage !**

**Pourquoi ?**
Le serveur tente de démarrer avec une configuration par défaut qui ne correspond pas à ton réseau. On va le configurer correctement.

---

**3. Vérifie l'installation**

```bash
dhcpd --version
```

**Résultat attendu :**

```
isc-dhcpd-4.4.1
```

**[OK] Si tu vois le numéro de version, c'est installé !**

---

### [DOSSIER] Structure des fichiers

**ISC DHCP Server utilise plusieurs fichiers :**

```
/etc/dhcp/
├── dhcpd.conf              <- Configuration principale (À ÉDITER)
├── dhcpd6.conf             <- Configuration IPv6 (on l'ignore)
└── dhcpd.conf.example      <- Exemple de configuration

/etc/default/
└── isc-dhcp-server         <- Configuration de l'interface réseau (À ÉDITER)

/var/lib/dhcp/
├── dhcpd.leases            <- Baux DHCP (base de données)
└── dhcpd.leases~           <- Sauvegarde des baux

/var/log/
└── syslog                  <- Logs du serveur DHCP
```

**Fichiers importants à connaître :**

1. **`/etc/dhcp/dhcpd.conf`** <- **LE fichier principal**
   - Contient toute la configuration DHCP
   - Plages d'IPs, options, réservations, etc.

2. **`/etc/default/isc-dhcp-server`** <- **Configuration de l'interface**
   - Dit au serveur sur quelle carte réseau écouter

3. **`/var/lib/dhcp/dhcpd.leases`** <- **Base de données des baux**
   - Liste de toutes les IPs distribuées
   - Mis à jour en temps réel

4. **`/var/log/syslog`** <- **Logs système**
   - Contient les logs de DHCP (et d'autres services)

---

## [CONFIG] ÉTAPE 2 : CONFIGURATION DE L'INTERFACE RÉSEAU

**Avant de configurer le DHCP, il faut dire au serveur sur quelle interface réseau écouter.**

### [RECHERCHE] Identifier ton interface réseau

**Commande :**

```bash
ip a
```

**Résultat (exemple) :**

```
1: lo: <LOOPBACK,UP,LOWER_UP>
    inet 127.0.0.1/8 scope host lo
       
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP>
    inet 192.168.1.100/24 brd 192.168.1.255 scope global enp0s3
         ^^^^^^^^^^^^^
    TON IP FIXE [OK]
```

**Note le nom de l'interface : `enp0s3`** (ou `eth0`, `ens33`, etc.)

---

### [NOTE] Configurer l'interface

**Édite le fichier de configuration :**

```bash
sudo nano /etc/default/isc-dhcp-server
```

**Tu verras un fichier avec plein de commentaires (#). Cherche ces lignes :**

```bash
# On what interfaces should the DHCP server (dhcpd) serve DHCP requests?
#       Separate multiple interfaces with spaces, e.g. "eth0 eth1".
INTERFACESv4=""
INTERFACESv6=""
```

**Modifie la ligne `INTERFACESv4` :**

```bash
INTERFACESv4="enp0s3"
```

**[ATTENTION] Remplace `enp0s3` par le nom de TON interface !**

**Explication :**
- `INTERFACESv4` = Liste des interfaces pour IPv4
- `"enp0s3"` = Notre interface réseau
- Si tu as plusieurs interfaces : `"enp0s3 enp0s8"`
- `INTERFACESv6` = Pour IPv6 (on ne l'utilise pas ici)

**Exemple de configuration complète :**

```bash
# ═══════════════════════════════════════════════════════════════
# CONFIGURATION DES INTERFACES - ISC DHCP SERVER
# ═══════════════════════════════════════════════════════════════

# Defaults for isc-dhcp-server (sourced by /etc/init.d/isc-dhcp-server)

# Path to dhcpd's config file (default: /etc/dhcp/dhcpd.conf).
DHCPDv4_CONF=/etc/dhcp/dhcpd.conf
DHCPDv6_CONF=/etc/dhcp/dhcpd6.conf

# Path to dhcpd's PID file (default: /var/run/dhcpd.pid).
DHCPDv4_PID=/var/run/dhcpd.pid
DHCPDv6_PID=/var/run/dhcpd6.pid

# Interface(s) sur laquelle le serveur DHCP doit écouter
INTERFACESv4="enp0s3"
INTERFACESv6=""
```

**Sauvegarde : `Ctrl + O`, `Entrée`, `Ctrl + X`**

---

## [NOTE] ÉTAPE 3 : CONFIGURATION DHCP BASIQUE

### [NETTOYAGE] Sauvegarder l'ancien fichier de configuration

```bash
sudo cp /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.original
```

**Pourquoi ?**
Le fichier d'origine contient plein d'exemples et de commentaires (300+ lignes). On garde une copie au cas où.

---

### [EDIT] Créer une configuration simple

**Vide le fichier et crée une nouvelle configuration :**

```bash
sudo nano /etc/dhcp/dhcpd.conf
```

**Supprime tout le contenu et remplace par ceci :**

```bash
# ═══════════════════════════════════════════════════════════════
# CONFIGURATION ISC DHCP SERVER - BASIQUE
# ═══════════════════════════════════════════════════════════════
# Créé le : 2024-12-16
# Pour : Réseau local 192.168.1.0/24
# ═══════════════════════════════════════════════════════════════

# ───────────────────────────────────────────────────────────────
# 1. PARAMÈTRES GLOBAUX
# ───────────────────────────────────────────────────────────────

# Ce serveur est le serveur DHCP AUTORITAIRE sur ce réseau
authoritative;

# Explication :
# "authoritative" signifie que ce serveur DHCP a AUTORITÉ sur ce réseau.
# 
# Conséquences :
# - Si un client demande une IP que le serveur ne connaît pas,
#   le serveur envoie un message DHCPNAK (refus) au lieu d'ignorer.
# - Important pour éviter que des clients gardent de vieilles IPs invalides.
# - Utilise "authoritative" si c'est le SEUL serveur DHCP du réseau.
# - Utilise "not authoritative" si c'est un serveur secondaire/test.
#
# Analogie :
# C'est comme le directeur d'un hôtel qui a le registre officiel.
# Si quelqu'un prétend avoir une chambre non enregistrée,
# le directeur peut dire "Non, cette réservation n'existe pas".

# Durée de bail par défaut (si non spécifiée dans un pool)
default-lease-time 86400;

# Explication :
# 86400 secondes = 24 heures
# C'est la durée pour laquelle une IP est "prêtée" à un client.
#
# Calcul :
# 1 jour = 24 heures
# 24 heures × 60 minutes × 60 secondes = 86400 secondes
#
# Autres durées courantes :
# 3600 = 1 heure
# 7200 = 2 heures
# 43200 = 12 heures
# 86400 = 24 heures (notre choix)
# 604800 = 7 jours
#
# Pourquoi 24h ?
# - Les appareils domestiques sont généralement stables
# - Pas trop court (évite trop de renouvellements)
# - Pas trop long (libère les IPs des appareils déconnectés)

# Durée maximale de bail
max-lease-time 172800;

# Explication :
# 172800 secondes = 48 heures = 2 jours
# 
# C'est la durée MAXIMALE qu'un client peut demander.
# Même si un client demande un bail plus long, il recevra max 48h.
#
# Pourquoi avoir un maximum ?
# - Évite qu'une IP soit bloquée trop longtemps
# - Force les clients à se reconnecter régulièrement
# - Permet de mettre à jour la configuration (si changements)
#
# Calcul :
# 2 jours = 48 heures = 172800 secondes

# Fichier de log (optionnel, par défaut utilise syslog)
log-facility local7;

# Explication :
# ISC DHCP peut écrire ses logs dans différentes "facilities" syslog.
# 
# "local7" est une facility personnalisée (local0 à local7 disponibles).
# 
# Avantages :
# - Sépare les logs DHCP des autres logs système
# - Facilite le filtrage et l'analyse
# 
# Pour voir ces logs :
# sudo grep "dhcpd" /var/log/syslog
#
# Ou configurer rsyslog pour envoyer local7 dans un fichier dédié :
# (voir section avancée)

# ───────────────────────────────────────────────────────────────
# 2. OPTIONS DHCP GLOBALES (APPLICABLES À TOUS LES RÉSEAUX)
# ───────────────────────────────────────────────────────────────

# Option 3 : Passerelle par défaut (routeur)
option routers 192.168.1.1;

# Explication :
# C'est l'IP de ta Box/Routeur (la "porte de sortie" vers Internet).
# 
# Le protocole DHCP a des "options" numérotées (standardisées).
# Option 3 = Toujours la passerelle par défaut.
#
# Quand un client reçoit cette option, il configure :
# - Route par défaut : "Pour aller n'importe où, passe par 192.168.1.1"
#
# [ATTENTION] IMPORTANT : Vérifie que 192.168.1.1 est bien l'IP de ta Box !
#
# Pour trouver l'IP de ta Box :
# Sur un autre appareil qui a Internet, regarde la "passerelle".

# Option 6 : Serveurs DNS
option domain-name-servers 8.8.8.8, 8.8.4.4;

# Explication :
# Ce sont les serveurs DNS que les clients utiliseront.
# 
# 8.8.8.8 et 8.8.4.4 = Google Public DNS (gratuits, rapides, fiables).
#
# Le rôle du DNS :
# Traduire les noms (google.com) en IPs (142.250.185.78).
#
# Alternatives populaires :
# 1.1.1.1, 1.0.0.1           <- Cloudflare (très rapide, focus vie privée)
# 9.9.9.9, 149.112.112.112   <- Quad9 (bloque sites malveillants)
# 192.168.1.1                <- Ta Box (si elle fait DNS)
#
# Plusieurs DNS :
# Le premier est utilisé en priorité.
# Si le premier ne répond pas, le client essaie le second.

# Option 15 : Nom de domaine
option domain-name "local";

# Explication :
# Tous les appareils auront le suffixe ".local".
# 
# Exemple :
# - PC nommé "bureau" -> Nom complet : "bureau.local"
# - Serveur nommé "nas" -> Nom complet : "nas.local"
#
# Avantages :
# - Tu peux faire "ping bureau.local" au lieu de te rappeler l'IP
# - Organisation propre du réseau
#
# Alternatives courantes :
# - "home" -> bureau.home, nas.home
# - "lan" -> bureau.lan, nas.lan
# - "maison" -> bureau.maison, nas.maison

# Option 28 : Adresse de broadcast
option broadcast-address 192.168.1.255;

# Explication :
# C'est l'adresse pour envoyer un message à TOUS les appareils du réseau.
# 
# Pour un réseau 192.168.1.0/24, le broadcast est toujours .255
#
# Utilisé pour :
# - Découverte d'appareils sur le réseau
# - Certains protocoles (DHCP, ARP, etc.)
#
# Calcul automatique :
# Réseau : 192.168.1.0
# Masque : 255.255.255.0
# Broadcast : 192.168.1.255 (dernière adresse du réseau)

# ───────────────────────────────────────────────────────────────
# 3. DÉCLARATION DU SOUS-RÉSEAU
# ───────────────────────────────────────────────────────────────

subnet 192.168.1.0 netmask 255.255.255.0 {
    
    # Explication de la déclaration "subnet" :
    #
    # "subnet 192.168.1.0" = Adresse du réseau (pas d'une machine !)
    # "netmask 255.255.255.0" = Masque de sous-réseau
    #
    # Qu'est-ce qu'une adresse de réseau ?
    # C'est l'adresse "de base" du réseau, où tous les bits "hôte" sont à 0.
    #
    # Exemple :
    # Si ton serveur est 192.168.1.100 avec masque 255.255.255.0,
    # l'adresse du RÉSEAU est 192.168.1.0
    #
    # Le masque 255.255.255.0 signifie :
    # - Les 3 premiers octets (192.168.1) = RÉSEAU
    # - Le dernier octet (X) = HÔTE (appareil)
    #
    # Donc :
    # 192.168.1.0 = Réseau
    # 192.168.1.1 à 192.168.1.254 = Hôtes (appareils)
    # 192.168.1.255 = Broadcast
    #
    # [ATTENTION] Tu DOIS déclarer le subnet même si tu n'y distribues pas d'IPs !
    # Sinon, le serveur DHCP refuse de démarrer.
    
    # Plage d'adresses IP à distribuer (pool)
    range 192.168.1.50 192.168.1.150;
    
    # Explication :
    # "range" = Plage (étendue) d'IPs disponibles pour distribution.
    #
    # 192.168.1.50 = Première IP du pool
    # 192.168.1.150 = Dernière IP du pool
    #
    # Le serveur DHCP distribuera UNIQUEMENT des IPs entre ces deux bornes.
    #
    # Organisation suggérée du réseau :
    # 192.168.1.1         <- Box/Routeur (réservé)
    # 192.168.1.2-49      <- IPs fixes manuelles ou réservations
    # 192.168.1.50-150    <- Pool DHCP (101 IPs disponibles)
    # 192.168.1.151-254   <- Réserve pour extension future
    #
    # Nombre d'IPs disponibles :
    # 150 - 50 + 1 = 101 IPs
    #
    # Si besoin de plus d'IPs :
    # range 192.168.1.50 192.168.1.200;
    # (Donne 151 IPs)
    
    # Options spécifiques à ce subnet (écrasent les options globales)
    # Si tu ne les redéfinis pas, les valeurs globales s'appliquent.
    
    # Tu peux surcharger n'importe quelle option ici :
    # option routers 192.168.1.254;           <- Passerelle différente
    # option domain-name-servers 192.168.1.2; <- DNS local
    # default-lease-time 43200;               <- Bail de 12h
    
    # Dans notre cas, on garde les options globales (pas de redéfinition).
}

# ═══════════════════════════════════════════════════════════════
# FIN DE LA CONFIGURATION BASIQUE
# ═══════════════════════════════════════════════════════════════
#
# Cette configuration est MINIMALE mais FONCTIONNELLE.
# Elle permet de :
# - Distribuer des IPs de 192.168.1.50 à .150
# - Donner la passerelle (Box) aux clients
# - Donner les serveurs DNS Google
# - Baux de 24h (renouvelables)
#
# Pour des fonctionnalités avancées, voir les sections suivantes.
# ═══════════════════════════════════════════════════════════════
```

**Sauvegarde : `Ctrl + O`, `Entrée`, `Ctrl + X`**

---

### [OK] Vérifier la syntaxe de la configuration

**Avant de démarrer le serveur, testons si la configuration est correcte :**

```bash
sudo dhcpd -t -cf /etc/dhcp/dhcpd.conf
```

**Explication :**
- `dhcpd` = Le démon (serveur) DHCP
- `-t` = Test mode (vérifie la syntaxe sans vraiment démarrer)
- `-cf` = Config file (fichier de configuration)
- `/etc/dhcp/dhcpd.conf` = Chemin du fichier à tester

**Résultat attendu (SUCCÈS) :**

```
Internet Systems Consortium DHCP Server 4.4.1
Copyright 2004-2018 Internet Systems Consortium.
All rights reserved.
For info, please visit https://www.isc.org/software/dhcp/
Config file: /etc/dhcp/dhcpd.conf
Database file: /var/lib/dhcp/dhcpd.leases
PID file: /var/run/dhcpd.pid
```

**[OK] Si tu vois ça (sans erreur), la configuration est bonne !**

---

**Si tu vois une ERREUR :**

**Exemple d'erreur :**

```
/etc/dhcp/dhcpd.conf line 42: semicolon expected.
option routers 192.168.1.1
                           ^
Configuration file errors encountered -- exiting
```

**Signification :**
- Ligne 42 : Il manque un point-virgule (`;`)
- Le `^` pointe vers l'endroit de l'erreur

**Comment corriger :**

```bash
sudo nano /etc/dhcp/dhcpd.conf
```

**Va à la ligne 42 (dans nano : `Ctrl + _`, tape `42`, `Entrée`)**

**Ajoute le `;` manquant :**

```bash
option routers 192.168.1.1;
                          ^
                    Ajoute ici
```

**Sauvegarde et reteste :**

```bash
sudo dhcpd -t -cf /etc/dhcp/dhcpd.conf
```

**Erreurs courantes :**

| Erreur | Signification | Solution |
|--------|---------------|----------|
| `semicolon expected` | `;` manquant | Ajoute `;` à la fin de la ligne |
| `expecting subnet declaration` | Pas de `subnet` déclaré | Ajoute un bloc `subnet` |
| `bad IP address` | IP invalide | Vérifie le format (X.X.X.X) |
| `unknown option` | Option DHCP inconnue | Vérifie l'orthographe |
| `subnet ... conflicts with...` | Chevauchement de subnets | Vérifie tes plages |

---

## [RAPIDE] ÉTAPE 4 : DÉMARRER LE SERVEUR DHCP

### [BLACK_RIGHT-POINTING_TRIANGLE] Démarrage du service

**Maintenant que la configuration est correcte, démarrons le serveur :**

```bash
sudo systemctl start isc-dhcp-server
```

**Explication :**
- `systemctl` = Gestionnaire de services Linux
- `start` = Démarre le service
- `isc-dhcp-server` = Nom du service

---

**Vérifie que ça marche :**

```bash
sudo systemctl status isc-dhcp-server
```

**Résultat attendu (SUCCÈS) :**

```
[BLACK_CIRCLE] isc-dhcp-server.service - ISC DHCP IPv4 server
     Loaded: loaded (/lib/systemd/system/isc-dhcp-server.service; enabled)
     Active: active (running) since Tue 2024-12-16 10:00:00 UTC; 5s ago
                     ^^^^^^^^^^^^^^^
                IL TOURNE ! [OK]
       Docs: man:dhcpd(8)
   Main PID: 1234 (dhcpd)
      Tasks: 4 (limit: 2312)
     Memory: 4.8M
        CPU: 10ms
     CGroup: /system.slice/isc-dhcp-server.service
             └─1234 dhcpd -user dhcpd -group dhcpd -f -4 -pf /run/dhcp-server/dhcpd.pid -cf /etc/dhcp/dhcpd.conf enp0s3

Dec 16 10:00:00 ubuntu dhcpd[1234]: Internet Systems Consortium DHCP Server 4.4.1
Dec 16 10:00:00 ubuntu dhcpd[1234]: Copyright 2004-2018 Internet Systems Consortium.
Dec 16 10:00:00 ubuntu dhcpd[1234]: All rights reserved.
Dec 16 10:00:00 ubuntu dhcpd[1234]: For info, please visit https://www.isc.org/software/dhcp/
Dec 16 10:00:00 ubuntu dhcpd[1234]: Wrote 0 leases to leases file.
Dec 16 10:00:00 ubuntu dhcpd[1234]: Listening on LPF/enp0s3/08:00:27:xx:xx:xx/192.168.1.0/24
                                                   ^^^^^^^
                                          Écoute sur enp0s3 [OK]
Dec 16 10:00:00 ubuntu dhcpd[1234]: Sending on   LPF/enp0s3/08:00:27:xx:xx:xx/192.168.1.0/24
Dec 16 10:00:00 ubuntu dhcpd[1234]: Sending on   Socket/fallback/fallback-net
```

**[OK] Si tu vois "active (running)", c'est parfait ! [BRAVO]**

---

**Si tu vois "failed" (ÉCHEC) :**

```
[BLACK_CIRCLE] isc-dhcp-server.service - ISC DHCP IPv4 server
     Loaded: loaded
     Active: failed (Result: exit-code)
                     ^^^^^^
             PROBLÈME [X]
```

**Voir les détails de l'erreur :**

```bash
sudo journalctl -xeu isc-dhcp-server
```

**Explication :**
- `journalctl` = Gestionnaire de logs système
- `-x` = eXplain (explications détaillées)
- `-e` = End (va à la fin des logs)
- `-u` = Unit (service spécifique)
- `isc-dhcp-server` = Notre service

**Erreurs courantes :**

**Erreur 1 : Interface non spécifiée**

```
Not configured to listen on any interfaces!
```

**Solution :**
```bash
sudo nano /etc/default/isc-dhcp-server
```

Vérifie que `INTERFACESv4="enp0s3"` est bien défini.

---

**Erreur 2 : Subnet ne correspond pas à l'interface**

```
No subnet declaration for enp0s3 (192.168.1.100).
```

**Signification :**
L'IP de ton interface (192.168.1.100) n'est pas dans un subnet déclaré.

**Solution :**
Vérifie dans `/etc/dhcp/dhcpd.conf` que tu as bien :

```bash
subnet 192.168.1.0 netmask 255.255.255.0 {
    ...
}
```

---

**Erreur 3 : Port 67 déjà utilisé**

```
There's already a DHCP server running.
```

**Signification :**
Un autre serveur DHCP tourne (probablement DNSmasq).

**Solution :**

```bash
# Voir qui utilise le port 67
sudo netstat -tulpn | grep :67

# Si c'est DNSmasq :
sudo systemctl stop dnsmasq
sudo systemctl disable dnsmasq

# Redémarre ISC DHCP
sudo systemctl restart isc-dhcp-server
```

---

### [SYNC] Activer le démarrage automatique

**Pour que le serveur DHCP démarre automatiquement au boot de la VM :**

```bash
sudo systemctl enable isc-dhcp-server
```

**Résultat :**

```
Created symlink /etc/systemd/system/multi-user.target.wants/isc-dhcp-server.service
```

**Vérifier :**

```bash
sudo systemctl is-enabled isc-dhcp-server
```

**Résultat attendu :**

```
enabled
```

**[OK] Maintenant, le serveur DHCP se lancera automatiquement à chaque démarrage !**

---

## [TEST] ÉTAPE 5 : TESTER LE SERVEUR DHCP

### [CODE] Depuis ton PC Windows

**1. Libère l'IP actuelle**

```cmd
ipconfig /release
```

---

**2. Demande une nouvelle IP**

```cmd
ipconfig /renew
```

**Ce qui se passe (processus DORA) :**

```
1. DISCOVER
   Ton PC -> Broadcast : "Y a-t-il un serveur DHCP ?"

2. OFFER
   VM -> Ton PC : "Oui, je te propose 192.168.1.51"

3. REQUEST
   Ton PC -> Broadcast : "OK, je prends 192.168.1.51"

4. ACK
   VM -> Ton PC : "Confirmé, elle est à toi pour 24h"
```

**Durée totale : quelques millisecondes [RAPIDE]**

---

**3. Vérifie l'IP reçue**

```cmd
ipconfig /all
```

**Résultat attendu :**

```
Configuration IP de Windows

Carte Ethernet Ethernet:

   Description. . . . . . . . . . . . . . : Realtek PCIe GbE Family Controller
   Adresse physique . . . . . . . . . . . : AA-BB-CC-DD-EE-FF
   
   DHCP activé. . . . . . . . . . . . . . : Oui
                                            ^^^
                                       Activé [OK]

   Adresse IPv4. . . . . . . . . . . . . .: 192.168.1.51(préféré)
                                             ^^^^^^^^^^^^
                            Dans la plage 50-150 ! [OK]

   Masque de sous-réseau. . . . . . . . . : 255.255.255.0
   
   Bail obtenu. . . . . . . . . . . . . . : mardi 16 décembre 2024 10:30:00
   Bail expirant. . . . . . . . . . . . . : mercredi 17 décembre 2024 10:30:00
                                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
                                       24h plus tard [OK]
   
   Passerelle par défaut. . . . . . . . . : 192.168.1.1
                                             ^^^^^^^^^^^
                                       IP de la Box [OK]
   
   Serveur DHCP . . . . . . . . . . . . . : 192.168.1.100
                                             ^^^^^^^^^^^^^
                                       C'EST TA VM ! [BRAVO]
   
   Serveurs DNS. . .  . . . . . . . . . . : 8.8.8.8
                                             8.8.4.4
                                             ^^^^^^^
                                       Google DNS [OK]
```

**[BRAVO] SI TU VOIS TOUT ÇA, ÇA MARCHE ! [BRAVO]**

---

**4. Teste la connexion**

```cmd
# Ping vers la VM
ping 192.168.1.100

# Ping vers la Box
ping 192.168.1.1

# Ping vers Internet (par IP)
ping 8.8.8.8

# Ping vers Internet (par nom)
ping google.com
```

**Tous devraient fonctionner ! [OK]**

---

### [GRAPHIQUE] Vérifier l'attribution dans la VM

**Dans la VM, vérifie les logs :**

```bash
sudo tail -f /var/log/syslog | grep dhcpd
```

**Tu devrais voir :**

```
Dec 16 10:30:00 ubuntu dhcpd[1234]: DHCPDISCOVER from aa:bb:cc:dd:ee:ff via enp0s3
Dec 16 10:30:00 ubuntu dhcpd[1234]: DHCPOFFER on 192.168.1.51 to aa:bb:cc:dd:ee:ff via enp0s3
Dec 16 10:30:00 ubuntu dhcpd[1234]: DHCPREQUEST for 192.168.1.51 (192.168.1.100) from aa:bb:cc:dd:ee:ff via enp0s3
Dec 16 10:30:00 ubuntu dhcpd[1234]: DHCPACK on 192.168.1.51 to aa:bb:cc:dd:ee:ff via enp0s3
```

**Explication ligne par ligne :**

**Ligne 1 : DHCPDISCOVER**

```
DHCPDISCOVER from aa:bb:cc:dd:ee:ff via enp0s3
               ^                    ^
               │                    └─ Interface réseau
               └────────────────────── Adresse MAC du client
```

**Signification :**
Le client (ton PC) diffuse : "Y a-t-il un serveur DHCP ?"

---

**Ligne 2 : DHCPOFFER**

```
DHCPOFFER on 192.168.1.51 to aa:bb:cc:dd:ee:ff via enp0s3
            ^                ^
            │                └─ À qui (MAC du client)
            └──────────────── IP proposée
```

**Signification :**
Le serveur répond : "Je te propose 192.168.1.51"

---

**Ligne 3 : DHCPREQUEST**

```
DHCPREQUEST for 192.168.1.51 (192.168.1.100) from aa:bb:cc:dd:ee:ff via enp0s3
               ^              ^                    ^
               │              │                    └─ Client
               │              └──────────────────── Serveur choisi
               └─────────────────────────────────── IP demandée
```

**Signification :**
Le client accepte : "OK, je prends 192.168.1.51 du serveur 192.168.1.100"

---

**Ligne 4 : DHCPACK**

```
DHCPACK on 192.168.1.51 to aa:bb:cc:dd:ee:ff via enp0s3
          ^               ^
          │               └─ Client
          └──────────────── IP confirmée
```

**Signification :**
Le serveur confirme : "C'est confirmé, 192.168.1.51 est à toi pour 24h"

---

### [LISTE] Voir les baux actifs

**Le fichier des baux contient toutes les IPs distribuées :**

```bash
cat /var/lib/dhcp/dhcpd.leases
```

**Résultat (exemple) :**

```
# The format of this file is documented in the dhcpd.leases(5) manual page.
# This lease file was written by isc-dhcp-4.4.1

# authoring-byte-order entry is generated, DO NOT DELETE
authoring-byte-order little-endian;

lease 192.168.1.51 {
  starts 2 2024/12/16 10:30:00;
  ends 3 2024/12/17 10:30:00;
  cltt 2 2024/12/16 10:30:00;
  binding state active;
  next binding state free;
  rewind binding state free;
  hardware ethernet aa:bb:cc:dd:ee:ff;
  uid "\001\252\273\314\335\356\377";
  client-hostname "DESKTOP-PC";
}
```

**Décryptage :**

```bash
lease 192.168.1.51 {
      ^^^^^^^^^^^^
  IP attribuée
```

---

```bash
  starts 2 2024/12/16 10:30:00;
         ^ ^
         │ └─ Date et heure de début
         └─── Jour de la semaine (0=dimanche, 1=lundi, 2=mardi, etc.)
```

**Début du bail :** Mardi 16 décembre 2024 à 10h30

---

```bash
  ends 3 2024/12/17 10:30:00;
       ^ ^
       │ └─ Date et heure de fin
       └─── Jour de la semaine (3=mercredi)
```

**Fin du bail :** Mercredi 17 décembre 2024 à 10h30 (24h plus tard)

---

```bash
  cltt 2 2024/12/16 10:30:00;
```

**Client Last Transaction Time** = Dernière interaction avec le client

---

```bash
  binding state active;
```

**État du bail :** `active` = Actif, en cours d'utilisation

**Autres états possibles :**
- `free` = Libre, disponible
- `backup` = Sauvegardé (système de failover)
- `expired` = Expiré
- `released` = Libéré par le client

---

```bash
  hardware ethernet aa:bb:cc:dd:ee:ff;
                    ^^^^^^^^^^^^^^^^^
              Adresse MAC du client
```

**Identifiant unique de la carte réseau**

---

```bash
  client-hostname "DESKTOP-PC";
                  ^^^^^^^^^^
            Nom d'hôte du client
```

**Le nom de l'ordinateur (fourni par le client)**

---

### [GRAPHIQUE] Commandes pratiques pour analyser les baux

**Voir UNIQUEMENT les IPs actives :**

```bash
grep "lease" /var/lib/dhcp/dhcpd.leases | grep -v "#" | awk '{print $2}'
```

**Résultat :**

```
192.168.1.51
192.168.1.52
192.168.1.53
```

---

**Compter le nombre d'IPs distribuées :**

```bash
grep "binding state active" /var/lib/dhcp/dhcpd.leases | wc -l
```

**Résultat (exemple) :**

```
3
^
3 appareils connectés
```

---

**Voir les IPs avec les noms d'hôtes :**

```bash
grep -A 5 "binding state active" /var/lib/dhcp/dhcpd.leases | grep -E "lease|client-hostname" | paste - -
```

**Résultat (exemple) :**

```
lease 192.168.1.51 {    client-hostname "DESKTOP-PC";
lease 192.168.1.52 {    client-hostname "iPhone-Pierre";
lease 192.168.1.53 {    client-hostname "MacBook-Pro";
```

---

## [OUTIL] CONFIGURATION AVANCÉE

### [IMPORTANT] Créer des réservations DHCP (IPs fixes)

**Une réservation = attribuer une IP fixe basée sur l'adresse MAC**

**Avantages :**
- L'IP ne change JAMAIS
- Gestion centralisée (tout dans le fichier de config)
- Pas besoin de configurer l'appareil individuellement

**Édite la configuration :**

```bash
sudo nano /etc/dhcp/dhcpd.conf
```

**Ajoute APRÈS la déclaration `subnet` :**

```bash
# ───────────────────────────────────────────────────────────────
# 4. RÉSERVATIONS DHCP (HÔTES AVEC IPS FIXES)
# ───────────────────────────────────────────────────────────────

# Réservation pour le PC de bureau
host bureau {
    hardware ethernet aa:bb:cc:dd:ee:ff;
    fixed-address 192.168.1.55;
    option host-name "bureau";
}

# Explication :
#
# "host bureau" = Nom de la réservation (libre, pour identification)
#
# "hardware ethernet aa:bb:cc:dd:ee:ff" = Adresse MAC de l'appareil
#   [ATTENTION] CHANGE PAR TON ADRESSE MAC !
#   Pour la trouver :
#   - Windows : ipconfig /all -> "Adresse physique"
#   - Mac : ifconfig -> "ether"
#   - Linux : ip link show
#
# "fixed-address 192.168.1.55" = L'IP fixe à TOUJOURS donner
#   Tu peux choisir n'importe quelle IP de ton réseau.
#   Conseil : Prends une IP en dehors de ta plage DHCP (50-150)
#   pour éviter les conflits potentiels.
#
# "option host-name" = Nom d'hôte (optionnel)
#   Le client recevra ce nom.

# Réservation pour un serveur NAS
host nas {
    hardware ethernet 11:22:33:44:55:66;
    fixed-address 192.168.1.10;
    option host-name "nas";
    # Options spécifiques pour ce host
    # option routers 192.168.1.254;
}

# Réservation pour une imprimante
host imprimante-hp {
    hardware ethernet 22:33:44:55:66:77;
    fixed-address 192.168.1.20;
    option host-name "imprimante";
}

# Réservation pour un Raspberry Pi
host raspberry {
    hardware ethernet b8:27:eb:xx:xx:xx;
    fixed-address 192.168.1.30;
    option host-name "rpi";
    default-lease-time 604800;  # 7 jours (plus stable)
}
```

**Sauvegarde et redémarre le serveur :**

```bash
sudo systemctl restart isc-dhcp-server
```

---

**Sur l'appareil concerné, renouvelle l'IP :**

**Windows :**

```cmd
ipconfig /release
ipconfig /renew
ipconfig /all
```

**Tu devrais recevoir exactement l'IP réservée (ex: 192.168.1.55) !**

---

### [GRAPHIQUE] Créer plusieurs pools (plages) avec des paramètres différents

**Scénario :**

Tu veux 2 plages :
- **Plage A** (50-100) : Invités, bail court (2h)
- **Plage B** (101-150) : Appareils permanents, bail long (7 jours)

**[ATTENTION] ISC DHCP ne peut pas avoir plusieurs `range` dans un même subnet.**

**Solution : Utiliser les "pools" (piscines d'IPs)**

**Édite la configuration :**

```bash
sudo nano /etc/dhcp/dhcpd.conf
```

**Remplace le `subnet` par ceci :**

```bash
subnet 192.168.1.0 netmask 255.255.255.0 {
    
    # Pas de "range" global ici
    
    # OPTIONS COMMUNES À TOUS LES POOLS
    option routers 192.168.1.1;
    option domain-name-servers 8.8.8.8, 8.8.4.4;
    option domain-name "local";
    option broadcast-address 192.168.1.255;
    
    # ───────────────────────────────────────────────────────────
    # POOL 1 : INVITÉS (BAIL COURT)
    # ───────────────────────────────────────────────────────────
    
    pool {
        # Plage d'IPs pour ce pool
        range 192.168.1.50 192.168.1.100;
        
        # Bail de 2 heures (7200 secondes)
        default-lease-time 7200;
        max-lease-time 14400;  # 4 heures max
        
        # Optionnel : Permet SEULEMENT certains clients
        # allow unknown-clients;  # Autoriser appareils inconnus
        # deny unknown-clients;   # Bloquer appareils inconnus
        
        # Tu peux ajouter des options spécifiques à ce pool
        # option domain-name "guest.local";
    }
    
    # ───────────────────────────────────────────────────────────
    # POOL 2 : APPAREILS PERMANENTS (BAIL LONG)
    # ───────────────────────────────────────────────────────────
    
    pool {
        # Plage d'IPs pour ce pool
        range 192.168.1.101 192.168.1.150;
        
        # Bail de 7 jours (604800 secondes)
        default-lease-time 604800;
        max-lease-time 1209600;  # 14 jours max
        
        # Optionnel : Réserver ce pool aux clients connus
        # deny unknown-clients;
        
        # Options spécifiques
        # option domain-name "perm.local";
    }
}
```

**Comment ISC DHCP choisit le pool ?**

1. Le client demande une IP
2. Le serveur regarde TOUS les pools du subnet
3. Il choisit un pool basé sur :
   - Les règles `allow`/`deny`
   - La disponibilité des IPs
   - L'ordre de déclaration (si plusieurs possibles)

**[ATTENTION] Attention :** Sans règles `allow`/`deny`, un client peut recevoir une IP de N'IMPORTE QUEL pool !

---

### [OBJECTIF] Utiliser des classes pour catégoriser les clients

**Scénario avancé :**

Tu veux diriger automatiquement les clients vers différents pools selon leur type :
- **Téléphones/Tablettes** -> Pool invités (bail court)
- **PC/Laptops** -> Pool permanent (bail long)

**Solution : Classes DHCP**

**Édite la configuration :**

```bash
sudo nano /etc/dhcp/dhcpd.conf
```

**Ajoute AVANT le `subnet` :**

```bash
# ───────────────────────────────────────────────────────────────
# CLASSES DHCP (CATÉGORIES DE CLIENTS)
# ───────────────────────────────────────────────────────────────

# Classe pour les appareils mobiles (téléphones, tablettes)
class "mobiles" {
    match if substring (option vendor-class-identifier, 0, 7) = "Android"
          or substring (option vendor-class-identifier, 0, 6) = "iPhone"
          or substring (option vendor-class-identifier, 0, 4) = "iPad";
}

# Explication :
#
# "class" = Définit une catégorie de clients
#
# "match if" = Condition pour appartenir à cette classe
#
# "option vendor-class-identifier" = Identifiant fourni par le client
#   Chaque OS/appareil envoie un identifiant :
#   - Android : "Android-..."
#   - iPhone : "iPhone OS..."
#   - iPad : "iPad..."
#   - Windows : "MSFT 5.0"
#   - Mac : "AAPLBM..."
#
# "substring(..., 0, 7)" = Prend les 7 premiers caractères
#
# On vérifie si ces caractères correspondent à "Android", "iPhone", etc.

# Classe pour les ordinateurs
class "computers" {
    match if substring (option vendor-class-identifier, 0, 4) = "MSFT"
          or substring (option vendor-class-identifier, 0, 4) = "AAPL";
}

# Classe basée sur l'adresse MAC (exemple pour IoT)
class "iot-devices" {
    match if binary-to-ascii(16, 8, ":", substring(hardware, 1, 3)) = "b8:27:eb"
          or binary-to-ascii(16, 8, ":", substring(hardware, 1, 3)) = "dc:a6:32";
}

# Explication :
#
# "binary-to-ascii" = Convertit l'adresse MAC en texte
# "substring(hardware, 1, 3)" = Prend les 3 premiers octets de la MAC
#
# Les 3 premiers octets = OUI (Organizationally Unique Identifier)
# Identifient le fabricant :
# - b8:27:eb = Raspberry Pi Foundation
# - dc:a6:32 = Raspberry Pi Foundation (aussi)
# - Etc.
#
# Tu peux trouver les OUI sur : https://maclookup.app/

# ───────────────────────────────────────────────────────────────
# UTILISATION DES CLASSES DANS LES POOLS
# ───────────────────────────────────────────────────────────────

subnet 192.168.1.0 netmask 255.255.255.0 {
    option routers 192.168.1.1;
    option domain-name-servers 8.8.8.8, 8.8.4.4;
    
    # POOL POUR MOBILES
    pool {
        range 192.168.1.50 192.168.1.100;
        default-lease-time 7200;   # 2 heures
        max-lease-time 14400;       # 4 heures
        
        # N'accepter QUE les clients de la classe "mobiles"
        allow members of "mobiles";
    }
    
    # POOL POUR ORDINATEURS
    pool {
        range 192.168.1.101 192.168.1.140;
        default-lease-time 86400;   # 24 heures
        max-lease-time 604800;       # 7 jours
        
        # N'accepter QUE les clients de la classe "computers"
        allow members of "computers";
    }
    
    # POOL POUR IoT
    pool {
        range 192.168.1.141 192.168.1.150;
        default-lease-time 604800;  # 7 jours
        max-lease-time 2592000;      # 30 jours
        
        # N'accepter QUE les clients de la classe "iot-devices"
        allow members of "iot-devices";
    }
    
    # POOL PAR DÉFAUT (pour ceux qui ne matchent aucune classe)
    pool {
        range 192.168.1.200 192.168.1.220;
        default-lease-time 43200;   # 12 heures
        
        # N'accepter QUE les clients qui ne sont dans AUCUNE classe
        deny members of "mobiles";
        deny members of "computers";
        deny members of "iot-devices";
    }
}
```

**Redémarre le serveur :**

```bash
sudo systemctl restart isc-dhcp-server
```

**Maintenant :**
- Ton iPhone recevra une IP entre .50 et .100 (bail 2h)
- Ton PC recevra une IP entre .101 et .140 (bail 24h)
- Ton Raspberry Pi recevra une IP entre .141 et .150 (bail 7 jours)

**C'est PUISSANT ! [RAPIDE]**

---

### [LIEN] Intégration avec BIND DNS (DDNS - Dynamic DNS)

**DDNS = Dynamic DNS = DNS dynamique**

**Problème :**
- Un appareil reçoit une IP : `192.168.1.51`
- Tu veux pouvoir faire `ping mon-pc` au lieu de `ping 192.168.1.51`
- Mais l'IP peut changer (si pas de réservation)

**Solution : DDNS**
- Quand le serveur DHCP donne une IP, il met à jour AUTOMATIQUEMENT le serveur DNS
- Le nom `mon-pc.local` pointe toujours vers la bonne IP

**Configuration (aperçu avancé) :**

**1. Installe BIND (serveur DNS)**

```bash
sudo apt install bind9 bind9utils
```

---

**2. Génère une clé TSIG (authentification DHCP <-> DNS)**

```bash
sudo tsig-keygen -a HMAC-SHA256 dhcp-dns-key > /etc/bind/dhcp-dns-key.key
```

**Résultat (exemple de clé) :**

```
key "dhcp-dns-key" {
    algorithm hmac-sha256;
    secret "xyzABC123...==";
};
```

---

**3. Configure BIND pour accepter les mises à jour DDNS**

```bash
sudo nano /etc/bind/named.conf.local
```

**Ajoute :**

```bash
include "/etc/bind/dhcp-dns-key.key";

zone "local" {
    type master;
    file "/var/lib/bind/db.local";
    allow-update { key dhcp-dns-key; };
};

zone "1.168.192.in-addr.arpa" {
    type master;
    file "/var/lib/bind/db.192.168.1";
    allow-update { key dhcp-dns-key; };
};
```

---

**4. Configure ISC DHCP pour mettre à jour BIND**

```bash
sudo nano /etc/dhcp/dhcpd.conf
```

**Ajoute AU DÉBUT du fichier :**

```bash
# ───────────────────────────────────────────────────────────────
# CONFIGURATION DDNS (DNS DYNAMIQUE)
# ───────────────────────────────────────────────────────────────

# Inclure la clé TSIG
include "/etc/bind/dhcp-dns-key.key";

# Autoriser les mises à jour DNS
ddns-update-style interim;

# Mettre à jour les enregistrements A (nom -> IP)
update-static-leases on;

# Serveur DNS à mettre à jour
zone local. {
    primary 127.0.0.1;
    key dhcp-dns-key;
}

zone 1.168.192.in-addr.arpa. {
    primary 127.0.0.1;
    key dhcp-dns-key;
}

# ───────────────────────────────────────────────────────────────
# RESTE DE LA CONFIGURATION
# ───────────────────────────────────────────────────────────────
```

---

**5. Redémarre les services**

```bash
sudo systemctl restart bind9
sudo systemctl restart isc-dhcp-server
```

---

**Maintenant :**

1. Un PC demande une IP
2. ISC DHCP lui donne : `192.168.1.51`
3. ISC DHCP contacte BIND DNS automatiquement
4. BIND crée un enregistrement : `mon-pc.local -> 192.168.1.51`
5. Tu peux faire `ping mon-pc.local` depuis n'importe où sur le réseau !

**[DOCS] Note :** Cette configuration DDNS est avancée. Pour un guide détaillé, consulte la documentation de BIND9.

---

## [HOT] CONFIGURATION HAUTE DISPONIBILITÉ (FAILOVER)

### [REFLEXION] Qu'est-ce que le failover ?

**Failover = Basculement automatique en cas de panne**

**Scénario sans failover :**

```
[CODE] Serveur DHCP Principal (192.168.1.100)
   │
   ├─ Distribue les IPs normalement [OK]
   │
   [IMPACT] PANNE ! (coupure électrique, crash, etc.)
   │
   [X] Plus de serveur DHCP !
   [X] Les nouveaux appareils ne peuvent pas se connecter
   [X] Les renouvellements de bail échouent
```

**Scénario AVEC failover :**

```
[CODE] Serveur DHCP Principal (192.168.1.100)
   │
   ^v Synchronisation continue
   │
[CODE] Serveur DHCP Secondaire (192.168.1.101)
   │
   [IMPACT] Le principal tombe en panne
   │
   [OK] Le secondaire prend le relais AUTOMATIQUEMENT
   [OK] Aucune interruption de service
```

**Avantages :**
- **Haute disponibilité** : Pas d'interruption de service
- **Redondance** : Si un serveur tombe, l'autre continue
- **Synchronisation** : Les deux serveurs partagent les infos

**Utilité :**
- [OK] Réseaux professionnels critiques
- [OK] Centres de données
- [OK] Apprentissage de concepts avancés
- [X] Maison (overkill, mais fun à apprendre !)

---

### [OUTILS] Configuration du Failover

**Prérequis :**
- 2 VMs Linux avec ISC DHCP installé
- **VM1 (Principale)** : 192.168.1.100
- **VM2 (Secondaire)** : 192.168.1.101
- Les 2 sur le même réseau en mode pont

---

#### [OUTIL] Configuration de la VM PRINCIPALE (192.168.1.100)

**Édite `/etc/dhcp/dhcpd.conf` :**

```bash
sudo nano /etc/dhcp/dhcpd.conf
```

**Remplace TOUT le contenu par :**

```bash
# ═══════════════════════════════════════════════════════════════
# CONFIGURATION FAILOVER - SERVEUR PRINCIPAL
# ═══════════════════════════════════════════════════════════════

authoritative;
default-lease-time 86400;
max-lease-time 172800;
log-facility local7;

# ───────────────────────────────────────────────────────────────
# CONFIGURATION FAILOVER
# ───────────────────────────────────────────────────────────────

failover peer "dhcp-failover" {
    # Ce serveur est le PRIMARY (principal)
    primary;
    
    # Adresse IP de ce serveur (principal)
    address 192.168.1.100;
    
    # Port pour communiquer avec le peer
    port 647;
    
    # Adresse IP du serveur secondaire
    peer address 192.168.1.101;
    
    # Port du serveur secondaire
    peer port 647;
    
    # Durée maximale de réponse attendue (secondes)
    max-response-delay 60;
    
    # Durée avant de considérer le peer comme down
    max-unacked-updates 10;
    
    # Temps avant de passer en "partner-down" (secondes)
    mclt 3600;  # Maximum Client Lead Time
    
    # Comment partager les IPs entre les serveurs
    split 128;  # 50/50 (valeur de 0 à 255)
    
    # Temps d'attente avant de récupérer les IPs du peer down
    load balance max seconds 3;
}

# Explication des paramètres :
#
# "primary" = Ce serveur est le principal (l'autre sera "secondary")
#
# "address" = L'IP de CE serveur
#
# "peer address" = L'IP de l'AUTRE serveur
#
# "port" / "peer port" = Ports pour communiquer (647 par défaut)
#
# "max-response-delay" = Attente max pour une réponse (60s)
#   Si le peer ne répond pas dans ce délai, alerte.
#
# "max-unacked-updates" = Nombre de mises à jour sans confirmation
#   Si le peer ne confirme pas 10 mises à jour, il est considéré down.
#
# "mclt" = Maximum Client Lead Time (3600s = 1h)
#   Le temps max pendant lequel le principal peut donner des IPs
#   sans confirmation du secondaire.
#   Important pour éviter que les deux donnent la même IP.
#
# "split" = Répartition des IPs (valeur de 0 à 255)
#   128 = 50/50 (chaque serveur gère 50% des IPs)
#   192 = 75/25 (principal gère 75%, secondaire 25%)
#   64 = 25/75 (principal gère 25%, secondaire 75%)
#
# "load balance max seconds" = Délai avant de prendre les IPs du peer

# ───────────────────────────────────────────────────────────────
# OPTIONS GLOBALES
# ───────────────────────────────────────────────────────────────

option routers 192.168.1.1;
option domain-name-servers 8.8.8.8, 8.8.4.4;
option domain-name "local";
option broadcast-address 192.168.1.255;

# ───────────────────────────────────────────────────────────────
# DÉCLARATION DU SUBNET AVEC FAILOVER
# ───────────────────────────────────────────────────────────────

subnet 192.168.1.0 netmask 255.255.255.0 {
    
    # Pool avec failover
    pool {
        # Référence au peer failover
        failover peer "dhcp-failover";
        
        # Plage d'IPs gérée par les deux serveurs
        range 192.168.1.50 192.168.1.150;
        
        # Le "split 128" ci-dessus signifie :
        # - Principal gère : 192.168.1.50 à .100 environ
        # - Secondaire gère : 192.168.1.101 à .150 environ
        # La répartition exacte est dynamique.
    }
}

# ═══════════════════════════════════════════════════════════════
# FIN DE LA CONFIGURATION PRINCIPALE
# ═══════════════════════════════════════════════════════════════
```

---

#### [OUTIL] Configuration de la VM SECONDAIRE (192.168.1.101)

**Sur la VM2, édite `/etc/dhcp/dhcpd.conf` :**

```bash
sudo nano /etc/dhcp/dhcpd.conf
```

**Remplace par :**

```bash
# ═══════════════════════════════════════════════════════════════
# CONFIGURATION FAILOVER - SERVEUR SECONDAIRE
# ═══════════════════════════════════════════════════════════════

# [ATTENTION] NE PAS METTRE "authoritative" sur le secondaire
# (Seul le principal est autoritaire)
default-lease-time 86400;
max-lease-time 172800;
log-facility local7;

# ───────────────────────────────────────────────────────────────
# CONFIGURATION FAILOVER
# ───────────────────────────────────────────────────────────────

failover peer "dhcp-failover" {
    # Ce serveur est le SECONDARY (secondaire)
    secondary;
    
    # Adresse IP de ce serveur (secondaire)
    address 192.168.1.101;
    
    # Port pour communiquer
    port 647;
    
    # Adresse IP du serveur principal
    peer address 192.168.1.100;
    
    # Port du serveur principal
    peer port 647;
    
    # Durée maximale de réponse attendue
    max-response-delay 60;
    
    # Durée avant de considérer le peer comme down
    max-unacked-updates 10;
    
    # Temps d'attente avant de récupérer les IPs du peer down
    load balance max seconds 3;
}

# ───────────────────────────────────────────────────────────────
# OPTIONS GLOBALES (IDENTIQUES AU PRINCIPAL)
# ───────────────────────────────────────────────────────────────

option routers 192.168.1.1;
option domain-name-servers 8.8.8.8, 8.8.4.4;
option domain-name "local";
option broadcast-address 192.168.1.255;

# ───────────────────────────────────────────────────────────────
# DÉCLARATION DU SUBNET AVEC FAILOVER
# ───────────────────────────────────────────────────────────────

subnet 192.168.1.0 netmask 255.255.255.0 {
    
    # Pool avec failover (IDENTIQUE AU PRINCIPAL)
    pool {
        # Référence au peer failover
        failover peer "dhcp-failover";
        
        # MÊME PLAGE que le principal
        range 192.168.1.50 192.168.1.150;
    }
}

# ═══════════════════════════════════════════════════════════════
# FIN DE LA CONFIGURATION SECONDAIRE
# ═══════════════════════════════════════════════════════════════
```

**[ATTENTION] DIFFÉRENCES CLÉS entre principal et secondaire :**

| Paramètre | Principal | Secondaire |
|-----------|-----------|------------|
| `authoritative` | [OK] Oui | [X] Non |
| Rôle failover | `primary` | `secondary` |
| `mclt` | [OK] Présent | [X] Absent |
| `split` | [OK] Présent | [X] Absent |

---

#### [HOT] Autoriser la communication failover (pare-feu)

**Sur les DEUX VMs :**

```bash
# Autoriser le port 647 (failover)
sudo ufw allow 647/tcp

# Autoriser le port 847 (omapi - gestion à distance)
sudo ufw allow 847/tcp

# Vérifier
sudo ufw status
```

---

#### [BLACK_RIGHT-POINTING_TRIANGLE] Démarrer les serveurs

**SUR LE PRINCIPAL (VM1) D'ABORD :**

```bash
sudo systemctl restart isc-dhcp-server
sudo systemctl status isc-dhcp-server
```

**Attends 10 secondes, PUIS sur le SECONDAIRE (VM2) :**

```bash
sudo systemctl restart isc-dhcp-server
sudo systemctl status isc-dhcp-server
```

**[ATTENTION] IMPORTANT : Démarre TOUJOURS le principal avant le secondaire !**

---

#### [RECHERCHE] Vérifier la synchronisation

**Sur le PRINCIPAL, vérifie les logs :**

```bash
sudo tail -f /var/log/syslog | grep dhcpd
```

**Tu devrais voir :**

```
dhcpd: failover peer dhcp-failover: I move from startup to normal
dhcpd: failover peer dhcp-failover: peer moves from startup to normal
```

**[OK] "move to normal" = Les serveurs sont synchronisés !**

---

**Sur le SECONDAIRE, même chose :**

```bash
sudo tail -f /var/log/syslog | grep dhcpd
```

**Tu verras aussi :**

```
dhcpd: failover peer dhcp-failover: I move from startup to normal
```

---

#### [TEST] Tester le failover

**Test 1 : Attribution normale**

Sur ton PC :

```cmd
ipconfig /release
ipconfig /renew
ipconfig /all
```

**Note le serveur DHCP qui a répondu.**

**Tu verras soit `192.168.1.100` soit `192.168.1.101`** (selon le split).

---

**Test 2 : Panne du principal**

**Sur le PRINCIPAL (VM1), ARRÊTE le serveur DHCP :**

```bash
sudo systemctl stop isc-dhcp-server
```

**Simule une "panne".**

---

**Sur ton PC, renouvelle ENCORE :**

```cmd
ipconfig /release
ipconfig /renew
ipconfig /all
```

**Serveur DHCP :** Tu devrais maintenant voir `192.168.1.101` (le secondaire) !

**[OK] Le secondaire a pris le relais automatiquement ! [BRAVO]**

---

**Test 3 : Retour du principal**

**Redémarre le principal (VM1) :**

```bash
sudo systemctl start isc-dhcp-server
```

**Attends 10-15 secondes pour la resynchronisation.**

**Sur ton PC, renouvelle :**

```cmd
ipconfig /release
ipconfig /renew
```

**Les deux serveurs travaillent à nouveau ensemble !**

---

### [GRAPHIQUE] États du failover

**Les serveurs peuvent être dans différents états :**

| État | Description |
|------|-------------|
| `startup` | Démarrage, attente du peer |
| `normal` | Tout fonctionne, synchronisé |
| `communications-interrupted` | Perte de contact avec le peer |
| `partner-down` | Le peer est considéré down, prise de relais totale |
| `potential-conflict` | Conflit potentiel (ex: les deux démarrent en même temps) |
| `recover` | Récupération après une panne |
| `recover-done` | Récupération terminée |

**Pour voir l'état actuel :**

```bash
sudo grep "failover peer" /var/log/syslog | tail -5
```

---

## [LISTE] SCRIPTS D'AUTOMATISATION

### [RECHERCHE] Script de surveillance des baux

**Créer un script pour voir rapidement les IPs actives :**

```bash
sudo nano /usr/local/bin/dhcp-status.sh
```

**Contenu :**

```bash
#!/bin/bash
# ═══════════════════════════════════════════════════════════════
# SCRIPT DE SURVEILLANCE DHCP
# ═══════════════════════════════════════════════════════════════

echo "═════════════════════════════════════════════════════════"
echo "  ÉTAT DU SERVEUR DHCP ISC"
echo "═════════════════════════════════════════════════════════"
echo ""

# Vérifier si le service tourne
if systemctl is-active --quiet isc-dhcp-server; then
    echo "[OK] Serveur DHCP : ACTIF"
else
    echo "[X] Serveur DHCP : INACTIF"
    exit 1
fi

echo ""
echo "─────────────────────────────────────────────────────────"
echo "  BAUX ACTIFS"
echo "─────────────────────────────────────────────────────────"
echo ""

# Compter les baux actifs
ACTIVE_LEASES=$(grep "binding state active" /var/lib/dhcp/dhcpd.leases | wc -l)
echo "Nombre total de baux actifs : $ACTIVE_LEASES"
echo ""

# Afficher les détails des baux actifs
echo "IP              | MAC               | Nom d'hôte         | Expiration"
echo "────────────────┼───────────────────┼────────────────────┼─────────────────────"

awk '
    /^lease/ { ip=$2 }
    /hardware ethernet/ { mac=$3; gsub(";","",mac) }
    /client-hostname/ { 
        hostname=$2
        gsub("\"","",hostname)
        gsub(";","",hostname)
    }
    /ends/ {
        end_date=$2" "$3" "$4
        gsub(";","",end_date)
        if (ip && mac) {
            printf "%-15s | %-17s | %-18s | %s\n", ip, mac, hostname, end_date
        }
    }
    /}/ { ip=""; mac=""; hostname="" }
' /var/lib/dhcp/dhcpd.leases | grep -A 100 "binding state active" | head -n $ACTIVE_LEASES

echo ""
echo "─────────────────────────────────────────────────────────"
echo "  STATISTIQUES"
echo "─────────────────────────────────────────────────────────"
echo ""

# Plage configurée
RANGE_START=$(grep "range" /etc/dhcp/dhcpd.conf | awk '{print $2}' | sed 's/;//')
RANGE_END=$(grep "range" /etc/dhcp/dhcpd.conf | awk '{print $3}' | sed 's/;//')

echo "Plage DHCP : $RANGE_START - $RANGE_END"

# Calculer le nombre total d'IPs dans la plage
LAST_OCTET_START=$(echo $RANGE_START | awk -F. '{print $4}')
LAST_OCTET_END=$(echo $RANGE_END | awk -F. '{print $4}')
TOTAL_IPS=$((LAST_OCTET_END - LAST_OCTET_START + 1))

echo "IPs disponibles dans la plage : $TOTAL_IPS"
echo "IPs utilisées : $ACTIVE_LEASES"
echo "IPs libres : $((TOTAL_IPS - ACTIVE_LEASES))"

# Taux d'utilisation
USAGE_PERCENT=$((ACTIVE_LEASES * 100 / TOTAL_IPS))
echo "Taux d'utilisation : $USAGE_PERCENT%"

echo ""
echo "═════════════════════════════════════════════════════════"
```

**Rendre le script exécutable :**

```bash
sudo chmod +x /usr/local/bin/dhcp-status.sh
```

**Utilisation :**

```bash
sudo dhcp-status.sh
```

**Résultat (exemple) :**

```
═════════════════════════════════════════════════════════
  ÉTAT DU SERVEUR DHCP ISC
═════════════════════════════════════════════════════════

[OK] Serveur DHCP : ACTIF

─────────────────────────────────────────────────────────
  BAUX ACTIFS
─────────────────────────────────────────────────────────

Nombre total de baux actifs : 3

IP              | MAC               | Nom d'hôte         | Expiration
────────────────┼───────────────────┼────────────────────┼─────────────────────
192.168.1.51    | aa:bb:cc:dd:ee:ff | DESKTOP-PC         | 2024/12/17 10:30:00
192.168.1.52    | 11:22:33:44:55:66 | iPhone-Pierre      | 2024/12/17 11:00:00
192.168.1.53    | 22:33:44:55:66:77 | MacBook-Pro        | 2024/12/17 10:45:00

─────────────────────────────────────────────────────────
  STATISTIQUES
─────────────────────────────────────────────────────────

Plage DHCP : 192.168.1.50 - 192.168.1.150
IPs disponibles dans la plage : 101
IPs utilisées : 3
IPs libres : 98
Taux d'utilisation : 2%

═════════════════════════════════════════════════════════
```

**[IMPORTANT] Ajouter en alias pour accès rapide :**

```bash
echo "alias dhcp-status='sudo /usr/local/bin/dhcp-status.sh'" >> ~/.bashrc
source ~/.bashrc
```

**Maintenant, tape juste :**

```bash
dhcp-status
```

---

### [EMAIL] Script d'alerte par email

**Créer un script qui t'envoie un email quand le serveur DHCP tombe :**

```bash
sudo nano /usr/local/bin/dhcp-check.sh
```

**Contenu :**

```bash
#!/bin/bash
# ═══════════════════════════════════════════════════════════════
# SCRIPT DE SURVEILLANCE AVEC ALERTE EMAIL
# ═══════════════════════════════════════════════════════════════

# Configuration
EMAIL="ton-email@example.com"  # [ATTENTION] CHANGE PAR TON EMAIL
LOG_FILE="/var/log/dhcp-monitor.log"

# Fonction d'envoi d'email
send_alert() {
    SUBJECT="$1"
    MESSAGE="$2"
    echo "$MESSAGE" | mail -s "$SUBJECT" "$EMAIL"
    echo "$(date): Alert envoyée - $SUBJECT" >> "$LOG_FILE"
}

# Vérifier si le service tourne
if ! systemctl is-active --quiet isc-dhcp-server; then
    send_alert "[ATTENTION] DHCP Server DOWN" "Le serveur DHCP ISC est inactif sur $(hostname). Vérification immédiate requise."
    exit 1
fi

# Vérifier si le service écoute sur le port 67
if ! netstat -tulpn | grep -q ":67.*dhcpd"; then
    send_alert "[ATTENTION] DHCP Server - Port Problem" "Le serveur DHCP ne répond pas sur le port 67."
    exit 1
fi

# Vérifier le taux d'utilisation des IPs
ACTIVE_LEASES=$(grep "binding state active" /var/lib/dhcp/dhcpd.leases | wc -l)
RANGE_START=$(grep "range" /etc/dhcp/dhcpd.conf | awk '{print $2}' | sed 's/;//' | head -1)
RANGE_END=$(grep "range" /etc/dhcp/dhcpd.conf | awk '{print $3}' | sed 's/;//' | head -1)
LAST_OCTET_START=$(echo $RANGE_START | awk -F. '{print $4}')
LAST_OCTET_END=$(echo $RANGE_END | awk -F. '{print $4}')
TOTAL_IPS=$((LAST_OCTET_END - LAST_OCTET_START + 1))
USAGE_PERCENT=$((ACTIVE_LEASES * 100 / TOTAL_IPS))

# Alerte si utilisation > 90%
if [ $USAGE_PERCENT -gt 90 ]; then
    send_alert "[ATTENTION] DHCP Pool Almost Full" "Le pool DHCP est utilisé à $USAGE_PERCENT%. IPs utilisées : $ACTIVE_LEASES / $TOTAL_IPS"
fi

# Tout va bien
echo "$(date): Vérification OK - $ACTIVE_LEASES/$TOTAL_IPS IPs utilisées ($USAGE_PERCENT%)" >> "$LOG_FILE"
```

**Rendre exécutable :**

```bash
sudo chmod +x /usr/local/bin/dhcp-check.sh
```

---

**Installer `mailutils` pour envoyer des emails :**

```bash
sudo apt install mailutils
```

---

**Configurer une tâche cron (vérification toutes les 5 minutes) :**

```bash
sudo crontab -e
```

**Ajoute :**

```bash
*/5 * * * * /usr/local/bin/dhcp-check.sh
```

**Explication :**
- `*/5` = Toutes les 5 minutes
- `* * * *` = Tous les jours, toutes les heures
- Exécute le script de vérification

**Maintenant, tu recevras un email si :**
- Le serveur DHCP tombe
- Le pool est presque plein (>90%)

---

## 🆘 DÉPANNAGE AVANCÉ

### [RECHERCHE] Analyser les logs en détail

**Voir les logs DHCP en temps réel avec filtre :**

```bash
sudo tail -f /var/log/syslog | grep --line-buffered dhcpd | grep -v "DHCPREQUEST\|DHCPACK"
```

**Explication :**
- Exclut les renouvellements normaux (REQUEST/ACK)
- Montre uniquement les nouvelles attributions et les erreurs

---

**Chercher les erreurs spécifiques :**

```bash
sudo grep "error\|warning\|failed" /var/log/syslog | grep dhcpd
```

---

**Voir toutes les attributions d'aujourd'hui :**

```bash
sudo grep "$(date +%b\ %d)" /var/log/syslog | grep DHCPACK
```

---

### [BUG] Problèmes courants et solutions

**Problème 1 : "No subnet declaration for..."**

**Erreur :**

```
No subnet declaration for enp0s3 (192.168.1.100).
** Ignoring requests on enp0s3.  If this is not what
   you want, please write a subnet declaration
```

**Cause :**
L'IP de l'interface (192.168.1.100) n'est pas dans un subnet déclaré.

**Solution :**

Ajoute une déclaration `subnet` qui INCLUT l'IP de ton serveur :

```bash
subnet 192.168.1.0 netmask 255.255.255.0 {
    ...
}
```

**L'IP 192.168.1.100 est bien dans 192.168.1.0/24 -> OK**

---

**Problème 2 : "bind: Address already in use"**

**Erreur :**

```
Can't bind to dhcp address: Address already in use
```

**Cause :**
Un autre service utilise le port 67 (probablement DNSmasq).

**Solution :**

```bash
# Voir qui utilise le port
sudo netstat -tulpn | grep :67

# Arrêter le service conflictuel
sudo systemctl stop dnsmasq
sudo systemctl disable dnsmasq

# Redémarrer ISC DHCP
sudo systemctl restart isc-dhcp-server
```

---

**Problème 3 : Les clients reçoivent des IPs mais pas Internet**

**Symptômes :**
- `ipconfig /all` montre une IP de la plage DHCP [OK]
- `ping 192.168.1.100` fonctionne [OK]
- `ping 192.168.1.1` NE fonctionne PAS [X]
- `ping google.com` NE fonctionne PAS [X]

**Cause :**
Mauvaise configuration de la passerelle.

**Solution :**

**1. Vérifie l'IP de ta Box :**

Sur un autre appareil qui a Internet :

```cmd
ipconfig | findstr "Passerelle"
```

**Note l'IP (ex: 192.168.1.1 ou 192.168.1.254)**

**2. Corrige dans `/etc/dhcp/dhcpd.conf` :**

```bash
option routers 192.168.1.1;  # <- Change par la bonne IP
```

**3. Redémarre :**

```bash
sudo systemctl restart isc-dhcp-server
```

**4. Sur le client, renouvelle :**

```cmd
ipconfig /release
ipconfig /renew
```

---

**Problème 4 : Conflit d'IP (2 appareils ont la même IP)**

**Symptômes :**
- Message "IP address conflict" sur Windows
- Connexion réseau instable

**Causes possibles :**
1. Deux serveurs DHCP actifs (Box + VM)
2. IP fixe manuelle dans la plage DHCP
3. Réservation mal configurée

**Solutions :**

**1. Désactive le DHCP de la Box**

**2. Vérifie les réservations :**

```bash
sudo grep "fixed-address" /etc/dhcp/dhcpd.conf
```

**Assure-toi qu'aucune réservation n'est en double.**

**3. Exclure les IPs fixes de la plage DHCP :**

Si tu as des appareils avec IPs fixes manuelles (192.168.1.10, .11, etc.), assure-toi qu'elles NE SONT PAS dans la plage DHCP.

**Exemple de bonne organisation :**

```
192.168.1.1-49   <- IPs fixes manuelles (en dehors du pool)
192.168.1.50-150 <- Pool DHCP
```

---

**Problème 5 : Failover en état "communications-interrupted"**

**Symptômes :**

```
failover peer dhcp-failover: I move from normal to communications-interrupted
```

**Cause :**
Le serveur secondaire ne répond plus.

**Solutions :**

**1. Vérifie que le secondaire tourne :**

Sur la VM2 :

```bash
sudo systemctl status isc-dhcp-server
```

**2. Vérifie la connectivité réseau :**

Depuis la VM1 :

```bash
ping 192.168.1.101
```

**3. Vérifie le pare-feu :**

Sur les DEUX VMs :

```bash
sudo ufw status
```

**Assure-toi que le port 647 est autorisé.**

**4. Vérifie les logs du secondaire :**

Sur la VM2 :

```bash
sudo tail -50 /var/log/syslog | grep dhcpd
```

**5. Redémarre les serveurs dans le bon ordre :**

**VM1 (principal) :**

```bash
sudo systemctl restart isc-dhcp-server
```

**Attends 10 secondes.**

**VM2 (secondaire) :**

```bash
sudo systemctl restart isc-dhcp-server
```

---

## [DOCS] COMMANDES DE RÉFÉRENCE RAPIDE

### Gestion du service

```bash
# Démarrer
sudo systemctl start isc-dhcp-server

# Arrêter
sudo systemctl stop isc-dhcp-server

# Redémarrer
sudo systemctl restart isc-dhcp-server

# Recharger la configuration (sans couper les connexions)
sudo systemctl reload isc-dhcp-server

# Voir le statut
sudo systemctl status isc-dhcp-server

# Activer au démarrage
sudo systemctl enable isc-dhcp-server

# Désactiver au démarrage
sudo systemctl disable isc-dhcp-server

# Voir si le service est actif
systemctl is-active isc-dhcp-server

# Voir si le service est activé au démarrage
systemctl is-enabled isc-dhcp-server
```

---

### Configuration

```bash
# Éditer la configuration principale
sudo nano /etc/dhcp/dhcpd.conf

# Tester la syntaxe SANS démarrer
sudo dhcpd -t -cf /etc/dhcp/dhcpd.conf

# Éditer l'interface réseau
sudo nano /etc/default/isc-dhcp-server

# Sauvegarder la configuration
sudo cp /etc/dhcp/dhcpd.conf /etc/dhcp/dhcpd.conf.backup.$(date +%Y%m%d)

# Restaurer une sauvegarde
sudo cp /etc/dhcp/dhcpd.conf.backup.YYYYMMDD /etc/dhcp/dhcpd.conf
```

---

### Baux (leases)

```bash
# Voir tous les baux
cat /var/lib/dhcp/dhcpd.leases

# Voir uniquement les baux actifs
grep -A 5 "binding state active" /var/lib/dhcp/dhcpd.leases

# Compter les baux actifs
grep "binding state active" /var/lib/dhcp/dhcpd.leases | wc -l

# Voir les IPs distribuées
grep "lease" /var/lib/dhcp/dhcpd.leases | awk '{print $2}' | sort -u

# Chercher un bail par IP
grep -A 10 "lease 192.168.1.51" /var/lib/dhcp/dhcpd.leases

# Chercher un bail par MAC
grep -B 5 "aa:bb:cc:dd:ee:ff" /var/lib/dhcp/dhcpd.leases

# Chercher tous les baux d'une adresse MAC
grep -A 10 "hardware ethernet aa:bb:cc:dd:ee:ff" /var/lib/dhcp/dhcpd.leases

# Supprimer un bail manuellement (ARRÊTE LE SERVICE D'ABORD)
sudo systemctl stop isc-dhcp-server
sudo nano /var/lib/dhcp/dhcpd.leases  # Supprimer manuellement le bloc
sudo systemctl start isc-dhcp-server
```

---

### Logs

```bash
# Voir les logs en temps réel
sudo tail -f /var/log/syslog | grep dhcpd

# Voir les 100 dernières lignes
sudo tail -n 100 /var/log/syslog | grep dhcpd

# Voir les logs d'aujourd'hui
sudo grep "$(date +%b\ %d)" /var/log/syslog | grep dhcpd

# Voir les erreurs
sudo grep "error\|warning\|fail" /var/log/syslog | grep dhcpd

# Voir les attributions (DHCPACK)
sudo grep DHCPACK /var/log/syslog

# Voir les découvertes (DHCPDISCOVER)
sudo grep DHCPDISCOVER /var/log/syslog

# Compter les attributions d'aujourd'hui
sudo grep "$(date +%b\ %d)" /var/log/syslog | grep DHCPACK | wc -l

# Chercher les logs d'une IP spécifique
sudo grep "192.168.1.51" /var/log/syslog | grep dhcpd

# Chercher les logs d'une MAC spécifique
sudo grep "aa:bb:cc:dd:ee:ff" /var/log/syslog | grep dhcpd
```

---

### Réseau

```bash
# Voir qui écoute sur le port DHCP
sudo netstat -tulpn | grep :67

# Voir les connexions actives de dhcpd
sudo netstat -anp | grep dhcpd

# Voir les processus DHCP en cours
ps aux | grep dhcp

# Tester la connectivité vers le peer (failover)
ping -c 4 192.168.1.101

# Vérifier que le port failover est ouvert
telnet 192.168.1.101 647
```

---

### Dépannage

```bash
# Démarrer en mode debug (au premier plan)
sudo dhcpd -f -d -cf /etc/dhcp/dhcpd.conf enp0s3

# Explication :
# -f = foreground (premier plan, pas en arrière-plan)
# -d = debug (mode verbeux)
# -cf = config file
# enp0s3 = interface

# Vérifier la syntaxe sans démarrer
sudo dhcpd -t -cf /etc/dhcp/dhcpd.conf

# Voir les messages d'erreur détaillés
sudo journalctl -xeu isc-dhcp-server

# Voir tous les logs depuis le démarrage
sudo journalctl -u isc-dhcp-server

# Suivre les logs en temps réel (systemd)
sudo journalctl -fu isc-dhcp-server

# Redémarrer complètement le service (kill + start)
sudo killall dhcpd
sudo systemctl start isc-dhcp-server
```

---

## [COURS] CONCEPTS THÉORIQUES APPROFONDIS

### [RESEAU] Le protocole DHCP en profondeur

#### Messages DHCP

**Il existe 8 types de messages DHCP :**

| Message | Direction | Description |
|---------|-----------|-------------|
| **DHCPDISCOVER** | Client -> Server (Broadcast) | "Y a-t-il un serveur DHCP ?" |
| **DHCPOFFER** | Server -> Client (Unicast) | "Oui, voici une IP disponible" |
| **DHCPREQUEST** | Client -> Server (Broadcast) | "J'accepte cette IP" |
| **DHCPACK** | Server -> Client (Unicast) | "Confirmé, l'IP est à toi" |
| **DHCPNAK** | Server -> Client (Unicast) | "Refusé, cette IP n'est plus valide" |
| **DHCPDECLINE** | Client -> Server | "Je refuse cette IP (conflit détecté)" |
| **DHCPRELEASE** | Client -> Server | "Je libère mon IP" |
| **DHCPINFORM** | Client -> Server | "J'ai déjà une IP, donne-moi juste les options" |

---

#### Processus DORA détaillé

**Phase 1 : DISCOVER**

```
Client (MAC: aa:bb:cc:dd:ee:ff)
   v
   Envoie un paquet UDP :
   - Source IP : 0.0.0.0 (il n'a pas encore d'IP)
   - Destination IP : 255.255.255.255 (broadcast)
   - Source Port : 68 (port client DHCP)
   - Destination Port : 67 (port serveur DHCP)
   - Contenu : "J'ai besoin d'une IP"
   v
   Tous les serveurs DHCP du réseau reçoivent ce message
```

**Phase 2 : OFFER**

```
Serveur DHCP (192.168.1.100)
   v
   Vérifie ses pools d'IPs disponibles
   Trouve : 192.168.1.51 (libre)
   Marque temporairement comme "offerte"
   v
   Envoie un paquet UDP :
   - Source IP : 192.168.1.100
   - Destination IP : 192.168.1.51 (l'IP proposée) OU broadcast
   - Destination MAC : aa:bb:cc:dd:ee:ff (unicast layer 2)
   - Contenu : 
     * IP proposée : 192.168.1.51
     * Masque : 255.255.255.0
     * Passerelle : 192.168.1.1
     * DNS : 8.8.8.8, 8.8.4.4
     * Lease time : 86400s
     * Serveur DHCP : 192.168.1.100
```

**Phase 3 : REQUEST**

```
Client
   v
   Peut recevoir PLUSIEURS OFFER (si plusieurs serveurs DHCP)
   Choisit une offre (généralement la première reçue)
   v
   Envoie un paquet UDP (BROADCAST) :
   - Source IP : 0.0.0.0
   - Destination IP : 255.255.255.255 (broadcast)
   - Contenu :
     * IP demandée : 192.168.1.51
     * Serveur choisi : 192.168.1.100
   v
   Les AUTRES serveurs DHCP voient ce message et libèrent leurs offres
```

**Phase 4 : ACK**

```
Serveur DHCP choisi (192.168.1.100)
   v
   Enregistre le bail définitif dans /var/lib/dhcp/dhcpd.leases
   v
   Envoie un paquet UDP :
   - Destination : Client (aa:bb:cc:dd:ee:ff)
   - Contenu : "Confirmé ! Tous les détails à nouveau"
   v
   Client configure son interface réseau avec les paramètres reçus
```

**Durée totale du processus DORA : 50-500 millisecondes [RAPIDE]**

---

#### Renouvellement de bail

**Quand un bail est à 50% de son temps :**

```
Bail obtenu à : 10:00:00
Durée : 24 heures
Expiration : 10:00:00 (lendemain)
   v
À 22:00:00 (12h après, 50%)
   v
Le client envoie un DHCPREQUEST (unicast vers le serveur)
   v
Le serveur répond avec un DHCPACK (renouvellement)
   v
Nouveau bail : 24h à partir de 22:00:00
Expiration repoussée à : 22:00:00 (surlendemain)
```

**Si le serveur ne répond pas à 50% :**

```
À 87.5% du bail (21h)
   v
Le client envoie un DHCPREQUEST (BROADCAST)
   v
N'importe quel serveur DHCP peut répondre
```

**Si toujours pas de réponse :**

```
À 100% (expiration)
   v
Le client perd son IP
   v
Retourne à DHCPDISCOVER (recommence DORA)
```

---

### [SECURISE] Options DHCP standardisées

**Le protocole DHCP définit plus de 250 options numérotées.**

**Voici les plus importantes :**

| Option | Nom | Description | Exemple |
|--------|-----|-------------|---------|
| **1** | Subnet Mask | Masque de sous-réseau | 255.255.255.0 |
| **3** | Router | Passerelle par défaut | 192.168.1.1 |
| **6** | DNS Servers | Serveurs DNS | 8.8.8.8, 8.8.4.4 |
| **12** | Host Name | Nom d'hôte | mon-pc |
| **15** | Domain Name | Nom de domaine | local |
| **28** | Broadcast Address | Adresse de broadcast | 192.168.1.255 |
| **42** | NTP Servers | Serveurs de temps | 192.168.1.1 |
| **44** | WINS Servers | Serveurs WINS (Windows) | 192.168.1.10 |
| **51** | Lease Time | Durée du bail | 86400 (secondes) |
| **53** | DHCP Message Type | Type de message DHCP | 1-8 |
| **54** | DHCP Server ID | ID du serveur DHCP | 192.168.1.100 |
| **58** | Renewal Time | Temps de renouvellement (T1) | 43200 (50%) |
| **59** | Rebinding Time | Temps de re-liaison (T2) | 75600 (87.5%) |
| **66** | TFTP Server | Serveur TFTP (PXE boot) | 192.168.1.100 |
| **67** | Bootfile Name | Fichier de boot | pxelinux.0 |
| **121** | Classless Static Routes | Routes statiques | Avancé |

**Configuration dans ISC DHCP :**

```bash
# Option 1 : Masque (généralement pas besoin de le spécifier explicitement)
option subnet-mask 255.255.255.0;

# Option 3 : Passerelle
option routers 192.168.1.1;

# Option 6 : DNS
option domain-name-servers 8.8.8.8, 8.8.4.4;

# Option 12 : Nom d'hôte (dans un bloc "host")
option host-name "mon-serveur";

# Option 15 : Domaine
option domain-name "local";

# Option 28 : Broadcast
option broadcast-address 192.168.1.255;

# Option 42 : NTP (serveurs de temps)
option ntp-servers 192.168.1.1;

# Option 44 : WINS (pour Windows)
option netbios-name-servers 192.168.1.10;

# Option 51 : Lease time (se configure différemment)
default-lease-time 86400;

# Option 66 : TFTP Server (pour PXE)
option tftp-server-name "192.168.1.100";

# Option 67 : Bootfile
option bootfile-name "pxelinux.0";

# Options personnalisées (si besoin)
option space custom;
option custom.my-option code 200 = text;
option custom.my-option "valeur-personnalisée";
```

---

### [CONSTRUCTION] Architecture des pools et subnets

**Hiérarchie de configuration ISC DHCP :**

```
Configuration globale (s'applique partout)
   v
Subnet (réseau spécifique)
   v
Pool (groupe d'IPs dans le subnet)
   v
Host (réservation individuelle)
```

**Exemple de hiérarchie complète :**

```bash
# ─────────────────────────────────────────────────────────────
# NIVEAU 1 : GLOBAL (s'applique à TOUT)
# ─────────────────────────────────────────────────────────────

authoritative;
default-lease-time 86400;
max-lease-time 172800;
option domain-name "monentreprise.local";

# ─────────────────────────────────────────────────────────────
# NIVEAU 2 : SUBNET (réseau spécifique)
# ─────────────────────────────────────────────────────────────

subnet 192.168.1.0 netmask 255.255.255.0 {
    
    # Options spécifiques à ce subnet (écrasent le global)
    option routers 192.168.1.1;
    option domain-name-servers 192.168.1.10, 8.8.8.8;
    option broadcast-address 192.168.1.255;
    
    # ─────────────────────────────────────────────────────────
    # NIVEAU 3 : POOL (groupe d'IPs)
    # ─────────────────────────────────────────────────────────
    
    pool {
        range 192.168.1.50 192.168.1.100;
        
        # Options spécifiques à ce pool (écrasent subnet et global)
        default-lease-time 7200;  # 2h (au lieu de 24h global)
        option domain-name "invites.monentreprise.local";
        
        # Règles d'accès
        allow unknown-clients;
    }
    
    pool {
        range 192.168.1.101 192.168.1.150;
        
        # Options différentes pour ce pool
        default-lease-time 604800;  # 7 jours
        deny unknown-clients;  # Réservé aux clients connus
    }
    
    # ─────────────────────────────────────────────────────────
    # NIVEAU 4 : HOST (réservation individuelle)
    # ─────────────────────────────────────────────────────────
    
    host serveur-web {
        hardware ethernet 11:22:33:44:55:66;
        fixed-address 192.168.1.10;
        
        # Options ultra-spécifiques à cet hôte
        option host-name "web-server";
        option domain-name "www.monentreprise.local";
        default-lease-time infinite;  # Jamais d'expiration
    }
}

# ─────────────────────────────────────────────────────────────
# AUTRE SUBNET (réseau différent)
# ─────────────────────────────────────────────────────────────

subnet 192.168.2.0 netmask 255.255.255.0 {
    option routers 192.168.2.1;
    option domain-name-servers 192.168.2.10;
    
    range 192.168.2.50 192.168.2.200;
}
```

**Règle d'héritage :**

**Le plus spécifique l'emporte :**

```
Host > Pool > Subnet > Global
```

**Exemple :**

```
Global : default-lease-time 86400 (24h)
Subnet : default-lease-time 43200 (12h)  <- écrase le global
Pool : default-lease-time 7200 (2h)      <- écrase le subnet
Host : default-lease-time infinite       <- écrase tout
```

**Un client dans ce host aura un bail INFINI.**

---

## [WEB] CAS D'USAGE AVANCÉS

### [ENTREPRISE] Réseau d'entreprise multi-VLAN

**Scénario :**

Une entreprise avec plusieurs départements, chacun sur un VLAN séparé.

```
┌─────────────────────────────────────────────────────────┐
│  SWITCH MANAGEABLE (avec VLANs)                         │
├─────────────────────────────────────────────────────────┤
│                                                         │
│  VLAN 10 : Direction         (192.168.10.0/24)          │
│  VLAN 20 : Comptabilité      (192.168.20.0/24)          │
│  VLAN 30 : IT                (192.168.30.0/24)          │
│  VLAN 40 : Invités           (192.168.40.0/24)          │
│                                                         │
└─────────────────────────────────────────────────────────┘
                          v
                  Serveur DHCP (192.168.30.10)
           Avec interfaces virtuelles pour chaque VLAN
```

**Configuration ISC DHCP :**

```bash
# ═══════════════════════════════════════════════════════════════
# CONFIGURATION MULTI-VLAN ENTREPRISE
# ═══════════════════════════════════════════════════════════════

authoritative;
log-facility local7;

# ───────────────────────────────────────────────────────────────
# VLAN 10 : DIRECTION (sécurisé, bail long)
# ───────────────────────────────────────────────────────────────

subnet 192.168.10.0 netmask 255.255.255.0 {
    option routers 192.168.10.1;
    option domain-name-servers 192.168.30.10, 8.8.8.8;
    option domain-name "direction.entreprise.local";
    
    range 192.168.10.50 192.168.10.100;
    default-lease-time 604800;   # 7 jours
    max-lease-time 1209600;       # 14 jours
    
    # Réservé aux appareils connus
    deny unknown-clients;
    
    # Options de sécurité supplémentaires
    option netbios-node-type 8;  # Désactive NetBIOS
}

# ───────────────────────────────────────────────────────────────
# VLAN 20 : COMPTABILITÉ (sécurisé, accès restreint)
# ───────────────────────────────────────────────────────────────

subnet 192.168.20.0 netmask 255.255.255.0 {
    option routers 192.168.20.1;
    option domain-name-servers 192.168.30.10, 8.8.8.8;
    option domain-name "compta.entreprise.local";
    
    range 192.168.20.50 192.168.20.150;
    default-lease-time 86400;    # 24h
    max-lease-time 604800;        # 7 jours
    
    deny unknown-clients;
}

# ───────────────────────────────────────────────────────────────
# VLAN 30 : IT (département informatique)
# ───────────────────────────────────────────────────────────────

subnet 192.168.30.0 netmask 255.255.255.0 {
    option routers 192.168.30.1;
    option domain-name-servers 192.168.30.10;
    option domain-name "it.entreprise.local";
    
    # Pas de pool DHCP (IPs fixes pour les serveurs)
    # Uniquement des réservations
}

# Réservations pour les serveurs IT
host dhcp-server {
    hardware ethernet aa:bb:cc:dd:ee:ff;
    fixed-address 192.168.30.10;
    option host-name "dhcp-server";
}

host dns-server {
    hardware ethernet 11:22:33:44:55:66;
    fixed-address 192.168.30.11;
    option host-name "dns-server";
}

# ───────────────────────────────────────────────────────────────
# VLAN 40 : INVITÉS (accès limité, bail court)
# ───────────────────────────────────────────────────────────────

subnet 192.168.40.0 netmask 255.255.255.0 {
    option routers 192.168.40.1;
    option domain-name-servers 8.8.8.8, 8.8.4.4;  # DNS externes uniquement
    option domain-name "guest.entreprise.local";
    
    range 192.168.40.50 192.168.40.200;
    default-lease-time 3600;     # 1h
    max-lease-time 7200;          # 2h max
    
    # Autoriser les appareils inconnus (invités)
    allow unknown-clients;
}
```

**Configuration des interfaces réseau (avec VLANs) :**

```bash
# /etc/netplan/01-netcfg.yaml

network:
  version: 2
  renderer: networkd
  ethernets:
    enp0s3:
      dhcp4: no
  vlans:
    enp0s3.10:
      id: 10
      link: enp0s3
      addresses:
        - 192.168.10.10/24
    enp0s3.20:
      id: 20
      link: enp0s3
      addresses:
        - 192.168.20.10/24
    enp0s3.30:
      id: 30
      link: enp0s3
      addresses:
        - 192.168.30.10/24
    enp0s3.40:
      id: 40
      link: enp0s3
      addresses:
        - 192.168.40.10/24
```

**Appliquer :**

```bash
sudo netplan apply
```

**Configuration de l'interface DHCP :**

```bash
# /etc/default/isc-dhcp-server

INTERFACESv4="enp0s3.10 enp0s3.20 enp0s3.30 enp0s3.40"
```

**Maintenant, le serveur DHCP gère 4 VLANs différents avec des politiques distinctes ! [OBJECTIF]**

---

### [ECRAN] Déploiement PXE (Network Boot)

**PXE = Preboot eXecution Environment**

**Permet de démarrer un ordinateur depuis le réseau (sans disque dur).**

**Cas d'usage :**
- Installation d'OS en masse (laboratoires informatiques)
- Diskless workstations (stations de travail sans disque)
- Récupération système
- Environnement de diagnostic

**Configuration ISC DHCP pour PXE :**

```bash
# ═══════════════════════════════════════════════════════════════
# CONFIGURATION PXE BOOT
# ═══════════════════════════════════════════════════════════════

authoritative;
default-lease-time 600;   # Bail court pour PXE (10 minutes)
max-lease-time 7200;

# ───────────────────────────────────────────────────────────────
# OPTIONS PXE GLOBALES
# ───────────────────────────────────────────────────────────────

# Option 66 : Serveur TFTP
option tftp-server-name "192.168.1.100";

# Option 67 : Fichier de boot (dépend du système client)
# Pour BIOS (Legacy)
filename "pxelinux.0";

# Pour UEFI (Modern)
# filename "bootx64.efi";

# ───────────────────────────────────────────────────────────────
# SUBNET AVEC PXE
# ───────────────────────────────────────────────────────────────

subnet 192.168.1.0 netmask 255.255.255.0 {
    option routers 192.168.1.1;
    option domain-name-servers 8.8.8.8;
    option broadcast-address 192.168.1.255;
    
    range 192.168.1.50 192.168.1.150;
    
    # Boot différent selon le type de client
    if exists user-class and option user-class = "iPXE" {
        # Client iPXE avancé
        filename "http://192.168.1.100/boot.ipxe";
    } elsif substring (option vendor-class-identifier, 0, 20) = "PXEClient:Arch:00007" {
        # Client UEFI (64-bit)
        filename "bootx64.efi";
    } elsif substring (option vendor-class-identifier, 0, 20) = "PXEClient:Arch:00000" {
        # Client BIOS (Legacy)
        filename "pxelinux.0";
    } else {
        # Par défaut (BIOS)
        filename "pxelinux.0";
    }
}

# ───────────────────────────────────────────────────────────────
# CONFIGURATION SPÉCIFIQUE PAR ARCHITECTURE
# ───────────────────────────────────────────────────────────────

class "pxeclients-bios" {
    match if substring (option vendor-class-identifier, 0, 9) = "PXEClient";
}

class "pxeclients-uefi" {
    match if substring (option vendor-class-identifier, 0, 20) = "PXEClient:Arch:00007";
}

subnet 192.168.1.0 netmask 255.255.255.0 {
    pool {
        range 192.168.1.50 192.168.1.100;
        allow members of "pxeclients-bios";
        filename "pxelinux.0";
    }
    
    pool {
        range 192.168.1.101 192.168.1.150;
        allow members of "pxeclients-uefi";
        filename "bootx64.efi";
    }
}
```

**Installation et configuration du serveur TFTP :**

```bash
# Installer TFTP
sudo apt install tftpd-hpa pxelinux syslinux-common

# Configurer TFTP
sudo nano /etc/default/tftpd-hpa
```

**Contenu :**

```bash
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/var/lib/tftpboot"
TFTP_ADDRESS="192.168.1.100:69"
TFTP_OPTIONS="--secure"
```

**Préparer les fichiers de boot :**

```bash
# Créer l'arborescence
sudo mkdir -p /var/lib/tftpboot/pxelinux.cfg

# Copier les fichiers nécessaires
sudo cp /usr/lib/PXELINUX/pxelinux.0 /var/lib/tftpboot/
sudo cp /usr/lib/syslinux/modules/bios/*.c32 /var/lib/tftpboot/

# Pour UEFI
sudo mkdir -p /var/lib/tftpboot/uefi
sudo cp /usr/lib/shim/shimx64.efi.signed /var/lib/tftpboot/uefi/bootx64.efi

# Télécharger une image d'installation (ex: Ubuntu)
cd /var/lib/tftpboot
sudo wget http://archive.ubuntu.com/ubuntu/dists/jammy/main/installer-amd64/current/legacy-images/netboot/netboot.tar.gz
sudo tar -xzf netboot.tar.gz

# Créer un fichier de configuration PXE
sudo nano /var/lib/tftpboot/pxelinux.cfg/default
```

**Contenu (exemple menu PXE) :**

```
DEFAULT menu.c32
PROMPT 0
TIMEOUT 100
MENU TITLE ========== PXE Boot Menu ==========

LABEL local
    MENU LABEL ^1) Boot from local disk
    LOCALBOOT 0

LABEL ubuntu-install
    MENU LABEL ^2) Install Ubuntu 22.04 LTS
    KERNEL ubuntu-installer/amd64/linux
    APPEND initrd=ubuntu-installer/amd64/initrd.gz

LABEL memtest
    MENU LABEL ^3) Memory Test (Memtest86+)
    KERNEL memtest86+.bin

LABEL reboot
    MENU LABEL ^4) Reboot
    COM32 reboot.c32
```

**Démarrer TFTP :**

```bash
sudo systemctl restart tftpd-hpa
sudo systemctl status tftpd-hpa
```

**Maintenant, un PC configuré pour booter en réseau (PXE) :**

1. Démarre sans OS
2. Envoie un DHCPDISCOVER
3. Reçoit une IP + les infos du serveur TFTP
4. Télécharge le bootloader (`pxelinux.0` ou `bootx64.efi`)
5. Affiche le menu PXE
6. L'utilisateur choisit l'action (installer Ubuntu, etc.)

**C'est TRÈS puissant pour les déploiements en masse ! [RAPIDE]**

---

## [OBJECTIF] EXERCICES PRATIQUES AVANCÉS

### Exercice 1 : Configuration multi-pool **

**Objectif :** Créer 2 pools avec des politiques différentes.

**Mission :**

1. Pool A (50-100) : Invités, bail 2h
2. Pool B (101-150) : Permanents, bail 7 jours
3. Tester en se connectant plusieurs fois

**Solution attendue :**

Les appareils reçoivent des IPs de différents pools et des durées de bail différentes.

---

### Exercice 2 : Classes DHCP ***

**Objectif :** Diriger automatiquement les mobiles vers le pool invités.

**Mission :**

1. Créer une classe "mobiles" (Android, iPhone)
2. Créer une classe "computers" (Windows, Mac)
3. Associer chaque classe à un pool différent
4. Tester avec un téléphone et un PC

**Solution attendue :**

Ton téléphone reçoit une IP du pool mobiles, ton PC du pool computers.

---

### Exercice 3 : Réservations multiples **

**Objectif :** Créer 5 réservations pour différents appareils.

**Mission :**

1. Trouver les MACs de 5 appareils
2. Créer une réservation pour chacun
3. Leur donner des IPs fixes (hors pool)
4. Tester que chaque appareil reçoit toujours la même IP

---

### Exercice 4 : Failover ****

**Objectif :** Mettre en place un système de haute disponibilité.

**Mission :**

1. Configurer 2 VMs en failover
2. Tester le basculement automatique
3. Observer les logs de synchronisation
4. Mesurer le temps de basculement

**Solution attendue :**

Quand le principal tombe, le secondaire prend le relais en moins de 10 secondes.

---

### Exercice 5 : Monitoring avancé *****

**Objectif :** Créer un dashboard de monitoring DHCP.

**Mission :**

1. Créer un script qui génère un rapport HTML
2. Afficher :
   - Nombre d'IPs actives
   - Graphique d'utilisation du pool
   - Liste des 10 dernières attributions
   - Alertes si >80% d'utilisation
3. Automatiser avec cron (toutes les heures)

**Bonus :** Intégrer avec un serveur web (Nginx/Apache).

---

## [GUIDE] RESSOURCES SUPPLÉMENTAIRES

### [DOCS] Documentation officielle

**ISC DHCP Server :**
- Site officiel : https://www.isc.org/dhcp/
- Manuel complet : `man dhcpd` et `man dhcpd.conf`
- Guide d'administration : `man dhcpd-options`

**RFCs (Standards) :**
- RFC 2131 : DHCP (protocole de base)
- RFC 2132 : Options DHCP
- RFC 3046 : Relay Agent Information Option
- RFC 4578 : Codes d'architecture client PXE
- RFC 7844 : Anonymity Profiles for DHCP

---

### [COURS] Formations et certifications

**Certifications mentionnant DHCP :**
- **CompTIA Network+** : Réseaux informatiques (niveau débutant)
- **Cisco CCNA** : Routing & Switching (DHCP relay, helper-address)
- **LPIC-2** : Linux Professional Institute (niveau administrateur)
- **Red Hat RHCSA/RHCE** : Administration système avancée

**Cours en ligne :**
- Udemy : "Complete Networking Fundamentals"
- Coursera : Cours de Google IT Support
- Pluralsight : "Network Administration"
- LinkedIn Learning : "Networking Foundations"

---

### [OUTILS] Outils de monitoring et gestion

**Dashboards Web :**
- **Webmin** : Interface web pour gérer Linux (inclut DHCP)
- **ISC Kea Dashboard** : Dashboard moderne pour ISC Kea (nouvelle version de DHCP)
- **phpIPAM** : Gestion d'IPs avec intégration DHCP
- **NetBox** : IPAM + DCIM (pour grandes infrastructures)

**Outils de test :**
- **dhcping** : Tester un serveur DHCP
- **nmap** : Scanner réseau (peut détecter serveurs DHCP)
- **Wireshark** : Capturer et analyser le trafic DHCP

**Installation :**

```bash
sudo apt install dhcping nmap wireshark-cli
```

**Exemples d'utilisation :**

```bash
# Tester un serveur DHCP
dhcping -s 192.168.1.100

# Scanner le réseau pour trouver serveurs DHCP
sudo nmap --script broadcast-dhcp-discover

# Capturer le trafic DHCP
sudo tcpdump -i enp0s3 -n port 67 or port 68 -vv

# Avec Wireshark (filtre)
sudo wireshark -i enp0s3 -f "port 67 or port 68"
```

---

## [BRAVO] FÉLICITATIONS !

### [TROPHEE] Ce que tu as appris

**Concepts avancés :**
- [OK] Installation et configuration d'ISC DHCP Server
- [OK] Gestion des pools et subnets
- [OK] Réservations DHCP (IPs fixes par MAC)
- [OK] Classes DHCP (catégorisation des clients)
- [OK] Failover (haute disponibilité)
- [OK] Intégration DDNS (DNS dynamique)
- [OK] PXE Boot (démarrage réseau)
- [OK] Monitoring et scripts d'automatisation

**Compétences professionnelles :**
- [OBJECTIF] Administrer un serveur DHCP d'entreprise
- [OBJECTIF] Mettre en place un système de redondance
- [OBJECTIF] Segmenter un réseau avec des politiques DHCP
- [OBJECTIF] Diagnostiquer et résoudre des problèmes complexes
- [OBJECTIF] Automatiser la surveillance du réseau
- [OBJECTIF] Déployer des systèmes via le réseau (PXE)

---

### [RAPIDE] Prochaines étapes

**Niveau Expert :**

1. **Migrer vers ISC Kea**
   - Kea est la nouvelle génération de DHCP d'ISC
   - Architecture moderne (API REST, backends SQL)
   - Haute performance et scalabilité

2. **Intégrer avec un système de monitoring**
   - Prometheus + Grafana pour métriques DHCP
   - Alertmanager pour notifications automatiques
   - Elasticsearch + Kibana pour analyse de logs

3. **Automatiser avec Ansible/Terraform**
   - Déploiement automatisé de serveurs DHCP
   - Configuration as Code
   - Infrastructure as Code

4. **IPv6 et DHCPv6**
   - Configurer DHCPv6 (DHCP pour IPv6)
   - Stateless Address Autoconfiguration (SLAAC)
   - Dual-stack (IPv4 + IPv6)

5. **Sécurité avancée**
   - DHCP Snooping (switch-level)
   - Port Security (limitation par MAC)
   - 802.1X (authentification réseau)
   - VPN intégré au DHCP

---

### [IDEE] Comparaison finale : DNSmasq vs ISC DHCP

| Critère | DNSmasq | ISC DHCP Server |
|---------|---------|-----------------|
| **Complexité** | * Simple | *** Complexe |
| **Installation** | 1 ligne | 1 ligne |
| **Configuration** | 1 fichier simple | 1 fichier détaillé |
| **DNS intégré** | [OK] Oui | [X] Non (besoin de BIND) |
| **Failover** | [X] Non | [OK] Oui (natif) |
| **Pools multiples** | [X] Limité | [OK] Avancé |
| **Classes DHCP** | [ATTENTION] Basique | [OK] Très avancé |
| **DDNS** | [ATTENTION] Basique | [OK] Complet (avec BIND) |
| **PXE Boot** | [OK] Oui | [OK] Oui (plus flexible) |
| **Performance** | [RAPIDE] Léger | [RAPIDE][RAPIDE] Robuste |
| **Logs** | [ATTENTION] Simples | [OK] Très détaillés |
| **Usage recommandé** | Maison, petit bureau | Entreprise, datacenter |
| **Communauté** | Moyenne | Large |
| **Support professionnel** | [X] Non | [OK] Oui (ISC) |

**Conclusion :**

- **Utilise DNSmasq si :**
  - Réseau domestique ou petit bureau
  - Tu veux aussi gérer le DNS
  - Tu veux quelque chose de simple et rapide
  - Tu n'as pas besoin de redondance

- **Utilise ISC DHCP si :**
  - Réseau d'entreprise professionnel
  - Tu as besoin de haute disponibilité (failover)
  - Tu veux une granularité fine (pools, classes)
  - Tu prépares une certification réseau
  - Tu veux apprendre "comme les pros"

**Les deux sont excellents dans leur domaine ! [OBJECTIF]**

---

### [NOTE] Checklist de maîtrise

**Vérifie que tu peux faire tout ça sans guide :**

**Configuration de base :**
- [ ] Installer ISC DHCP Server
- [ ] Configurer l'interface réseau
- [ ] Créer une configuration DHCP fonctionnelle
- [ ] Démarrer et activer le service
- [ ] Vérifier la syntaxe de la configuration

**Attribution d'IPs :**
- [ ] Faire en sorte qu'un PC reçoive une IP
- [ ] Vérifier l'attribution dans les logs
- [ ] Consulter les baux actifs
- [ ] Tester l'accès Internet depuis le client

**Réservations :**
- [ ] Créer une réservation DHCP
- [ ] Vérifier que l'appareil reçoit toujours la même IP
- [ ] Gérer plusieurs réservations

**Pools avancés :**
- [ ] Créer plusieurs pools avec différentes politiques
- [ ] Configurer des classes DHCP
- [ ] Associer classes et pools

**Failover :**
- [ ] Configurer 2 serveurs en failover
- [ ] Tester le basculement automatique
- [ ] Observer la synchronisation

**Monitoring :**
- [ ] Lire et interpréter les logs DHCP
- [ ] Créer des scripts de monitoring
- [ ] Automatiser la surveillance avec cron

**Dépannage :**
- [ ] Diagnostiquer une IP non attribuée
- [ ] Résoudre un conflit d'IP
- [ ] Corriger une erreur de configuration
- [ ] Débugger un problème de failover

**Si tu coches toutes ces cases, tu es un EXPERT DHCP ! [TROPHEE][BRAVO]**

---

## [BRAVO] MESSAGE FINAL

**Bravo d'avoir exploré ISC DHCP Server en profondeur !**

Tu as maintenant une compréhension **professionnelle** du DHCP. Ces compétences sont directement applicables dans le monde de l'entreprise et des infrastructures réseau critiques.

**Tu sais maintenant :**
- Comment fonctionnent les serveurs DHCP professionnels
- Comment configurer des politiques réseau avancées
- Comment garantir la haute disponibilité avec le failover
- Comment automatiser et surveiller un service réseau

**Cette expertise est rare et précieuse. Continue d'expérimenter, de casser, de réparer, et d'apprendre ! [RAPIDE]**

---

## [TEL] SUPPORT ET COMMUNAUTÉ

**Si tu as des questions :**

1. **Forums officiels ISC :** https://www.isc.org/community/
2. **Stack Overflow :** Tag `isc-dhcp-server`
3. **Reddit :** r/networking, r/homelab
4. **Discord :** Serveurs dédiés aux réseaux et au self-hosting

**Partage tes configurations et tes projets !**

La meilleure façon d'apprendre est d'enseigner et de contribuer à la communauté.

---

**Bon courage dans tes projets réseau ! [WEB]***