# python_cheats/cheatsheets/configuration_dhcp.txt

# [COURS] GUIDE DHCP SUR VIRTUALBOX - ULTRA DÉTAILLÉ POUR DÉBUTANTS ABSOLUS

## * AVANT DE COMMENCER : COMPRENDRE LES BASES

### Qu'est-ce qu'un réseau informatique ?

Imagine ton quartier avec des maisons :

```
[HOUSE_BUILDINGS] TON QUARTIER (= TON RÉSEAU LOCAL)
├─ [ACCUEIL] Maison n°1 (192.168.1.1)    <- La Poste (Box Internet)
├─ [ACCUEIL] Maison n°50 (192.168.1.50)  <- Maison vide
├─ [ACCUEIL] Maison n°51 (192.168.1.51)  <- Ta maison (PC)
├─ [ACCUEIL] Maison n°100 (192.168.1.100)<- Bibliothèque (VM)
└─ [ACCUEIL] Maison n°150 (192.168.1.150)<- Dernière maison
```

**Chaque maison a :**
- Une **adresse unique** (= adresse IP) : `192.168.1.51`
- Un **nom** (optionnel) : "Maison de Pierre"

**Pour qu'une lettre arrive :**
- L'expéditeur doit connaître **l'adresse exacte**
- Sinon, la lettre se perd ! [EMAIL]

**C'est EXACTEMENT pareil sur un réseau informatique !**

---

### Qu'est-ce qu'une adresse IP ?

**IP = Internet Protocol = Protocole Internet**

C'est comme l'adresse postale d'un appareil sur le réseau.

**Format typique :** `192.168.1.51`

**Décortiquons cette adresse :**

```
192  .  168  .  1   .  51
│       │      │      │
│       │      │      └─ Numéro de l'appareil (1 à 254)
│       │      └──────── Numéro du sous-réseau
│       └─────────────── Réseau privé type "maison/bureau"
└─────────────────────── Réseau privé
```

**Important à savoir :**

1. **192.168.X.X** = Adresses privées (pour les réseaux locaux)
   - Tu ne peux pas y accéder depuis Internet
   - C'est parfait pour la maison/l'entreprise

2. **Le dernier chiffre** = Identifiant de l'appareil
   - Peut aller de **1 à 254**
   - **1** est souvent réservé à la Box
   - **255** est réservé (adresse de broadcast)

3. **Chaque appareil doit avoir une IP UNIQUE**
   - Si 2 appareils ont la même IP -> **CONFLIT** [IMPACT]
   - Les deux ne fonctionnent plus correctement

---

### Qu'est-ce que le DHCP ? (explication très simple)

**DHCP = Dynamic Host Configuration Protocol**
(Ne retiens pas le nom, retiens juste ce qu'il fait)

**Analogie de la bibliothèque :**

**SANS DHCP (le chaos) :**
```
[UTILISATEUR] Personne 1 : "Je prends le casier n°51"
[UTILISATEUR] Personne 2 : "Moi aussi je prends le casier n°51"
[IMPACT] CONFLIT ! Qui a le casier ?
```

**AVEC DHCP (l'ordre) :**
```
[UTILISATEUR] Personne 1 : "Bonjour, j'ai besoin d'un casier"
[PERSONNE][PRO] Bibliothécaire (DHCP) : "Voici le n°51, c'est libre"
[UTILISATEUR] Personne 2 : "Bonjour, j'ai besoin d'un casier"
[PERSONNE][PRO] Bibliothécaire : "Voici le n°52, c'est libre"
[OK] Aucun conflit !
```

**Sur un réseau, c'est pareil :**

**Sans DHCP :**
- Tu dois configurer MANUELLEMENT l'IP de chaque appareil
- Risque d'oublier quelle IP est prise
- Risque de donner 2 fois la même IP

**Avec DHCP :**
- Un appareil se connecte au WiFi
- Il dit : "J'ai besoin d'une IP"
- Le serveur DHCP répond : "Voici 192.168.1.51, elle est libre"
- AUTOMATIQUE, zéro erreur [OK]

---

### Qu'est-ce que VirtualBox ?

**VirtualBox = un logiciel qui simule un ordinateur dans ton ordinateur**

```
┌─────────────────────────────────────────────┐
│  [ECRAN] TON ORDINATEUR PHYSIQUE                 │
│  (Windows / Mac / Linux)                    │
│                                             │
│  ┌───────────────────────────────────────┐  │
│  │  [PACKAGE] VirtualBox                        │  │
│  │                                       │  │
│  │  ┌─────────────────────────────────┐ │  │
│  │  │ [CODE] Machine Virtuelle (VM)      │ │  │
│  │  │ Ubuntu / Debian                 │ │  │
│  │  │                                 │ │  │
│  │  │ C'est un ordinateur "virtuel"   │ │  │
│  │  │ qui tourne DANS ton vrai PC     │ │  │
│  │  └─────────────────────────────────┘ │  │
│  └───────────────────────────────────────┘  │
└─────────────────────────────────────────────┘
```

**Avantages :**
- Tu peux tester Linux sans supprimer Windows
- Si tu casses quelque chose, ça n'affecte pas ton vrai PC
- Parfait pour apprendre sans risque !

---

## [OBJECTIF] OBJECTIF DU PROJET

### Ce qu'on va faire aujourd'hui

On va transformer ta **VM Linux** en **serveur DHCP** qui distribuera des IPs à ton **PC physique**.

**Situation de DÉPART (normale) :**
```
[WEB] Internet
   v
[RESEAU] Box/Routeur (192.168.1.1)
   │
   ├─ Distribue les IPs automatiquement (serveur DHCP intégré)
   │
   ├─ [ECRAN] Ton PC Windows/Mac
   │     Reçoit : 192.168.1.10 (par exemple)
   │
   └─ [CODE] Ta VM VirtualBox
         Reçoit : 192.168.1.15 (par exemple)
```

**Situation FINALE (ce qu'on veut) :**
```
[WEB] Internet
   v
[RESEAU] Box/Routeur (192.168.1.1)
   │
   │ [ATTENTION] DHCP désactivé sur la Box
   │ (Elle sert juste de porte vers Internet)
   │
   ├─ [CODE] VM Linux (192.168.1.100) *
   │     │
   │     └─ Serveur DHCP actif
   │        Distribue les IPs de 192.168.1.50 à .150
   │
   └─ [ECRAN] Ton PC Windows/Mac
         Reçoit son IP de la VM : 192.168.1.51
```

**Pourquoi faire ça ?**
- Pour **apprendre** comment fonctionne un serveur DHCP
- Pour avoir le **contrôle total** sur ton réseau
- Compétence utile pour l'administration réseau !

---

## [DOCS] ÉTAPE 0 : COMPRENDRE LES MODES RÉSEAU DE VIRTUALBOX

**C'est LA partie qui déroute les débutants !**

VirtualBox propose plusieurs "modes" pour connecter ta VM au réseau. Comprendre ces modes est ESSENTIEL.

### [RECHERCHE] Les différents modes réseau

#### 1⃣ NAT (Mode par défaut)

**Schéma :**
```
[WEB] Internet
   v
[RESEAU] Box (192.168.1.1)
   v
[ECRAN] Ton PC (192.168.1.10)
   v
[CODE] VM (10.0.2.15) <- IP dans un réseau ISOLÉ
```

**Ce qui se passe :**
- La VM a accès à Internet [OK]
- La VM peut parler au PC [X]
- Le PC ne peut PAS parler à la VM [X]
- La VM est dans son propre "mini-réseau" (10.0.2.X)

**Analogie :**
C'est comme si la VM habitait dans une autre ville. Elle peut téléphoner (Internet), mais personne ne peut aller la visiter.

**[X] Ne convient PAS pour notre projet** (le PC doit pouvoir parler à la VM)

---

#### 2⃣ Accès par pont (Bridged Adapter) * ON VA UTILISER ÇA

**Schéma :**
```
[WEB] Internet
   v
[RESEAU] Box (192.168.1.1)
   ├─ [ECRAN] Ton PC (192.168.1.10)
   └─ [CODE] VM (192.168.1.100) <- MÊME réseau !
```

**Ce qui se passe :**
- La VM est **sur le même réseau** que ton PC [OK]
- La VM et le PC peuvent communiquer [OK]
- La VM peut être vue comme un appareil "normal" [OK]
- La VM a la même connexion Internet que ton PC [OK]

**Analogie :**
La VM habite dans la **même rue** que ton PC. Ils peuvent se parler facilement.

**[OK] PARFAIT pour notre projet !**

---

#### 3⃣ Réseau interne (Internal Network)

**Schéma :**
```
[ECRAN] PC (192.168.1.10) <- Isolé
   
[CODE] VM1 (192.168.2.1) <-> [CODE] VM2 (192.168.2.2)
     └──── Peuvent parler entre elles ────┘
```

**Ce qui se passe :**
- Les VMs peuvent parler entre elles [OK]
- Mais PAS au PC physique [X]
- Pas d'accès Internet [X]

**Analogie :**
Les VMs habitent dans un immeuble fermé. Elles se parlent entre elles, mais personne d'autre.

**[X] Ne convient pas pour notre projet**

---

#### 4⃣ Réseau privé hôte (Host-only Adapter)

**Schéma :**
```
[ECRAN] PC (192.168.56.1)
   v
[CODE] VM (192.168.56.101)

PAS de connexion Internet [X]
```

**Ce qui se passe :**
- Le PC et la VM peuvent communiquer [OK]
- Mais pas d'accès Internet [X]

**Analogie :**
La VM habite dans ta maison, mais il n'y a pas de porte vers l'extérieur.

**[X] Ne convient pas (on veut Internet)**

---

### [OBJECTIF] Récapitulatif : quel mode choisir ?

| Mode | VM <-> PC | VM -> Internet | PC voit la VM |
|------|---------|---------------|---------------|
| NAT | [X] | [OK] | [X] |
| **Accès par pont** | **[OK]** | **[OK]** | **[OK]** |
| Réseau interne | [X] | [X] | [X] |
| Réseau privé hôte | [OK] | [X] | [OK] |

**Pour notre projet DHCP : on utilise "Accès par pont" ! ***

---

## [OUTIL] ÉTAPE 1 : CONFIGURER LE MODE RÉSEAU DANS VIRTUALBOX

### [LISTE] Prérequis

Avant de commencer, assure-toi que :
- [OK] VirtualBox est installé
- [OK] Tu as une VM Linux créée (Ubuntu, Debian, etc.)
- [OK] La VM peut démarrer normalement

---

### [VIDEO_GAME] Configuration détaillée

**1. Éteins ta VM si elle est allumée**

Dans VirtualBox, sélectionne ta VM et clique sur **"Arrêter"** ou **"Machine -> ACPI Shutdown"**.

**[ATTENTION] Important :** Tu ne peux pas changer la configuration réseau pendant que la VM tourne !

---

**2. Ouvre les paramètres de la VM**

**Méthode 1 :** Clic droit sur la VM -> **"Configuration..."**

**Méthode 2 :** Sélectionne la VM -> Clique sur **"Configuration"** (icône d'engrenage)

**Tu verras une fenêtre avec plusieurs onglets sur la gauche.**

---

**3. Va dans l'onglet "Réseau"**

Clique sur **"Réseau"** dans la liste à gauche.

**Tu verras 4 onglets : Adapter 1, Adapter 2, Adapter 3, Adapter 4**

**Explication :**
- VirtualBox peut simuler jusqu'à 4 cartes réseau
- On va configurer seulement **Adapter 1** (la première)

---

**4. Configure l'Adapter 1**

**Case à cocher : "Activer la carte réseau"**
- [OK] **Coche cette case** (elle doit être cochée)
- Si elle n'est pas cochée, la VM n'aura AUCUNE connexion réseau

```
┌─────────────────────────────────────────┐
│ [x] Activer la carte réseau               │  <- COCHE CETTE CASE
└─────────────────────────────────────────┘
```

---

**Mode d'accès réseau (le plus important !)**

Clique sur le menu déroulant :

```
┌─────────────────────────────────────────┐
│ Mode d'accès réseau : [[BLACK_DOWN-POINTING_TRIANGLE] Accès par pont]│
│                                         │
│ Options disponibles :                   │
│ • NAT                                   │
│ • Réseau NAT                            │
│ -> Accès par pont                  *    │  <- CHOISIS CELUI-CI
│ • Réseau interne                        │
│ • Réseau privé hôte                     │
│ • Pas de connexion réseau               │
└─────────────────────────────────────────┘
```

**Sélectionne : "Accès par pont"** (ou "Bridged Adapter" en anglais)

---

**Nom (l'interface réseau physique)**

**Explication :**
VirtualBox doit savoir **quelle carte réseau de ton PC** utiliser pour le "pont".

```
┌─────────────────────────────────────────┐
│ Nom : [[BLACK_DOWN-POINTING_TRIANGLE] Realtek PCIe GbE Family Con... ]│
└─────────────────────────────────────────┘
```

**Options possibles :**
- Si tu es connecté par **câble Ethernet** : Choisis la carte Ethernet
- Si tu es connecté en **WiFi** : Choisis la carte WiFi
- Si tu ne sais pas : Essaie chaque option jusqu'à ce que ça marche

**Exemples de noms courants :**
- `Realtek PCIe GbE Family Controller` <- Ethernet
- `Intel(R) Wireless-AC 9560` <- WiFi
- `Broadcom NetXtreme Gigabit Ethernet` <- Ethernet

**[IDEE] Astuce :** Choisis celle qui est **actuellement connectée à Internet** sur ton PC.

---

**Mode promiscuité**

```
┌─────────────────────────────────────────┐
│ Mode promiscuité : [[BLACK_DOWN-POINTING_TRIANGLE] Refuser]          │
└─────────────────────────────────────────┘
```

**Laisse sur : "Refuser"** (valeur par défaut)

**Explication :**
- "Refuser" = Normal, sécurisé
- "Tout autoriser" = La VM peut "écouter" tout le trafic réseau (utilisé pour analyse réseau avancée, on n'en a pas besoin)

---

**Type de carte**

```
┌─────────────────────────────────────────┐
│ Type de carte : [[BLACK_DOWN-POINTING_TRIANGLE] Intel PRO/1000 MT... ]│
└─────────────────────────────────────────┘
```

**Laisse la valeur par défaut** (généralement `Intel PRO/1000 MT Desktop`)

**Explication :**
- C'est le modèle de carte réseau virtuelle que VirtualBox simule
- Linux supporte très bien ce modèle
- Pas besoin de changer

---

**5. Valide la configuration**

Clique sur **"OK"** en bas de la fenêtre.

---

**6. Démarre ta VM**

Clique sur **"Démarrer"** (flèche verte)

Attends que ta VM démarre complètement et que tu voies l'écran de connexion.

---

### [RECHERCHE] Vérifier que ça fonctionne

**Une fois connecté dans ta VM, ouvre un terminal.**

**Commande magique pour voir les infos réseau :**

```bash
ip a
```

**Explication de la commande :**
- `ip` = programme pour gérer le réseau
- `a` = raccourci pour "address" (adresse)
- Cette commande affiche toutes les interfaces réseau et leurs IPs

**Résultat attendu (exemple) :**

```
1: lo: <LOOPBACK,UP,LOWER_UP>
    inet 127.0.0.1/8 scope host lo
       ^^^^^^^^^^
    Interface "loopback" (interne, ignore)

2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP>
    inet 192.168.1.15/24 brd 192.168.1.255 scope global dynamic enp0s3
         ^^^^^^^^^^^^
    TON IP ACTUELLE [OK]
```

**Décryptage ligne par ligne :**

```
2: enp0s3:
   ^   ^
   │   └─ Nom de l'interface réseau
   └───── Numéro de l'interface
```

**Noms courants d'interfaces :**
- `enp0s3` = Ethernet, carte 0, slot 3 (VirtualBox par défaut)
- `eth0` = Ethernet 0 (ancien système de nommage)
- `ens33` = Ethernet, slot 33 (autre nommage possible)

**[ATTENTION] IMPORTANT : Note le nom de ton interface !** Tu en auras besoin plus tard.

---

```
<BROADCAST,MULTICAST,UP,LOWER_UP>
 ^         ^         ^   ^
 │         │         │   └─ La liaison physique est active
 │         │         └───── L'interface est active
 │         └─────────────── Peut envoyer à plusieurs appareils
 └───────────────────────── Peut envoyer à tout le réseau
```

Si tu vois **"UP"**, c'est bon ! L'interface est active.

---

```
inet 192.168.1.15/24
     ^            ^
     │            └─ "/24" = Masque de sous-réseau
     └────────────── Ton adresse IP
```

**Vérifie que l'IP commence par `192.168.1.X`**

**Si tu vois :**
- `192.168.1.X` [OK] Parfait ! Tu es sur le même réseau que ta Box
- `10.0.2.X` [X] Tu es en mode NAT, retourne dans les paramètres VirtualBox
- Aucune IP [X] La carte n'est pas configurée, on va le faire à l'étape suivante

---

**Teste la connexion Internet :**

```bash
ping -c 4 google.com
```

**Explication de la commande :**
- `ping` = Envoie un petit message pour tester la connexion
- `-c 4` = Envoie 4 messages puis s'arrête (sinon ça continue à l'infini)
- `google.com` = Destination à tester

**Résultat attendu :**

```
PING google.com (142.250.185.78) 56(84) bytes of data.
64 bytes from par21s12-in-f14.1e100.net (142.250.185.78): icmp_seq=1 ttl=115 time=15.2 ms
64 bytes from par21s12-in-f14.1e100.net (142.250.185.78): icmp_seq=2 ttl=115 time=14.8 ms
64 bytes from par21s12-in-f14.1e100.net (142.250.185.78): icmp_seq=3 ttl=115 time=15.1 ms
64 bytes from par21s12-in-f14.1e100.net (142.250.185.78): icmp_seq=4 ttl=115 ms
                                                                              ^^^
                                                                        Temps de réponse

--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3005ms
                      ^^^^^^^^^^
                  AUCUNE PERTE [OK]
```

**Si ça marche :** Internet fonctionne ! [OK]

**Si ça ne marche pas :**
```
ping: google.com: Temporary failure in name resolution
```

**Solution :** Problème de DNS, on va le régler à l'étape suivante.

---

## [CONFIG] ÉTAPE 2 : DONNER UNE IP FIXE À LA VM

### [REFLEXION] Pourquoi une IP fixe ?

**Question :** Pourquoi la VM doit-elle avoir une IP fixe ?

**Réponse simple :**

Imagine que tu veux envoyer une lettre à la bibliothèque. Si la bibliothèque **déménage chaque jour**, tu ne sauras jamais où envoyer ta lettre !

**C'est pareil pour le serveur DHCP :**
- Les clients (ton PC) doivent savoir où trouver le serveur DHCP
- Si l'IP de la VM change, les clients ne peuvent plus la trouver
- **Solution :** Donner une IP fixe à la VM (qui ne changera jamais)

---

### [LISTE] Choisir l'IP fixe

**On va donner à la VM : `192.168.1.100`**

**Pourquoi ce choix ?**

```
Réseau : 192.168.1.0/24
│
├─ 192.168.1.1          <- Réservé (Box/Routeur)
├─ 192.168.1.2-49       <- Zone pour IPs manuelles
├─ 192.168.1.50-150     <- Zone DHCP (on distribue ici)
├─ 192.168.1.100        <- Notre VM (dans la zone DHCP, mais réservée)
└─ 192.168.1.151-254    <- Réserve pour l'avenir
```

**[IDEE] Conseil :** Choisis une IP dans ta plage DHCP future, tu feras une "réservation" pour elle.

---

### [OUTILS] Configuration avec Netplan (Ubuntu/Debian moderne)

**Netplan = outil de configuration réseau sous Linux (Ubuntu 18.04+)**

**1. Trouve ton fichier de configuration réseau**

```bash
ls /etc/netplan/
```

**Explication :**
- `ls` = Lister les fichiers
- `/etc/netplan/` = Dossier contenant la configuration réseau

**Résultat attendu :**

```
00-installer-config.yaml
```

ou

```
01-netcfg.yaml
```

ou

```
50-cloud-init.yaml
```

**Note le nom exact du fichier !**

---

**2. Sauvegarde l'ancienne configuration (au cas où)**

```bash
sudo cp /etc/netplan/01-netcfg.yaml /etc/netplan/01-netcfg.yaml.backup
```

**Explication :**
- `sudo` = Commande avec droits administrateur (Super User DO)
- `cp` = Copier (CoPy)
- Premier argument = fichier source
- Deuxième argument = destination (avec `.backup` pour le reconnaître)

**Pourquoi faire ça ?**
Si tu fais une erreur, tu pourras restaurer l'ancienne config.

---

**3. Édite le fichier de configuration**

```bash
sudo nano /etc/netplan/01-netcfg.yaml
```

**Explication :**
- `nano` = Éditeur de texte simple en ligne de commande
- `/etc/netplan/01-netcfg.yaml` = Fichier à éditer

**[ATTENTION] Remplace `01-netcfg.yaml` par le nom exact de TON fichier !**

---

**4. Écris la configuration (TRÈS IMPORTANTE : L'INDENTATION !)**

**SUPPRIME tout ce qu'il y a dans le fichier** et remplace par ceci :

```yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    enp0s3:
      dhcp4: no
      addresses:
        - 192.168.1.100/24
      routes:
        - to: default
          via: 192.168.1.1
      nameservers:
        addresses:
          - 8.8.8.8
          - 8.8.4.4
```

**[ATTENTION] ATTENTION CRITIQUE : L'INDENTATION EST VITALE !**

YAML (le format de ce fichier) est **HYPER SENSIBLE aux espaces**.

**Règles absolues :**
- Utilise **2 ESPACES** pour chaque niveau d'indentation
- **JAMAIS de tabulation** (appuyer sur Tab)
- Si l'indentation est incorrecte, ça ne marchera pas

**Comment vérifier ton indentation :**

```yaml
network:           <- Niveau 0 (pas d'espaces)
··version: 2       <- Niveau 1 (2 espaces)
··renderer: networkd
··ethernets:
····enp0s3:        <- Niveau 2 (4 espaces)
······dhcp4: no    <- Niveau 3 (6 espaces)
······addresses:
········- 192.168.1.100/24  <- Niveau 4 (8 espaces)
```

**Dans nano, un espace = un point dans l'illustration ci-dessus.**

---

**Explication ligne par ligne :**

```yaml
network:
```
**<- Début de la section réseau**

---

```yaml
  version: 2
```
**<- Version du format Netplan (toujours 2)**

---

```yaml
  renderer: networkd
```
**<- Programme qui va appliquer la config**
- `networkd` = Gestionnaire réseau système (systemd-networkd)
- Alternative possible : `NetworkManager` (mais networkd est plus simple)

---

```yaml
  ethernets:
```
**<- Section pour les cartes Ethernet (câble ou virtuelles)**

---

```yaml
    enp0s3:
```
**<- Nom de ton interface réseau**

**[ATTENTION] CHANGE `enp0s3` si ton interface a un autre nom !**

**Pour trouver ton nom d'interface :**
```bash
ip a
```

Regarde la ligne qui a une IP `192.168.1.X` et note le nom (avant le `:`)

---

```yaml
      dhcp4: no
```
**<- Désactive le client DHCP**

**Explication :**
- `dhcp4` = DHCP pour IPv4 (les IPs normales)
- `no` = Désactivé
- **Pourquoi ?** Parce qu'on veut une IP **fixe**, pas automatique

---

```yaml
      addresses:
        - 192.168.1.100/24
```
**<- L'adresse IP fixe de la VM**

**Décryptage :**
- `addresses:` = Liste d'IPs (tu peux en mettre plusieurs)
- `- 192.168.1.100/24` = L'IP avec son masque
  - `192.168.1.100` = L'IP
  - `/24` = Masque de sous-réseau (équivalent de `255.255.255.0`)

**Qu'est-ce que `/24` ?**
- Signifie : "Les 24 premiers bits sont le réseau"
- En clair : Tout ce qui commence par `192.168.1.X` est dans ton réseau local
- Les appareils de `192.168.1.1` à `192.168.1.254` peuvent communiquer directement

---

```yaml
      routes:
        - to: default
          via: 192.168.1.1
```
**<- Configuration de la passerelle (route par défaut)**

**Explication :**
- `routes:` = Liste des routes (chemins) réseau
- `to: default` = Pour toutes les destinations (tout Internet)
- `via: 192.168.1.1` = Passe par cette IP (ta Box)

**Analogie :**
C'est comme dire : "Pour aller n'importe où en dehors du quartier, passe par la Poste (Box)"

**[ATTENTION] VÉRIFIE que `192.168.1.1` est bien l'IP de ta Box !**

**Pour vérifier :**
Sur ton PC Windows :
```cmd
ipconfig
```
Cherche "Passerelle par défaut" : c'est l'IP de ta Box.

---

```yaml
      nameservers:
        addresses:
          - 8.8.8.8
          - 8.8.4.4
```
**<- Serveurs DNS (pour résoudre les noms de domaine)**

**Explication :**
- `nameservers:` = Serveurs DNS
- `8.8.8.8` et `8.8.4.4` = DNS de Google (gratuits, rapides, fiables)

**Le rôle du DNS :**

Quand tu tapes "google.com", l'ordinateur ne comprend pas ce nom. Il a besoin de l'IP correspondante.

**Le DNS fait la traduction :**
```
Toi : "Je veux aller sur google.com"
DNS : "OK, c'est l'IP 142.250.185.78"
Ordinateur : "Merci, je me connecte à 142.250.185.78"
```

**Alternatives au DNS de Google :**

```yaml
      nameservers:
        addresses:
          - 1.1.1.1      # Cloudflare (très rapide)
          - 1.0.0.1
```

ou

```yaml
      nameservers:
        addresses:
          - 9.9.9.9      # Quad9 (focus sécurité)
          - 149.112.112.112
```

---

**5. Sauvegarde le fichier**

Dans nano :
- Appuie sur `Ctrl + O` (lettre O) pour sauvegarder
- Appuie sur `Entrée` pour confirmer
- Appuie sur `Ctrl + X` pour quitter

---

**6. Applique la nouvelle configuration**

```bash
sudo netplan apply
```

**Explication :**
- Cette commande dit à Netplan : "Lis le fichier de config et applique-le maintenant"
- Si tu ne fais pas ça, les changements ne seront pas pris en compte

**Si tu vois une erreur de syntaxe YAML :**

```
Error in network definition: invalid YAML syntax
```

**Solution :**
1. Vérifie l'indentation (compte les espaces)
2. Vérifie qu'il n'y a pas de tabulations
3. Réédite le fichier et corrige

**Commande pour tester la syntaxe SANS appliquer :**
```bash
sudo netplan try
```

Cette commande applique la config, mais **annule automatiquement après 120 secondes** si tu ne confirmes pas. Utile pour ne pas te bloquer !

---

**7. Vérifie la nouvelle IP**

```bash
ip a
```

**Résultat attendu :**

```
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP>
    inet 192.168.1.100/24 brd 192.168.1.255 scope global enp0s3
         ^^^^^^^^^^^^^
    TON NOUVELLE IP FIXE [OK]
```

**Tu dois voir : `192.168.1.100`**

---

**8. Teste Internet**

```bash
ping -c 4 google.com
```

**Résultat attendu :**

```
PING google.com (142.250.185.78) 56(84) bytes of data.
64 bytes from ...: icmp_seq=1 ttl=115 time=15.2 ms
64 bytes from ...: icmp_seq=2 ttl=115 time=14.8 ms
64 bytes from ...: icmp_seq=3 ttl=115 time=15.1 ms
64 bytes from ...: icmp_seq=4 ttl=115 time=15.0 ms

--- google.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss
                      ^^^^^^^^^^
                  PARFAIT ! [OK]
```

**Si ça ne marche pas :**

**Erreur possible 1 :**
```
ping: google.com: Name or service not known
```
**-> Problème DNS** : Vérifie les serveurs DNS dans ton fichier Netplan.

**Erreur possible 2 :**
```
ping: google.com: Temporary failure in name resolution
```
**-> Même problème DNS**

**Erreur possible 3 :**
```
PING google.com (142.250.185.78) 56(84) bytes of data.
[pas de réponse, ça reste bloqué]
```
**-> Problème de passerelle** : Vérifie que `via: 192.168.1.1` correspond à l'IP de ta Box.

---

### [BRAVO] Récapitulatif Étape 2

**Ce qu'on a fait :**
- [OK] Configuré une IP fixe pour la VM : `192.168.1.100`
- [OK] Configuré la passerelle (Box) : `192.168.1.1`
- [OK] Configuré les DNS : `8.8.8.8` et `8.8.4.4`
- [OK] Vérifié que tout fonctionne

**La VM a maintenant une adresse "permanente" sur le réseau !**

---

## [PACKAGE] ÉTAPE 3 : INSTALLER DNSMASQ

### [REFLEXION] Qu'est-ce que DNSmasq ?

**DNSmasq = programme 2-en-1 :**
1. **Serveur DHCP** (distribue les IPs)
2. **Serveur DNS** (résout les noms de domaine)

**Analogie :**
C'est comme un réceptionniste d'hôtel qui :
1. Attribue les chambres (DHCP)
2. Donne des informations sur la ville (DNS)

**Pourquoi DNSmasq ?**
- [OK] Léger (utilise peu de ressources)
- [OK] Simple à configurer
- [OK] Parfait pour les petits réseaux
- [OK] Très utilisé (beaucoup de documentation)

---

### [ENTREE] Installation

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

```bash
sudo apt update
```

**Explication :**
- `apt` = Gestionnaire de paquets Ubuntu/Debian (comme un "app store")
- `update` = Télécharge la liste des derniers programmes disponibles
- **NE télécharge PAS les programmes**, juste la liste

**Résultat attendu :**

```
Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease
Get:2 http://security.ubuntu.com/ubuntu jammy-security InRelease [110 kB]
...
Fetched 1,234 kB in 2s (617 kB/s)
Reading package lists... Done
Building dependency tree... Done
```

**Si tu vois une erreur :**
```
Could not resolve 'archive.ubuntu.com'
```
**-> Problème DNS/Internet**, retourne à l'étape 2 et vérifie ta configuration réseau.

---

**2. Installe DNSmasq**

```bash
sudo apt install dnsmasq -y
```

**Explication :**
- `install dnsmasq` = Installe le paquet "dnsmasq"
- `-y` = Répond automatiquement "yes" aux questions (sinon il demande confirmation)

**Résultat attendu :**

```
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following NEW packages will be installed:
  dnsmasq dnsmasq-base
...
Setting up dnsmasq (2.86-1.1ubuntu0.3) ...
Created symlink /etc/systemd/system/multi-user.target.wants/dnsmasq.service
```

**Si tu vois :**
```
E: Unable to locate package dnsmasq
```
**-> Tu as oublié de faire `sudo apt update`** avant.

---

**3. Vérifie que DNSmasq est installé**

```bash
dnsmasq --version
```

**Résultat attendu :**

```
Dnsmasq version 2.86  Copyright (c) 2000-2021 Simon Kelley
```

**Si tu vois ça, c'est installé ! [OK]**

---

**4. Vérifie l'état du service**

```bash
sudo systemctl status dnsmasq
```

**Explication :**
- `systemctl` = Gestionnaire de services Linux
- `status` = Affiche l'état du service
- `dnsmasq` = Le service à vérifier

**Résultat possible 1 (Service actif) :**

```
[BLACK_CIRCLE] dnsmasq.service - dnsmasq - A lightweight DHCP and caching DNS server
     Loaded: loaded (/lib/systemd/system/dnsmasq.service; enabled)
     Active: active (running) since Fri 2024-12-06 10:30:00 UTC; 1min ago
                     ^^^^^^^^^^^^^^^
                IL TOURNE ! [OK]
```

**Résultat possible 2 (Service en erreur) :**

```
[BLACK_CIRCLE] dnsmasq.service - dnsmasq - A lightweight DHCP and caching DNS server
     Loaded: loaded
     Active: failed (Result: exit-code)
                     ^^^^^^
             IL Y A UN PROBLÈME [X]
```

**C'est NORMAL qu'il soit en erreur pour l'instant !**

**Pourquoi ?**
DNSmasq essaie de se lancer avec une configuration par défaut qui ne convient pas à notre cas. On va le configurer correctement à l'étape suivante.

---

### [OBJECTIF] Comprendre les services Linux (systemctl)

**Un "service" = un programme qui tourne en arrière-plan**

**Commandes importantes :**

```bash
# Voir l'état d'un service
sudo systemctl status dnsmasq

# Démarrer un service
sudo systemctl start dnsmasq

# Arrêter un service
sudo systemctl stop dnsmasq

# Redémarrer un service (arrêter + démarrer)
sudo systemctl restart dnsmasq

# Activer un service au démarrage (il se lancera automatiquement)
sudo systemctl enable dnsmasq

# Désactiver un service au démarrage
sudo systemctl disable dnsmasq
```

**Analogie :**
C'est comme les programmes qui se lancent automatiquement quand tu allumes Windows (antivirus, Dropbox, etc.).

---

## [CONFIG] ÉTAPE 4 : CONFIGURER DNSMASQ (PARTIE CRITIQUE !)

### [FICHIER] Comprendre le fichier de configuration

**DNSmasq lit sa configuration dans : `/etc/dnsmasq.conf`**

**Problème :** Ce fichier fait **650+ lignes** avec PLEIN de commentaires !

**Stratégie :** On va créer un fichier propre et simple.

---

### [NETTOYAGE] Nettoyer l'ancienne configuration

**1. Sauvegarde l'ancien fichier**

```bash
sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.original
```

**Explication :**
- `mv` = Move (déplacer/renommer)
- On renomme `/etc/dnsmasq.conf` en `/etc/dnsmasq.conf.original`
- Ainsi, on garde l'original au cas où

---

**2. Crée un nouveau fichier vide**

```bash
sudo nano /etc/dnsmasq.conf
```

**Explication :**
- `nano` ouvre l'éditeur
- Comme le fichier n'existe plus, nano en crée un nouveau (vide)

---

### [NOTE] Écrire la configuration (ULTRA DÉTAILLÉE)

**Copie-colle cette configuration dans nano :**

```bash
# ═══════════════════════════════════════════════════════════════
# CONFIGURATION DNSMASQ - SERVEUR DHCP + DNS
# ═══════════════════════════════════════════════════════════════
# Créé le : 2024-12-06
# Pour : Projet DHCP sur VirtualBox
# ═══════════════════════════════════════════════════════════════

# ────────────────────────────────────────────────────────────────
# 1. CONFIGURATION DE L'INTERFACE RÉSEAU
# ────────────────────────────────────────────────────────────────

# Sur quelle carte réseau DNSmasq doit écouter
interface=enp0s3

# [ATTENTION] IMPORTANT : Change "enp0s3" si ton interface a un autre nom !
# Pour trouver le nom : tape "ip a" dans le terminal
#
# Explication :
# DNSmasq peut écouter sur plusieurs cartes réseau. On lui dit
# d'écouter UNIQUEMENT sur notre carte réseau principale.
#
# Analogie : C'est comme dire au réceptionniste "réponds uniquement
# aux appels qui arrivent sur la ligne 1, ignore les autres lignes"

# Ne répond QUE sur les interfaces spécifiées (sécurité)
bind-interfaces

# Explication :
# Sans cette option, DNSmasq écouterait sur TOUTES les interfaces,
# y compris les interfaces internes (loopback, etc.).
# "bind-interfaces" = "attache-toi SEULEMENT aux interfaces listées"
#
# Pourquoi c'est important :
# - Sécurité : on ne veut pas que DNSmasq réponde n'importe où
# - Évite les conflits avec d'autres services DNS locaux
#
# Analogie : C'est comme dire "ne réponds qu'aux visiteurs qui
# viennent par la porte d'entrée, pas ceux qui viennent par
# les fenêtres ou les portes de service"

# ────────────────────────────────────────────────────────────────
# 2. CONFIGURATION DHCP (DISTRIBUTION DES IPS)
# ────────────────────────────────────────────────────────────────

# Plage d'adresses IP à distribuer
dhcp-range=192.168.1.50,192.168.1.150,255.255.255.0,24h

# Décortiquons cette ligne SUPER IMPORTANTE :
#
# dhcp-range = Définit la "plage" (range) d'IPs disponibles
#
# 192.168.1.50 = Première IP que DNSmasq peut donner
#                C'est comme la première chambre d'hôtel disponible
#
# 192.168.1.150 = Dernière IP que DNSmasq peut donner
#                 La dernière chambre disponible
#
# 255.255.255.0 = Masque de sous-réseau
#                 Définit la "taille" du réseau
#                 (On peut aussi écrire "/24" à la place)
#
# 24h = Durée de location (lease time)
#       Chaque IP est "prêtée" pour 24 heures
#       Après 24h, l'appareil doit redemander (renouveler)
#
# [ATTENTION] IMPORTANT : Choix de la plage
#
# Imagine ton réseau comme un immeuble :
#
# 192.168.1.1         <- Porte d'entrée (Box/Routeur) [RÉSERVÉ]
# 192.168.1.2-49      <- Appartements pour résidents permanents (IPs fixes)
# 192.168.1.50-150    <- Hôtel pour visiteurs (PLAGE DHCP)
# 192.168.1.151-254   <- Étages vides (réserve pour l'avenir)
#
# Notre serveur DHCP distribuera UNIQUEMENT des IPs entre .50 et .150
# Cela nous laisse :
# - .2 à .49 pour des appareils avec IPs fixes manuelles (51 IPs)
# - .50 à .150 pour le DHCP (101 IPs disponibles)
# - .151 à .254 pour extension future (104 IPs)
#
# Durées possibles :
# - 12h = 12 heures
# - 24h = 24 heures (recommandé pour la maison)
# - 1w = 1 semaine
# - infinite = Infini (PAS recommandé, sauf pour réservations)

# ────────────────────────────────────────────────────────────────
# 3. OPTIONS DHCP (INFORMATIONS DONNÉES AUX CLIENTS)
# ────────────────────────────────────────────────────────────────

# Option 3 : Passerelle par défaut (Router/Gateway)
dhcp-option=3,192.168.1.1

# Explication DÉTAILLÉE :
#
# "dhcp-option" = On configure une "option DHCP"
#                 Le protocole DHCP a des dizaines d'options numérotées
#
# "3" = Numéro de l'option pour "Default Router" (passerelle)
#       (C'est standardisé, le numéro 3 = toujours la passerelle)
#
# "192.168.1.1" = L'IP de ta Box/Routeur
#
# Rôle de la passerelle :
# Quand un appareil veut aller sur Internet (ex: google.com),
# il ne sait pas comment sortir du réseau local.
# La passerelle est la "porte de sortie" vers Internet.
#
# Analogie :
# Tu habites dans un quartier (réseau local 192.168.1.X).
# Pour aller en ville (Internet), tu dois passer par la sortie
# du quartier (la passerelle = Box).
#
# Sans cette option :
# - Les appareils auraient une IP
# - Ils pourraient communiquer entre eux dans le réseau local
# - Mais PAS d'accès Internet [X]
#
# [ATTENTION] VÉRIFIE que 192.168.1.1 est bien l'IP de ta Box !
# Sur Windows : ipconfig -> "Passerelle par défaut"
# Sur Mac/Linux : ip route | grep default

# Option 6 : Serveurs DNS
dhcp-option=6,192.168.1.100

# Explication DÉTAILLÉE :
#
# "6" = Numéro de l'option pour "DNS Servers"
#       (Standardisé : 6 = toujours le(s) serveur(s) DNS)
#
# "192.168.1.100" = L'IP de notre VM (elle-même !)
#
# Pourquoi donner l'IP de la VM comme DNS ?
#
# La VM fait 2 choses :
# 1. Serveur DHCP (distribue les IPs) <- Ce qu'on configure ici
# 2. Serveur DNS (résout les noms de domaine) <- DNSmasq fait aussi ça !
#
# Fonctionnement du DNS :
# Un appareil tape "google.com" -> Il demande au DNS :
# "C'est quoi l'IP de google.com ?"
# DNS répond : "C'est 142.250.185.78"
#
# Notre DNSmasq va :
# - Recevoir la question "Quelle est l'IP de google.com ?"
# - Demander à Google DNS (8.8.8.8) si il ne connaît pas
# - Mémoriser la réponse (cache)
# - Répondre au client
#
# Avantage :
# Les requêtes répétées sont INSTANTANÉES (réponse depuis le cache)
#
# Alternative (si tu ne veux pas que la VM fasse DNS) :
# dhcp-option=6,8.8.8.8,8.8.4.4
# Cela dira aux clients d'utiliser directement Google DNS

# ────────────────────────────────────────────────────────────────
# 4. CONFIGURATION DU DOMAINE LOCAL
# ────────────────────────────────────────────────────────────────

# Nom de domaine local
domain=local

# Explication :
#
# Tous les appareils du réseau auront le suffixe ".local"
#
# Exemple :
# - Ton PC s'appelle "monpc" -> Il sera "monpc.local"
# - Ta VM s'appelle "server" -> Elle sera "server.local"
#
# Avantage :
# Tu peux faire "ping monpc.local" au lieu de te rappeler l'IP
#
# C'est comme donner une adresse postale lisible :
# Au lieu de "Maison n°51", on dit "Maison de Pierre"

# Auto-complétion des noms d'hôtes
expand-hosts

# Explication :
#
# Permet de taper juste "monpc" au lieu de "monpc.local"
# DNSmasq ajoutera automatiquement ".local"
#
# Analogie :
# C'est comme l'autocomplétion sur ton téléphone.
# Tu tapes "Pier" -> Il propose "Pierre"

# ────────────────────────────────────────────────────────────────
# 5. RÉSERVATIONS DHCP (IPS FIXES POUR CERTAINS APPAREILS)
# ────────────────────────────────────────────────────────────────

# Réservation pour la VM elle-même
dhcp-host=08:00:27:XX:XX:XX,192.168.1.100,vm-linux,infinite

# Explication LIGNE PAR LIGNE :
#
# "dhcp-host" = Configuration d'une réservation
#
# "08:00:27:XX:XX:XX" = Adresse MAC de l'appareil
#                        [ATTENTION] CHANGE PAR TON ADRESSE MAC !
#
# Qu'est-ce qu'une adresse MAC ?
# MAC = Media Access Control
# C'est l'identifiant UNIQUE et PERMANENT de ta carte réseau.
# C'est comme le numéro de série de ta carte réseau.
#
# Format : 6 groupes de 2 chiffres hexadécimaux séparés par ":"
# Exemple : 08:00:27:3b:5c:a1
#
# Comment trouver ton adresse MAC ?
# Dans la VM, tape :
# ip link show enp0s3
#
# Résultat :
# 2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP>
#     link/ether 08:00:27:3b:5c:a1 brd ff:ff:ff:ff:ff:ff
#                ^^^^^^^^^^^^^^^^^
#            TON ADRESSE MAC [OK]
#
# "192.168.1.100" = L'IP fixe à toujours donner à cet appareil
#
# "vm-linux" = Nom d'hôte (optionnel, pour l'identifier)
#
# "infinite" = Durée de la réservation = permanente
#
# Fonctionnement :
# Quand la VM avec cette adresse MAC demande une IP,
# DNSmasq lui donnera TOUJOURS 192.168.1.100.
#
# Avantages :
# - L'IP de la VM ne changera JAMAIS
# - Pas besoin de configurer l'IP manuellement sur la VM
# - Gestion centralisée (tout est dans ce fichier)
#
# Analogie :
# C'est comme réserver une place de parking permanente.
# Chaque fois que tu arrives, ta place t'attend.

# [ATTENTION] POUR RÉSERVER D'AUTRES APPAREILS :
#
# Exemple : Réserver une IP pour ton PC
# dhcp-host=AA:BB:CC:DD:EE:FF,192.168.1.55,mon-pc,24h
#
# Pour trouver l'adresse MAC de ton PC :
# Windows : ipconfig /all -> "Adresse physique"
# Mac : ifconfig -> "ether"
# Linux : ip link show

# ────────────────────────────────────────────────────────────────
# 6. CONFIGURATION DNS (RÉSOLUTION DE NOMS)
# ────────────────────────────────────────────────────────────────

# Serveurs DNS "en amont" (upstream)
server=8.8.8.8
server=8.8.4.4

# Explication :
#
# DNSmasq va faire "DNS forwarder" (transfert DNS)
#
# Fonctionnement :
# 1. Un client demande : "Quelle est l'IP de google.com ?"
# 2. DNSmasq cherche dans son cache
#    - Si trouvé -> Répond immédiatement [RAPIDE]
#    - Si pas trouvé -> Demande à 8.8.8.8 (Google DNS)
# 3. Google DNS répond : "C'est 142.250.185.78"
# 4. DNSmasq mémorise la réponse (cache)
# 5. DNSmasq renvoie la réponse au client
#
# Serveurs DNS populaires :
#
# Google DNS (ce qu'on utilise ici) :
# - 8.8.8.8
# - 8.8.4.4
# Avantages : Rapide, fiable, bien maintenu
#
# Cloudflare DNS :
# - 1.1.1.1
# - 1.0.0.1
# Avantages : Focus sur la vie privée, très rapide
#
# Quad9 DNS :
# - 9.9.9.9
# - 149.112.112.112
# Avantages : Bloque les domaines malveillants
#
# Pour changer :
# Remplace les lignes "server=..." par les DNS que tu veux

# Taille du cache DNS
cache-size=1000

# Explication :
#
# DNSmasq garde en mémoire les 1000 dernières réponses DNS
#
# Avantage :
# Si tu vas sur google.com, puis 5 minutes après tu y retournes,
# la réponse est INSTANTANÉE (pas besoin de redemander à 8.8.8.8)
#
# C'est comme un carnet d'adresses :
# Une fois que tu as noté le numéro de quelqu'un,
# tu n'as plus besoin de le chercher dans l'annuaire.
#
# Valeurs recommandées selon la taille du réseau :
# - Petit réseau (1-5 appareils) : 500
# - Moyen (5-20 appareils) : 1000 <- On utilise ça
# - Grand (20-50 appareils) : 2000
# - Très grand (50+ appareils) : 5000
#
# Plus le cache est grand :
# + Plus de mémoire utilisée
# + Mais réponses plus rapides

# ────────────────────────────────────────────────────────────────
# 7. CONFIGURATION DES LOGS (JOURNAUX)
# ────────────────────────────────────────────────────────────────

# Enregistrer toutes les attributions DHCP
log-dhcp

# Explication :
#
# Active l'enregistrement de TOUS les événements DHCP :
# - Quand un appareil demande une IP (DISCOVER)
# - Quand DNSmasq propose une IP (OFFER)
# - Quand l'appareil accepte (REQUEST)
# - Quand DNSmasq confirme (ACK)
#
# Très utile pour :
# - Déboguer les problèmes ("pourquoi mon PC n'a pas d'IP ?")
# - Voir qui est connecté au réseau
# - Surveiller l'activité réseau
#
# Les logs apparaîtront dans /var/log/dnsmasq.log (voir ci-dessous)

# Enregistrer toutes les requêtes DNS
log-queries

# Explication :
#
# Active l'enregistrement de TOUTES les requêtes DNS :
# - Quel appareil a demandé quelle adresse
# - À quelle heure
# - Quelle réponse a été donnée
#
# Exemple de log :
# query[A] google.com from 192.168.1.51
# reply google.com is 142.250.185.78
#
# Utile pour :
# - Voir quels sites sont visités sur le réseau
# - Déboguer les problèmes DNS
# - Détecter des activités suspectes
#
# [ATTENTION] ATTENTION :
# Cela peut générer BEAUCOUP de logs !
# Chaque page web fait des dizaines de requêtes DNS.
#
# Si les logs deviennent trop volumineux, tu peux :
# - Commenter cette ligne (ajouter # devant)
# - Ou limiter l'enregistrement (options avancées)

# Fichier de log dédié
log-facility=/var/log/dnsmasq.log

# Explication :
#
# Par défaut, DNSmasq écrit dans les logs système (/var/log/syslog)
# qui contiennent les logs de TOUS les programmes.
#
# Avec cette option, on dit :
# "Écris tes logs dans un fichier séparé : /var/log/dnsmasq.log"
#
# Avantages :
# - Plus facile de trouver les logs de DNSmasq
# - Les logs système ne sont pas pollués
# - On peut facilement partager/analyser juste les logs DNSmasq
#
# Pour voir les logs en temps réel :
# sudo tail -f /var/log/dnsmasq.log
#
# Pour voir les 100 dernières lignes :
# sudo tail -n 100 /var/log/dnsmasq.log
#
# Pour chercher un mot dans les logs :
# sudo grep "192.168.1.51" /var/log/dnsmasq.log

# ────────────────────────────────────────────────────────────────
# 8. FICHIER HOSTS PERSONNALISÉ (OPTIONNEL)
# ────────────────────────────────────────────────────────────────

# Fichier hosts additionnel
addn-hosts=/etc/hosts.dnsmasq

# Explication :
#
# DNSmasq peut lire un fichier "hosts" personnalisé
# pour des correspondances IP <-> Nom personnalisées.
#
# Exemple de contenu de /etc/hosts.dnsmasq :
# 192.168.1.100  serveur.local  serveur
# 192.168.1.10   nas.local      nas
#
# Utilité :
# Tu peux donner des noms personnalisés à tes appareils.
# Ensuite, tu peux faire "ping nas.local" ou "ssh serveur"
#
# C'est comme créer des contacts dans ton téléphone :
# Au lieu de taper le numéro, tu tapes juste le nom.
#
# Pour créer ce fichier :
# sudo nano /etc/hosts.dnsmasq
#
# [ATTENTION] Ce fichier n'existe pas par défaut, il faut le créer.
# Si tu ne le crées pas, DNSmasq affichera un avertissement
# (warning) au démarrage, mais ça ne l'empêchera pas de fonctionner.

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

---

### [SAUVEGARDE] Sauvegarder la configuration

**Dans nano :**

1. **Sauvegarde** : `Ctrl + O` (lettre O, pas zéro)
2. **Confirme** : Appuie sur `Entrée`
3. **Quitte** : `Ctrl + X`

---

### [OK] Vérifier la syntaxe

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

```bash
sudo dnsmasq --test
```

**Explication :**
- `--test` = Mode test (vérifie la syntaxe sans vraiment démarrer)

**Résultat attendu :**

```
dnsmasq: syntax check OK.
```

**[OK] Si tu vois ça, la configuration est bonne !**

---

**Si tu vois une erreur :**

```
dnsmasq: bad option at line 12 of /etc/dnsmasq.conf
```

**Cela signifie :**
- Erreur à la ligne 12
- Vérifie l'orthographe, les virgules, les espaces

**Commande pour voir la ligne 12 :**
```bash
sed -n '12p' /etc/dnsmasq.conf
```

**Réédite le fichier et corrige :**
```bash
sudo nano /etc/dnsmasq.conf
```

---

### [SYNC] Redémarrer DNSmasq

**Maintenant qu'on a une bonne configuration, démarrons DNSmasq :**

```bash
sudo systemctl restart dnsmasq
```

**Explication :**
- `restart` = Arrête et redémarre le service
- Si le service était déjà arrêté, ça le démarre

---

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

```bash
sudo systemctl status dnsmasq
```

**Résultat attendu :**

```
[BLACK_CIRCLE] dnsmasq.service - dnsmasq - A lightweight DHCP and caching DNS server
     Loaded: loaded (/lib/systemd/system/dnsmasq.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2024-12-06 11:00:00 UTC; 5s ago
                     ^^^^^^^^^^^^^^^
                IL TOURNE ! [OK]
    Process: 1234 ExecStart=/usr/sbin/dnsmasq -k --conf-file=/etc/dnsmasq.conf (code=exited)
   Main PID: 1235 (dnsmasq)
      Tasks: 1 (limit: 2312)
     Memory: 1.2M
        CPU: 12ms
     CGroup: /system.slice/dnsmasq.service
             └─1235 /usr/sbin/dnsmasq -k --conf-file=/etc/dnsmasq.conf

Dec 06 11:00:00 ubuntu dnsmasq[1235]: started, version 2.86 cachesize 1000
Dec 06 11:00:00 ubuntu dnsmasq[1235]: compile time options: ...
Dec 06 11:00:00 ubuntu dnsmasq-dhcp[1235]: DHCP, IP range 192.168.1.50 -- 192.168.1.150, lease time 24h
                                                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                                                    NOTRE PLAGE DHCP EST ACTIVE ! [OK]
Dec 06 11:00:00 ubuntu dnsmasq[1235]: using nameserver 8.8.8.8#53
Dec 06 11:00:00 ubuntu dnsmasq[1235]: read /etc/hosts - 7 addresses
```

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

---

**Si tu vois "failed" (en erreur) :**

```bash
# Voir les détails de l'erreur
sudo journalctl -u dnsmasq -n 50
```

**Explication :**
- `journalctl` = Gestionnaire de logs système
- `-u dnsmasq` = Uniquement les logs de DNSmasq
- `-n 50` = Les 50 dernières lignes

**Erreurs courantes :**

**Erreur 1 :**
```
dnsmasq: failed to create listening socket for port 53: Address already in use
```

**Signification :**
Un autre service utilise déjà le port 53 (DNS).

**Solution :**
```bash
# Voir qui utilise le port 53
sudo netstat -tulpn | grep :53

# Si c'est systemd-resolved :
sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved
```

---

**Erreur 2 :**
```
dnsmasq: unknown interface enp0s3
```

**Signification :**
L'interface `enp0s3` n'existe pas.

**Solution :**
```bash
# Trouve le vrai nom de ton interface
ip a

# Modifie dnsmasq.conf avec le bon nom
sudo nano /etc/dnsmasq.conf
```

---

### [RECHERCHE] Vérifier que DHCP écoute

**Commande pour vérifier que le serveur DHCP écoute :**

```bash
sudo netstat -tulpn | grep :67
```

**Explication :**
- `netstat` = Affiche les connexions réseau
- `-t` = TCP
- `-u` = UDP
- `-l` = Listening (en écoute)
- `-p` = Programme qui écoute
- `-n` = Format numérique (IPs et ports)
- `grep :67` = Filtre pour le port 67 (DHCP)

**Résultat attendu :**

```
udp  0  0  0.0.0.0:67  0.0.0.0:*  LISTEN  1235/dnsmasq
                  ^^                      ^^^^^^^^
           Port DHCP (67)          DNSmasq écoute ! [OK]
```

**Explication du résultat :**
- `udp` = Protocole UDP (DHCP utilise UDP)
- `0.0.0.0:67` = Écoute sur toutes les IPs, port 67
- `LISTEN` = En écoute
- `1235/dnsmasq` = Processus ID 1235, programme DNSmasq

**Port 67 = Port DHCP server** (standardisé, toujours 67)
**Port 68 = Port DHCP client** (les clients envoient sur le 68)

---

## [TEST] ÉTAPE 5 : TESTER DEPUIS TON PC PHYSIQUE

### [ATTENTION] IMPORTANT : Désactiver le DHCP de ta Box

**Problème :** Si tu as 2 serveurs DHCP actifs sur le même réseau, c'est le CHAOS !

**Ce qui se passe avec 2 DHCP :**

```
[MOBILE] Ton téléphone se connecte au WiFi
    │
    └─ Envoie un message : "J'ai besoin d'une IP !" (DISCOVER)
    
[RESEAU] Box répond : "Prends 192.168.1.25" (OFFER)
[CODE] VM répond aussi : "Non, prends 192.168.1.51" (OFFER)

[MOBILE] Téléphone : "Euh... Je prends laquelle ??" [DIZZY_FACE]
    └─ Prend une des deux au hasard
    
Résultat :
- Connexions instables
- Certains appareils ont des IPs de la Box
- D'autres ont des IPs de la VM
- Configuration réseau incohérente
- C'est le BAZAR ! [IMPACT]
```

**Analogie :**
C'est comme avoir 2 réceptionnistes dans un hôtel qui attribuent les chambres indépendamment. Résultat : 2 clients se retrouvent dans la même chambre !

---

### [OUTIL] Désactiver le DHCP de la Box

**Méthode générale (varie selon les Box) :**

**1. Ouvre un navigateur web sur ton PC**

**2. Va sur l'interface de ta Box**

**Adresses courantes :**
- `http://192.168.1.1` (la plus courante)
- `http://192.168.0.1` (parfois)
- `http://192.168.1.254` (Free)
- `http://bbox.lan` (Bouygues)

**3. Connecte-toi**

**Identifiants courants :**
- Ils sont souvent écrits sur une **étiquette sous/derrière la Box**
- Ou dans le manuel de la Box
- Ou sur le site de ton FAI

**Identifiants par défaut courants :**

| FAI | Login | Mot de passe |
|-----|-------|--------------|
| Orange | admin | admin (ou sur étiquette) |
| Free | (aucun) | (sur étiquette Box) |
| SFR | admin | (sur étiquette Box) |
| Bouygues | admin | (sur étiquette Box) |

---

**4. Trouve les paramètres DHCP**

**Emplacements courants :**
- "Réseau" -> "DHCP"
- "Configuration réseau" -> "Serveur DHCP"
- "Paramètres avancés" -> "DHCP"
- "LAN" -> "Serveur DHCP"

**5. Désactive le serveur DHCP**

**Tu verras une option comme :**
```
[x] Activer le serveur DHCP
```

**Décoche cette case** ou change sur "Désactiver"

**6. Sauvegarde**

Clique sur "Enregistrer", "Sauvegarder", "Valider" ou "Appliquer"

**7. Redémarre la Box (optionnel mais recommandé)**

---

### [OBJECTIF] Alternative : Garder les 2 DHCP (pour tester)

**Si tu as peur de désactiver le DHCP de la Box :**

Tu peux tester en configurant **manuellement** ton PC pour utiliser spécifiquement le DHCP de la VM.

**Avantage :**
- Tu peux tester sans toucher à la Box
- Les autres appareils continuent de fonctionner normalement

**Inconvénient :**
- Configuration manuelle nécessaire sur le PC
- Pas une vraie configuration "automatique"

**On verra cette méthode ci-dessous.**

---

## [CODE] TESTER DEPUIS WINDOWS

### Méthode 1 : Renouveler l'IP automatiquement (Recommandée)

**1. Ouvre l'Invite de commandes en administrateur**

**Méthode rapide :**
- Appuie sur `Windows + X`
- Sélectionne **"Invite de commandes (Admin)"** ou **"Windows PowerShell (Admin)"**

**Ou :**
- Clique sur le menu Démarrer
- Tape `cmd`
- Clic droit sur "Invite de commandes"
- Sélectionne **"Exécuter en tant qu'administrateur"**

**Tu verras une fenêtre noire avec :**
```
C:\WINDOWS\system32>
```

---

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

```cmd
ipconfig /release
```

**Explication :**
- `ipconfig` = Programme de configuration IP Windows
- `/release` = Libère (abandonne) l'adresse IP actuelle

**Ce qui se passe :**
1. Windows dit au serveur DHCP : "Je n'ai plus besoin de cette IP"
2. Le serveur DHCP marque l'IP comme "disponible"
3. Windows n'a plus d'IP (tu n'as plus Internet temporairement)

**Résultat attendu :**

```
Configuration IP de Windows

Carte Ethernet Ethernet :

   Suffixe DNS propre à la connexion. . . :
   Adresse IPv6 de liaison locale. . . . .: fe80::xxxx:xxxx:xxxx:xxxx%12
   Adresse IPv4. . . . . . . . . . . . . .: 0.0.0.0
                                             ^^^^^^^
                                       Plus d'IP !
   Masque de sous-réseau. . . . . . . . . : 0.0.0.0
   Passerelle par défaut. . . . . . . . . :
```

**Si tu vois "0.0.0.0", c'est bon ! L'IP est libérée.**

---

**3. Demande une nouvelle IP**

```cmd
ipconfig /renew
```

**Explication :**
- `/renew` = Renouveler, demander une nouvelle IP

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

```
┌────────────────────────────────────────────┐
│ 1. DISCOVER                                │
│ Ton PC -> Broadcast : "Y a-t-il un serveur │
│          DHCP sur ce réseau ?"             │
└────────────┬───────────────────────────────┘
             │
             [BLACK_DOWN-POINTING_TRIANGLE]
┌────────────────────────────────────────────┐
│ 2. OFFER                                   │
│ Ta VM -> Ton PC : "Oui ! Je te propose     │
│                   192.168.1.51"            │
└────────────┬───────────────────────────────┘
             │
             [BLACK_DOWN-POINTING_TRIANGLE]
┌────────────────────────────────────────────┐
│ 3. REQUEST                                 │
│ Ton PC -> VM : "OK, je prends 192.168.1.51"│
└────────────┬───────────────────────────────┘
             │
             [BLACK_DOWN-POINTING_TRIANGLE]
┌────────────────────────────────────────────┐
│ 4. ACK (Acknowledgement)                   │
│ Ta VM -> Ton PC : "Confirmé ! L'IP est     │
│                   à toi pour 24h"          │
└────────────────────────────────────────────┘
```

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

---

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

```cmd
ipconfig /all
```

**Explication :**
- `/all` = Affiche TOUTES les informations (détaillé)

**Résultat attendu (IMPORTANT) :**

```
Configuration IP de Windows

   Nom de l'hôte . . . . . . . . . . . . : DESKTOP-PC
   Suffixe DNS principal . . . . . . . . : local
                                            ^^^^^
                                   Notre domaine ! [OK]

Carte Ethernet Ethernet:

   Description. . . . . . . . . . . . . . : Realtek PCIe GbE Family Controller
   Adresse physique . . . . . . . . . . . : AA-BB-CC-DD-EE-FF
                                            ^^^^^^^^^^^^^^^^^
                                       TON ADRESSE MAC

   DHCP activé. . . . . . . . . . . . . . : Oui
                                            ^^^
                                   DHCP est actif [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
                                             ^^^^^^^^^^^^
                                       Bon masque [OK]

   Bail obtenu. . . . . . . . . . . . . . : vendredi 6 décembre 2024 11:30:00
   Bail expirant. . . . . . . . . . . . . : samedi 7 décembre 2024 11:30:00
                                            ^^^^^^^^^^^^^^^^^^^^^^^^^^^
                                       24h plus tard (durée de lease) [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][BRAVO][BRAVO]

   Serveurs DNS. . .  . . . . . . . . . . : 192.168.1.100
                                             ^^^^^^^^^^^^^
                                       La VM fait aussi DNS ! [OK]
```

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

---

**Points à vérifier impérativement :**

[OK] **IP entre 192.168.1.50 et 192.168.1.150**
- Si c'est en dehors : La Box distribue encore les IPs

[OK] **Serveur DHCP = 192.168.1.100**
- C'est l'IP de ta VM
- Si c'est différent : C'est la Box qui répond

[OK] **Passerelle = 192.168.1.1**
- Tu pourras accéder à Internet

[OK] **DNS = 192.168.1.100**
- La résolution de noms passera par ta VM

---

**5. Teste la connexion à la VM**

```cmd
ping 192.168.1.100
```

**Résultat attendu :**

```
Envoi d'une requête 'Ping' sur 192.168.1.100 avec 32 octets de données :
Réponse de 192.168.1.100 : octets=32 temps<1ms TTL=64
Réponse de 192.168.1.100 : octets=32 temps<1ms TTL=64
Réponse de 192.168.1.100 : octets=32 temps<1ms TTL=64
Réponse de 192.168.1.100 : octets=32 temps<1ms TTL=64

Statistiques Ping pour 192.168.1.100:
    Paquets : envoyés = 4, reçus = 4, perdus = 0 (perte 0%),
                                        ^^^^^^^^^^^^^^
                                  AUCUNE PERTE ! [OK]
```

**Si tu vois "Délai d'attente de la demande dépassé" :**
- La VM n'est pas accessible
- Vérifie le pare-feu de la VM (étape suivante)

---

**6. Teste Internet**

```cmd
ping google.com
```

**Résultat attendu :**

```
Envoi d'une requête 'Ping' sur google.com [142.250.185.78] avec 32 octets de données :
Réponse de 142.250.185.78 : octets=32 temps=15ms TTL=115
Réponse de 142.250.185.78 : octets=32 temps=14ms TTL=115
Réponse de 142.250.185.78 : octets=32 temps=15ms TTL=115
Réponse de 142.250.185.78 : octets=32 temps=14ms TTL=115

Statistiques Ping pour 142.250.185.78:
    Paquets : envoyés = 4, reçus = 4, perdus = 0 (perte 0%),
```

**[OK] Si ça marche, TOUT EST PARFAIT ! Tu as Internet ET ton PC utilise la VM comme DHCP !**

---

### Méthode 2 : Configuration manuelle (si Méthode 1 ne marche pas)

**Si ton PC ne reçoit pas automatiquement une IP de la VM, tu peux forcer :**

**1. Ouvre les Paramètres réseau**

- `Windows + I` (Ouvre les Paramètres)
- Clique sur **"Réseau et Internet"**
- Clique sur **"Ethernet"** (si câble) ou **"WiFi"** (si sans fil)
- Clique sur ta connexion active

---

**2. Clique sur "Propriétés"**

---

**3. Descends et clique sur "Modifier" (sous Configuration IP)**

---

**4. Sélectionne "Manuel"**

---

**5. Active IPv4**

---

**6. Remplis les champs**

```
Adresse IP : 192.168.1.51
             (ou n'importe quelle IP entre .50 et .150)

Longueur du préfixe : 24
             (équivalent du masque 255.255.255.0)

Passerelle : 192.168.1.1
             (IP de ta Box)

DNS préféré : 192.168.1.100
              (IP de ta VM)

DNS auxiliaire : 8.8.8.8
                 (Google DNS, au cas où)
```

---

**7. Sauvegarde**

---

**8. Teste**

```cmd
ping 192.168.1.100
ping google.com
```

---

## [ITEM] TESTER DEPUIS MAC

### Méthode 1 : Configuration automatique DHCP

**1. Ouvre les Préférences Système**

- Menu Pomme (en haut à gauche)
- **"Préférences Système"**

---

**2. Clique sur "Réseau"**

---

**3. Sélectionne ta connexion active**

- **"Ethernet"** si câble
- **"WiFi"** si sans fil

---

**4. Clique sur "Avancé..."** (en bas à droite)

---

**5. Onglet "TCP/IP"**

---

**6. Configure**

```
Configurer IPv4 : Via DHCP
```

Sélectionne **"Via DHCP"** dans le menu déroulant.

---

**7. Clique sur "Renouveler le bail DHCP"**

**Explication :**
C'est l'équivalent de `ipconfig /release` + `/renew` sur Windows.

---

**8. Clique sur "OK" puis "Appliquer"**

---

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

**Dans le même écran, tu verras :**

```
Adresse IPv4 : 192.168.1.51
               ^^^^^^^^^^^^
         Dans la plage ! [OK]

Masque de sous-réseau : 255.255.255.0

Routeur : 192.168.1.1
          ^^^^^^^^^^^
      IP de la Box [OK]

Serveur DHCP : 192.168.1.100
               ^^^^^^^^^^^^^
           C'EST TA VM ! [BRAVO]
```

---

**10. Teste dans le Terminal**

Ouvre le **Terminal** (Applications -> Utilitaires -> Terminal)

```bash
# Ping vers la VM
ping -c 4 192.168.1.100

# Ping vers Internet
ping -c 4 google.com
```

**Résultat attendu :**

```
PING 192.168.1.100 (192.168.1.100): 56 data bytes
64 bytes from 192.168.1.100: icmp_seq=0 ttl=64 time=0.8 ms
64 bytes from 192.168.1.100: icmp_seq=1 ttl=64 time=0.7 ms
64 bytes from 192.168.1.100: icmp_seq=2 ttl=64 time=0.8 ms
64 bytes from 192.168.1.100: icmp_seq=3 ttl=64 time=0.7 ms

--- 192.168.1.100 ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
                                          ^^^^^^^^^^^^^^
                                     AUCUNE PERTE ! [OK]
```

---

## [LINUX] TESTER DEPUIS LINUX (autre machine)

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

```bash
sudo dhclient -r
```

**Explication :**
- `dhclient` = Client DHCP Linux
- `-r` = Release (libérer)
- `sudo` = Nécessite les droits admin

---

**2. Demande une nouvelle IP**

```bash
sudo dhclient eth0
```

**[ATTENTION] Remplace `eth0` par le nom de ton interface !**

Pour trouver le nom :
```bash
ip a
```

---

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

```bash
ip a
```

**Résultat attendu :**

```
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP>
    inet 192.168.1.51/24 brd 192.168.1.255 scope global dynamic eth0
         ^^^^^^^^^^^^
    Dans la plage ! [OK]
```

---

**4. Vérifie les infos DHCP**

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

**Tu verras :**

```
lease {
  interface "eth0";
  fixed-address 192.168.1.51;
  option subnet-mask 255.255.255.0;
  option routers 192.168.1.1;
  option dhcp-server-identifier 192.168.1.100;
                                 ^^^^^^^^^^^^^
                             C'EST TA VM ! [BRAVO]
  option domain-name-servers 192.168.1.100;
}
```

---

**5. Teste**

```bash
ping -c 4 192.168.1.100
ping -c 4 google.com
```

---

## [GRAPHIQUE] ÉTAPE 6 : SURVEILLER L'ACTIVITÉ DHCP

### [RECHERCHE] Voir les IPs distribuées (les "baux" DHCP)

**Dans ta VM, tape :**

```bash
cat /var/lib/misc/dnsmasq.leases
```

**Explication :**
- Ce fichier contient la liste de TOUTES les IPs actuellement louées
- DNSmasq met à jour ce fichier en temps réel

**Résultat (exemple) :**

```
1733508000 aa:bb:cc:dd:ee:ff 192.168.1.51 DESKTOP-PC *
1733508120 11:22:33:44:55:66 192.168.1.52 iPhone-Pierre *
1733508240 22:33:44:55:66:77 192.168.1.53 MacBook-Pro *
```

**Décryptage ligne par ligne :**

```
1733508000 aa:bb:cc:dd:ee:ff 192.168.1.51 DESKTOP-PC *
    ^             ^                ^            ^     ^
    │             │                │            │     └─ ID client (optionnel)
    │             │                │            └─────── Nom d'hôte
    │             │                └──────────────────── IP attribuée
    │             └───────────────────────────────────── Adresse MAC
    └─────────────────────────────────────────────────── Timestamp d'expiration
```

**Comprendre le timestamp :**

Le timestamp `1733508000` est en format "Unix timestamp" (secondes depuis le 1er janvier 1970).

**Pour le convertir en date lisible :**

```bash
date -d @1733508000
```

**Résultat :**

```
Fri Dec  6 11:30:00 UTC 2024
```

**Cela te dit quand le bail expire** (24h après l'attribution dans notre config).

---

### [DOC] Voir les logs en temps réel

**Commande magique :**

```bash
sudo tail -f /var/log/dnsmasq.log
```

**Explication :**
- `tail` = Affiche la fin d'un fichier
- `-f` = Follow (suit) = Affiche les nouvelles lignes en temps réel
- Comme regarder un flux en direct !

**Pour arrêter : `Ctrl + C`**

---

**Maintenant, sur ton PC Windows, fais :**

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

**Dans la VM, tu verras en temps réel :**

```
dnsmasq-dhcp[1235]: DHCPDISCOVER(enp0s3) aa:bb:cc:dd:ee:ff
dnsmasq-dhcp[1235]: DHCPOFFER(enp0s3) 192.168.1.51 aa:bb:cc:dd:ee:ff
dnsmasq-dhcp[1235]: DHCPREQUEST(enp0s3) 192.168.1.51 aa:bb:cc:dd:ee:ff
dnsmasq-dhcp[1235]: DHCPACK(enp0s3) 192.168.1.51 aa:bb:cc:dd:ee:ff DESKTOP-PC
```

**Explication ligne par ligne :**

---

**Ligne 1 : DHCPDISCOVER**

```
dnsmasq-dhcp[1235]: DHCPDISCOVER(enp0s3) aa:bb:cc:dd:ee:ff
       ^      ^           ^         ^            ^
       │      │           │         │            └─ Adresse MAC du client
       │      │           │         └────────────── Interface réseau
       │      │           └──────────────────────── Type de message DHCP
       │      └──────────────────────────────────── PID du processus DNSmasq
       └─────────────────────────────────────────── Nom du programme
```

**Signification :**
- Le client (ton PC) diffuse un message sur le réseau
- Message : "Y a-t-il un serveur DHCP ? J'ai besoin d'une IP !"
- C'est un **broadcast** = envoyé à TOUT le réseau
- L'adresse MAC identifie qui pose la question

**Analogie :**
C'est comme crier dans un hall d'hôtel : "Y a-t-il un réceptionniste ici ?"

---

**Ligne 2 : DHCPOFFER**

```
dnsmasq-dhcp[1235]: DHCPOFFER(enp0s3) 192.168.1.51 aa:bb:cc:dd:ee:ff
                          ^               ^              ^
                          │               │              └─ À qui on fait l'offre
                          │               └──────────────── IP proposée
                          └──────────────────────────────── Offre d'IP
```

**Signification :**
- DNSmasq répond au client
- Message : "Je suis un serveur DHCP ! Je te propose 192.168.1.51"
- DNSmasq vérifie dans sa base que cette IP est libre
- Il marque temporairement l'IP comme "réservée" (le temps de la négociation)

**Analogie :**
Le réceptionniste répond : "Oui ! J'ai la chambre 51 disponible pour vous"

---

**Ligne 3 : DHCPREQUEST**

```
dnsmasq-dhcp[1235]: DHCPREQUEST(enp0s3) 192.168.1.51 aa:bb:cc:dd:ee:ff
                          ^                  ^              ^
                          │                  │              └─ Qui demande
                          │                  └──────────────── Quelle IP
                          └─────────────────────────────────── Demande formelle
```

**Signification :**
- Le client accepte l'offre
- Message : "OK, je prends 192.168.1.51 !"
- C'est aussi un **broadcast** (tout le réseau l'entend)
- **Pourquoi un broadcast ?** Pour que les autres serveurs DHCP (s'il y en a) sachent que cette IP est prise

**Analogie :**
Le client dit à haute voix : "J'accepte la chambre 51 !"

---

**Ligne 4 : DHCPACK**

```
dnsmasq-dhcp[1235]: DHCPACK(enp0s3) 192.168.1.51 aa:bb:cc:dd:ee:ff DESKTOP-PC
                         ^               ^              ^              ^
                         │               │              │              └─ Nom d'hôte
                         │               │              └──────────────── Client
                         │               └─────────────────────────────── IP confirmée
                         └─────────────────────────────────────────────── Accusé réception
```

**Signification :**
- DNSmasq confirme l'attribution
- Message : "C'est confirmé ! 192.168.1.51 est à toi pour 24h"
- L'IP est maintenant **officiellement attribuée**
- DNSmasq enregistre l'attribution dans `/var/lib/misc/dnsmasq.leases`
- Le nom d'hôte "DESKTOP-PC" est aussi enregistré

**Analogie :**
Le réceptionniste remet la clé : "Voici votre clé, chambre 51, vous pouvez rester 24h"

---

**[DEMARRAGE] Récapitulatif du processus DORA**

```
┌─────────────────────────────────────────────────────┐
│ D = DISCOVER  "Y a-t-il un serveur DHCP ?"          │
│     (Client -> Broadcast)                            │
└────────────┬────────────────────────────────────────┘
             │
             [BLACK_DOWN-POINTING_TRIANGLE]
┌─────────────────────────────────────────────────────┐
│ O = OFFER     "Oui, prends 192.168.1.51"            │
│     (Serveur -> Client)                              │
└────────────┬────────────────────────────────────────┘
             │
             [BLACK_DOWN-POINTING_TRIANGLE]
┌─────────────────────────────────────────────────────┐
│ R = REQUEST   "OK, je prends 192.168.1.51"          │
│     (Client -> Broadcast)                            │
└────────────┬────────────────────────────────────────┘
             │
             [BLACK_DOWN-POINTING_TRIANGLE]
┌─────────────────────────────────────────────────────┐
│ A = ACK       "Confirmé, elle est à toi !"          │
│     (Serveur -> Client)                              │
└─────────────────────────────────────────────────────┘
```

**Durée totale : 50-200 millisecondes** [RAPIDE]

---

### [HAUSSE] Voir les statistiques DHCP

**Combien d'IPs sont distribuées ?**

```bash
wc -l /var/lib/misc/dnsmasq.leases
```

**Explication :**
- `wc` = Word Count (compte)
- `-l` = Lines (lignes)
- Affiche le nombre de lignes dans le fichier
- Chaque ligne = 1 IP distribuée

**Résultat (exemple) :**

```
3 /var/lib/misc/dnsmasq.leases
^
3 appareils ont une IP actuellement
```

---

**Voir uniquement les IPs distribuées :**

```bash
awk '{print $3}' /var/lib/misc/dnsmasq.leases
```

**Explication :**
- `awk` = Outil de traitement de texte
- `{print $3}` = Affiche la 3ème colonne (l'IP)

**Résultat (exemple) :**

```
192.168.1.51
192.168.1.52
192.168.1.53
```

---

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

```bash
awk '{print $3 " - " $4}' /var/lib/misc/dnsmasq.leases
```

**Résultat (exemple) :**

```
192.168.1.51 - DESKTOP-PC
192.168.1.52 - iPhone-Pierre
192.168.1.53 - MacBook-Pro
```

---

### [RECHERCHE] Filtrer les logs

**Voir uniquement les attributions DHCP (pas les requêtes DNS) :**

```bash
sudo grep "DHCP" /var/log/dnsmasq.log
```

**Explication :**
- `grep` = Cherche des lignes contenant un motif
- `"DHCP"` = Le motif à chercher

---

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

```bash
sudo grep "$(date +%b\ %d)" /var/log/dnsmasq.log | grep DHCP
```

**Explication :**
- `$(date +%b\ %d)` = Date du jour au format "Dec 06"
- Premier `grep` = Filtre par date
- Deuxième `grep` = Filtre par "DHCP"

---

**Compter combien d'IPs ont été distribuées aujourd'hui :**

```bash
sudo grep "$(date +%b\ %d)" /var/log/dnsmasq.log | grep DHCPACK | wc -l
```

**Explication :**
- `DHCPACK` = Confirmations d'attribution
- Chaque DHCPACK = 1 IP distribuée
- `wc -l` = Compte les lignes

---

## 🆘 DÉPANNAGE DÉTAILLÉ

### [X] Problème 1 : Le PC ne reçoit pas d'IP

**Symptôme :**

Sur Windows :
```cmd
ipconfig /all
```

Tu vois :
```
Adresse IPv4. . . . . . . . . . . . . .: 169.254.X.X
                                         ^^^^^^^^
                                    ADRESSE APIPA [X]
```

**Qu'est-ce que 169.254.X.X ?**

**APIPA = Automatic Private IP Addressing**

C'est une **adresse de secours** que Windows s'attribue automatiquement quand :
- Aucun serveur DHCP ne répond
- Le câble réseau semble connecté
- Windows ne veut pas rester sans IP

**Analogie :**
C'est comme si tu arrivais à l'hôtel, personne ne répond à la réception, alors tu t'installes dans le hall d'attente (pas idéal, mais mieux que rien).

**Conséquences d'une IP APIPA :**
- [X] Pas d'accès Internet
- [X] Peut communiquer uniquement avec d'autres appareils en APIPA (rare)
- [X] C'est un symptôme clair d'un problème DHCP

---

**Diagnostic étape par étape :**

**Étape 1 : Vérifier que DNSmasq tourne sur la VM**

Dans la VM :
```bash
sudo systemctl status dnsmasq
```

**Résultat attendu :**
```
Active: active (running)
```

**Si "inactive" ou "failed" :**
```bash
# Redémarre DNSmasq
sudo systemctl restart dnsmasq

# Vois les erreurs
sudo journalctl -u dnsmasq -n 50
```

---

**Étape 2 : Vérifier que DNSmasq écoute sur le port 67**

```bash
sudo netstat -tulpn | grep :67
```

**Résultat attendu :**
```
udp  0  0  0.0.0.0:67  *  LISTEN  1235/dnsmasq
```

**Si rien n'apparaît :**
- DNSmasq n'écoute pas sur le port DHCP
- Vérifie la configuration `/etc/dnsmasq.conf`
- Vérifie que l'interface est correcte : `interface=enp0s3`

---

**Étape 3 : Vérifier que le PC et la VM sont sur le même réseau**

**Dans la VM :**
```bash
ip a | grep inet
```

**Tu dois voir :**
```
inet 192.168.1.100/24
```

**Sur le PC (Windows) :**
```cmd
ipconfig
```

**Si tu vois :**
- `169.254.X.X` sur le PC -> Le DHCP ne répond pas
- `192.168.0.X` sur le PC mais VM en `192.168.1.X` -> **Pas le même réseau !**

**Solution si pas le même réseau :**
- Vérifie la configuration réseau de VirtualBox (doit être "Accès par pont")
- Vérifie que tu as sélectionné la bonne carte réseau physique

---

**Étape 4 : Tester la communication PC <-> VM**

**Depuis le PC (si tu as une IP, même APIPA) :**
```cmd
ping 192.168.1.100
```

**Résultat attendu :**
```
Réponse de 192.168.1.100 : octets=32 temps<1ms TTL=64
```

**Si "Délai d'attente de la demande dépassé" :**
- Le PC ne peut pas joindre la VM
- Problème de configuration réseau VirtualBox
- Ou pare-feu qui bloque (voir étape suivante)

---

**Étape 5 : Vérifier le pare-feu de la VM**

**Le pare-feu peut bloquer les requêtes DHCP !**

**Désactive temporairement le pare-feu pour tester :**

```bash
sudo ufw status
```

**Si "Status: active" :**
```bash
# Désactive temporairement
sudo ufw disable

# Teste si le PC reçoit une IP maintenant
```

**Sur ton PC :**
```cmd
ipconfig /release
ipconfig /renew
```

**Si ça marche maintenant**, le pare-feu était en cause.

**Solution permanente : Autoriser DHCP dans le pare-feu**

```bash
# Réactive le pare-feu
sudo ufw enable

# Autorise le port DHCP (67 et 68)
sudo ufw allow 67/udp
sudo ufw allow 68/udp

# Autorise aussi DNS si tu veux (port 53)
sudo ufw allow 53/tcp
sudo ufw allow 53/udp

# Vérifie les règles
sudo ufw status
```

---

**Étape 6 : Vérifier les logs DNSmasq**

```bash
sudo tail -f /var/log/dnsmasq.log
```

**Sur ton PC, fais :**
```cmd
ipconfig /renew
```

**Ce que tu DOIS voir dans les logs :**
```
dnsmasq-dhcp[1235]: DHCPDISCOVER(enp0s3) aa:bb:cc:dd:ee:ff
```

**Si tu ne vois RIEN :**
- Le message DISCOVER n'arrive pas à la VM
- Problème réseau VirtualBox
- Ou le DHCP de la Box répond en premier

**Si tu vois DISCOVER mais pas OFFER :**
- DNSmasq reçoit la demande mais ne répond pas
- Vérifie la plage DHCP dans `/etc/dnsmasq.conf`
- Toutes les IPs sont peut-être déjà prises

---

**Étape 7 : Vérifier la plage DHCP**

```bash
grep "dhcp-range" /etc/dnsmasq.conf
```

**Tu dois voir :**
```
dhcp-range=192.168.1.50,192.168.1.150,255.255.255.0,24h
```

**Vérifie :**
- La plage est correcte
- Elle correspond au réseau de ta VM (192.168.1.X)

---

### [X] Problème 2 : Le PC reçoit une IP mais pas d'Internet

**Symptôme :**

```cmd
ipconfig /all
```

Tu vois :
```
Adresse IPv4 : 192.168.1.51  <- IP OK [OK]
Serveur DHCP : 192.168.1.100  <- VM OK [OK]
Passerelle : 192.168.1.1  <- Box OK [OK]
```

**Mais :**
```cmd
ping google.com
```

```
Impossible de joindre l'hôte de destination [X]
```

---

**Diagnostic :**

**Étape 1 : Tester la passerelle depuis le PC**

```cmd
ping 192.168.1.1
```

**Si ça NE marche PAS :**
- La Box n'est pas joignable
- Problème de configuration réseau
- L'IP de la Box n'est peut-être pas 192.168.1.1

**Pour trouver l'IP de ta Box :**

Cherche un autre appareil qui a Internet (téléphone, autre PC).

Sur cet appareil :
- Regarde la "Passerelle par défaut"
- C'est l'IP de la Box

**Corrige dans `/etc/dnsmasq.conf` :**
```bash
sudo nano /etc/dnsmasq.conf
```

Change :
```bash
dhcp-option=3,192.168.1.1
```

Par la bonne IP de la Box.

Redémarre :
```bash
sudo systemctl restart dnsmasq
```

Sur le PC :
```cmd
ipconfig /release
ipconfig /renew
```

---

**Étape 2 : Tester Internet depuis la VM**

**Dans la VM :**
```bash
ping -c 4 google.com
```

**Si ça NE marche PAS dans la VM :**
- La VM elle-même n'a pas Internet
- Retourne à l'Étape 2 (configuration IP fixe)
- Vérifie la passerelle dans `/etc/netplan/01-netcfg.yaml`

---

**Étape 3 : Vérifier le DNS**

**Le PC peut avoir Internet, mais la résolution de noms ne marche pas :**

```cmd
ping 8.8.8.8
```

**Si ça marche (ping par IP) :**
```
Réponse de 8.8.8.8 : octets=32 temps=15ms [OK]
```

**Mais :**
```cmd
ping google.com
```

```
Impossible de trouver l'hôte google.com [X]
```

**-> Problème DNS !**

**Solution :**

**Dans la VM, vérifie `/etc/dnsmasq.conf` :**

```bash
grep "server=" /etc/dnsmasq.conf
```

**Tu dois voir :**
```
server=8.8.8.8
server=8.8.4.4
```

**Si ces lignes sont commentées (#) ou absentes :**

```bash
sudo nano /etc/dnsmasq.conf
```

Ajoute :
```bash
server=8.8.8.8
server=8.8.4.4
```

Redémarre :
```bash
sudo systemctl restart dnsmasq
```

---

### [X] Problème 3 : Conflit - 2 serveurs DHCP actifs

**Symptôme :**

Comportement erratique :
- Parfois tu reçois une IP de la plage de la VM (192.168.1.50-150)
- Parfois tu reçois une IP en dehors (ex: 192.168.1.200)
- La connexion est instable
- Les paramètres changent constamment

---

**Diagnostic :**

**Vérifie sur ton PC :**

```cmd
ipconfig /all
```

**Fais-le plusieurs fois (libère et renouvelle) :**

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

**Répète 3-4 fois et note :**

| Essai | IP reçue | Serveur DHCP |
|-------|----------|--------------|
| 1 | 192.168.1.51 | 192.168.1.100 (VM) |
| 2 | 192.168.1.202 | 192.168.1.1 (Box) |
| 3 | 192.168.1.53 | 192.168.1.100 (VM) |

**Si le serveur DHCP change -> 2 serveurs DHCP actifs ! [IMPACT]**

---

**Solution : Désactiver le DHCP de la Box**

**Méthode 1 : Interface web de la Box** (voir Étape 5 plus haut)

**Méthode 2 : Réduire la plage DHCP de la Box**

Si tu ne peux pas désactiver le DHCP de la Box :

1. Va dans les paramètres DHCP de la Box
2. Change la plage DHCP pour qu'elle ne chevauche PAS celle de la VM

**Exemple :**

**Box :**
- Plage : `192.168.1.2` à `192.168.1.49`

**VM :**
- Plage : `192.168.1.50` à `192.168.1.150`

**Comme ça, les deux peuvent coexister sans conflit.**

---

### [X] Problème 4 : La VM perd sa connexion réseau

**Symptôme :**

Après un certain temps, la VM n'a plus Internet ou n'est plus accessible depuis le PC.

---

**Cause possible : Économie d'énergie de la carte réseau**

**Solution :**

**Dans VirtualBox** (VM éteinte) :

1. Configuration -> Réseau -> Avancé
2. **Décoche "Câble réseau connecté"** puis **recoche-le**
3. Ou ajoute dans la configuration avancée (voir documentation VirtualBox)

**Ou dans la VM :**

Empêche la carte réseau de se mettre en veille :

```bash
sudo nano /etc/network/if-up.d/disable-power-management
```

**Contenu :**
```bash
#!/bin/sh
ethtool -s enp0s3 wol d
```

**Rends-le exécutable :**
```bash
sudo chmod +x /etc/network/if-up.d/disable-power-management
```

---

### [X] Problème 5 : "Port 53 déjà utilisé"

**Erreur lors du démarrage de DNSmasq :**

```
failed to create listening socket for port 53: Address already in use
```

**Cause :**

Un autre service DNS tourne déjà (souvent `systemd-resolved` sur Ubuntu).

---

**Solution 1 : Désactiver systemd-resolved**

```bash
sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved
```

**Puis redémarre DNSmasq :**
```bash
sudo systemctl restart dnsmasq
```

---

**Solution 2 : Faire cohabiter DNSmasq et systemd-resolved**

**Édite la configuration de systemd-resolved :**

```bash
sudo nano /etc/systemd/resolved.conf
```

**Décommente et change :**
```ini
DNSStubListener=no
```

**Redémarre systemd-resolved :**
```bash
sudo systemctl restart systemd-resolved
```

**Redémarre DNSmasq :**
```bash
sudo systemctl restart dnsmasq
```

---

## [DESIGN] CONCEPTS AVANCÉS

### [SECURISE] Réservations DHCP détaillées

**Qu'est-ce qu'une réservation ?**

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

**Différence avec une IP fixe manuelle :**

| IP fixe manuelle | Réservation DHCP |
|------------------|------------------|
| Configurée sur l'appareil | Configurée sur le serveur |
| L'appareil "force" son IP | L'appareil demande au DHCP, qui lui donne toujours la même |
| Si 2 appareils ont la même IP -> conflit | Le serveur gère, pas de conflit |
| Difficile à maintenir (beaucoup d'appareils) | Centralisé, facile à gérer |

---

**Ajouter une réservation :**

**1. Trouve l'adresse MAC de l'appareil**

**Windows :**
```cmd
ipconfig /all
```

Cherche "Adresse physique" :
```
Adresse physique . . . . . . . . . . . : AA-BB-CC-DD-EE-FF
```

**Mac :**
```bash
ifconfig
```

Cherche "ether" :
```
ether aa:bb:cc:dd:ee:ff
```

**Linux :**
```bash
ip link show
```

---

**2. Choisis une IP fixe (dans ta plage DHCP)**

Exemple : `192.168.1.55`

---

**3. Ajoute la réservation dans `/etc/dnsmasq.conf`**

```bash
sudo nano /etc/dnsmasq.conf
```

**Ajoute à la fin :**
```bash
# Réservation pour le PC de bureau
dhcp-host=AA:BB:CC:DD:EE:FF,192.168.1.55,pc-bureau,infinite
```

**Format :**
```
dhcp-host=ADRESSE_MAC,IP,NOM,DURÉE
```

---

**4. Redémarre DNSmasq**

```bash
sudo systemctl restart dnsmasq
```

---

**5. Sur l'appareil, renouvelle l'IP**

**Windows :**
```cmd
ipconfig /release
ipconfig /renew
```

**Il devrait recevoir `192.168.1.55` maintenant, et TOUJOURS cette IP !**

---

### [GRAPHIQUE] Comprendre le "Lease Time" (durée de bail)

**Qu'est-ce que le lease time ?**

C'est la **durée pendant laquelle une IP est "louée"** à un appareil.

**Dans notre config :**
```bash
dhcp-range=192.168.1.50,192.168.1.150,255.255.255.0,24h
                                                    ^^^
                                               Lease time
```

**24h = L'IP est prêtée pour 24 heures**

---

**Que se passe-t-il après 24h ?**

**Scénario 1 : L'appareil est toujours connecté**

À **50% du lease time** (12h dans notre cas), l'appareil demande à **renouveler** son bail :

```
Appareil -> Serveur DHCP : "Je voudrais garder 192.168.1.51"
Serveur -> Appareil : "OK, prolongé de 24h"
```

C'est **transparent**, l'appareil garde son IP.

**Analogie :**
C'est comme prolonger ta réservation d'hôtel avant l'expiration.

---

**Scénario 2 : L'appareil se déconnecte avant l'expiration**

L'appareil envoie un message **DHCPRELEASE** :

```
Appareil -> Serveur : "Je pars, vous pouvez reprendre 192.168.1.51"
```

L'IP redevient **immédiatement disponible**.

---

**Scénario 3 : L'appareil disparaît sans prévenir**

(Extinction brutale, coupure réseau, etc.)

Le serveur DHCP attend l'**expiration du bail** (24h).

Après 24h, l'IP redevient disponible automatiquement.

**Pendant ces 24h, l'IP est "bloquée"** (même si l'appareil n'est plus là).

---

**Choisir la bonne durée de lease :**

| Durée | Usage recommandé |
|-------|------------------|
| 1h-4h | Réseau public (café, aéroport) - beaucoup de rotation |
| 8h-12h | Bureau (les gens restent une journée) |
| 24h | Maison (appareils stables) <- **Notre choix** |
| 1 semaine | Réseau très stable, peu d'appareils |
| infinite | Réservations uniquement (serveurs, imprimantes) |

---

### [WEB] Options DHCP supplémentaires

**DNSmasq supporte des dizaines d'options DHCP standardisées.**

**Voici les plus utiles :**

```bash
# Option 3 : Passerelle par défaut (on l'utilise déjà)
dhcp-option=3,192.168.1.1

# Option 6 : Serveurs DNS (on l'utilise déjà)
dhcp-option=6,192.168.1.100

# Option 15 : Nom de domaine DNS
dhcp-option=15,monreseau.local

# Option 42 : Serveurs NTP (synchronisation de l'heure)
dhcp-option=42,192.168.1.100

# Option 44 : Serveurs WINS (pour Windows)
dhcp-option=44,192.168.1.100

# Option 66 : Serveur TFTP (pour PXE boot)
dhcp-option=66,192.168.1.100

# Option 67 : Fichier de boot (pour PXE)
dhcp-option=67,pxelinux.0
```

**Pour ajouter ces options :**

```bash
sudo nano /etc/dnsmasq.conf
```

**Ajoute les lignes qui t'intéressent.**

**Redémarre :**
```bash
sudo systemctl restart dnsmasq
```

---

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

### Dans la VM Linux

```bash
# ═══════════════════════════════════════════
# GESTION DU SERVICE DNSMASQ
# ═══════════════════════════════════════════

# Démarrer DNSmasq
sudo systemctl start dnsmasq

# Arrêter DNSmasq
sudo systemctl stop dnsmasq

# Redémarrer DNSmasq
sudo systemctl restart dnsmasq

# Voir le statut
sudo systemctl status dnsmasq

# Activer au démarrage
sudo systemctl enable dnsmasq

# Désactiver au démarrage
sudo systemctl disable dnsmasq

```bash
# ═══════════════════════════════════════════
# LOGS ET SURVEILLANCE
# ═══════════════════════════════════════════

# Chercher dans les logs
sudo grep "192.168.1.51" /var/log/dnsmasq.log

# Voir uniquement les événements DHCP
sudo grep "DHCP" /var/log/dnsmasq.log

# Voir les logs système de DNSmasq
sudo journalctl -u dnsmasq

# Voir les 50 dernières lignes des logs système
sudo journalctl -u dnsmasq -n 50

# Suivre les logs système en temps réel
sudo journalctl -u dnsmasq -f

# ═══════════════════════════════════════════
# BAUX DHCP (LEASES)
# ═══════════════════════════════════════════

# Voir tous les baux actifs
cat /var/lib/misc/dnsmasq.leases

# Compter le nombre d'appareils connectés
wc -l /var/lib/misc/dnsmasq.leases

# Voir uniquement les IPs distribuées
awk '{print $3}' /var/lib/misc/dnsmasq.leases

# Voir IPs + noms d'hôtes
awk '{print $3 " - " $4}' /var/lib/misc/dnsmasq.leases

# Voir les adresses MAC + IPs
awk '{print $2 " -> " $3}' /var/lib/misc/dnsmasq.leases

# ═══════════════════════════════════════════
# CONFIGURATION
# ═══════════════════════════════════════════

# Éditer la configuration
sudo nano /etc/dnsmasq.conf

# Tester la syntaxe sans démarrer
sudo dnsmasq --test

# Voir la configuration active (lignes non commentées)
grep -v "^#" /etc/dnsmasq.conf | grep -v "^$"

# Sauvegarder la configuration
sudo cp /etc/dnsmasq.conf /etc/dnsmasq.conf.backup

# Restaurer une sauvegarde
sudo cp /etc/dnsmasq.conf.backup /etc/dnsmasq.conf

# ═══════════════════════════════════════════
# RÉSEAU
# ═══════════════════════════════════════════

# Voir les interfaces réseau et leurs IPs
ip a

# Voir uniquement l'IP de enp0s3
ip a show enp0s3

# Voir les routes réseau
ip route

# Tester la connexion à un hôte
ping -c 4 192.168.1.1

# Voir qui écoute sur quel port
sudo netstat -tulpn

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

# Voir qui écoute sur le port DNS (53)
sudo netstat -tulpn | grep :53

# ═══════════════════════════════════════════
# PARE-FEU (UFW)
# ═══════════════════════════════════════════

# Voir le statut du pare-feu
sudo ufw status

# Désactiver le pare-feu (temporaire, pour tests)
sudo ufw disable

# Activer le pare-feu
sudo ufw enable

# Autoriser DHCP
sudo ufw allow 67/udp
sudo ufw allow 68/udp

# Autoriser DNS
sudo ufw allow 53/tcp
sudo ufw allow 53/udp

# Voir les règles du pare-feu (numérotées)
sudo ufw status numbered

# Supprimer une règle (par numéro)
sudo ufw delete 3

# ═══════════════════════════════════════════
# DÉPANNAGE
# ═══════════════════════════════════════════

# Redémarrer le réseau (Netplan)
sudo netplan apply

# Tester la configuration Netplan
sudo netplan try

# Voir les processus DNSmasq en cours
ps aux | grep dnsmasq

# Tuer un processus DNSmasq bloqué (remplace PID)
sudo kill -9 PID

# Vider le cache DNS de DNSmasq
sudo killall -HUP dnsmasq

# Recharger la configuration sans redémarrer
sudo systemctl reload dnsmasq
```

---

### Sur ton PC Windows

```cmd
REM ═══════════════════════════════════════════
REM GESTION IP
REM ═══════════════════════════════════════════

REM Voir la configuration réseau complète
ipconfig /all

REM Voir uniquement la configuration de base
ipconfig

REM Libérer l'adresse IP actuelle
ipconfig /release

REM Demander une nouvelle adresse IP
ipconfig /renew

REM Libérer puis renouveler (une seule commande)
ipconfig /release && ipconfig /renew

REM Vider le cache DNS
ipconfig /flushdns

REM Afficher le cache DNS
ipconfig /displaydns

REM ═══════════════════════════════════════════
REM TESTS RÉSEAU
REM ═══════════════════════════════════════════

REM Tester la connexion à la VM
ping 192.168.1.100

REM Tester la connexion à la Box
ping 192.168.1.1

REM Tester Internet (par IP)
ping 8.8.8.8

REM Tester Internet (par nom)
ping google.com

REM Ping continu (Ctrl+C pour arrêter)
ping -t 192.168.1.100

REM Tracer la route vers un hôte
tracert google.com

REM Voir les connexions réseau actives
netstat -an

REM Voir la table ARP (correspondance IP <-> MAC)
arp -a

REM ═══════════════════════════════════════════
REM DNS
REM ═══════════════════════════════════════════

REM Interroger le serveur DNS
nslookup google.com

REM Interroger un serveur DNS spécifique
nslookup google.com 192.168.1.100

REM Mode interactif nslookup
nslookup

REM ═══════════════════════════════════════════
REM INFORMATIONS SYSTÈME
REM ═══════════════════════════════════════════

REM Voir le nom de l'ordinateur
hostname

REM Voir toutes les infos système réseau
systeminfo | findstr /C:"Host Name" /C:"Domain"
```

---

### Sur Mac

```bash
# ═══════════════════════════════════════════
# GESTION IP
# ═══════════════════════════════════════════

# Voir la configuration réseau
ifconfig

# Voir uniquement une interface spécifique
ifconfig en0

# Libérer l'adresse IP
sudo ipconfig set en0 DHCP

# Renouveler le bail DHCP
sudo ipconfig set en0 BOOTP && sudo ipconfig set en0 DHCP

# Voir les infos DHCP détaillées
ipconfig getpacket en0

# Vider le cache DNS
sudo dscacheutil -flushcache
sudo killall -HUP mDNSResponder

# ═══════════════════════════════════════════
# TESTS RÉSEAU
# ═══════════════════════════════════════════

# Tester la connexion
ping -c 4 192.168.1.100

# Tracer la route
traceroute google.com

# Voir les connexions réseau
netstat -an

# Voir la table ARP
arp -a

# Scanner les ports ouverts (si nmap installé)
nmap 192.168.1.100

# ═══════════════════════════════════════════
# DNS
# ═══════════════════════════════════════════

# Interroger le DNS
nslookup google.com

# Dig (plus détaillé)
dig google.com

# Dig vers un serveur spécifique
dig @192.168.1.100 google.com
```

---

## [OBJECTIF] EXERCICES PRATIQUES

### Exercice 1 : Attribution basique * (Débutant)

**Objectif :** Vérifier que ton serveur DHCP fonctionne correctement.

**Étapes :**

1. **Dans la VM, vérifie que DNSmasq tourne**
   ```bash
   sudo systemctl status dnsmasq
   ```
   
2. **Sur ton PC, libère et renouvelle l'IP**
   ```cmd
   ipconfig /release
   ipconfig /renew
   ```

3. **Vérifie l'IP reçue**
   ```cmd
   ipconfig /all
   ```

4. **Dans la VM, vérifie les logs**
   ```bash
   sudo tail -n 20 /var/log/dnsmasq.log
   ```

5. **Vérifie le fichier des baux**
   ```bash
   cat /var/lib/misc/dnsmasq.leases
   ```

**Questions :**
- Quelle IP as-tu reçue ?
- Le serveur DHCP est-il bien 192.168.1.100 ?
- Combien de temps dure le bail ?
- Vois-tu les 4 messages DORA dans les logs ?

**Solution attendue :**
- IP entre 192.168.1.50 et 192.168.1.150
- Serveur DHCP = 192.168.1.100
- Bail = 24h
- Logs montrent : DISCOVER -> OFFER -> REQUEST -> ACK

---

### Exercice 2 : Créer une réservation ** (Intermédiaire)

**Objectif :** Réserver une IP fixe pour ton PC.

**Étapes :**

1. **Sur ton PC, note ton adresse MAC**
   ```cmd
   ipconfig /all
   ```
   Cherche "Adresse physique" : `AA-BB-CC-DD-EE-FF`

2. **Dans la VM, édite dnsmasq.conf**
   ```bash
   sudo nano /etc/dnsmasq.conf
   ```

3. **Ajoute une réservation (remplace XX par ta MAC)**
   ```bash
   dhcp-host=AA:BB:CC:DD:EE:FF,192.168.1.75,mon-pc,infinite
   ```

4. **Teste la syntaxe**
   ```bash
   sudo dnsmasq --test
   ```

5. **Redémarre DNSmasq**
   ```bash
   sudo systemctl restart dnsmasq
   ```

6. **Sur ton PC, renouvelle l'IP**
   ```cmd
   ipconfig /release
   ipconfig /renew
   ipconfig /all
   ```

**Questions :**
- As-tu reçu exactement 192.168.1.75 ?
- Si tu renouvelles plusieurs fois, reçois-tu toujours la même IP ?
- Apparaît-elle dans le fichier des baux ?

**Solution attendue :**
- IP = exactement 192.168.1.75
- Toujours la même IP à chaque renouvellement
- Visible dans `/var/lib/misc/dnsmasq.leases`

---

### Exercice 3 : Tester l'expiration d'un bail *** (Avancé)

**Objectif :** Comprendre le mécanisme d'expiration des baux.

**[ATTENTION] Cet exercice prend du temps (jusqu'à 24h) !**

**Variante rapide : Réduire temporairement le lease time à 5 minutes**

**Étapes :**

1. **Modifie le lease time dans dnsmasq.conf**
   ```bash
   sudo nano /etc/dnsmasq.conf
   ```
   
   Change :
   ```bash
   dhcp-range=192.168.1.50,192.168.1.150,255.255.255.0,5m
   ```
   (5m = 5 minutes)

2. **Redémarre DNSmasq**
   ```bash
   sudo systemctl restart dnsmasq
   ```

3. **Sur ton PC, renouvelle l'IP**
   ```cmd
   ipconfig /renew
   ipconfig /all
   ```
   Note l'heure d'expiration du bail (sera dans 5 minutes).

4. **Attends 2-3 minutes (50% du bail), surveille les logs de la VM**
   ```bash
   sudo tail -f /var/log/dnsmasq.log
   ```

5. **Observe le renouvellement automatique**
   Tu devrais voir :
   ```
   dnsmasq-dhcp[1235]: DHCPREQUEST(enp0s3) 192.168.1.51 aa:bb:cc:dd:ee:ff
   dnsmasq-dhcp[1235]: DHCPACK(enp0s3) 192.168.1.51 aa:bb:cc:dd:ee:ff
   ```

6. **Déconnecte le câble réseau (ou désactive WiFi) pendant 5 minutes**

7. **Reconnecte après 6 minutes**

8. **Vérifie si tu as la même IP ou une nouvelle**

**Questions :**
- À quel moment (% du bail) l'appareil demande-t-il à renouveler ?
- Que se passe-t-il si l'appareil est déconnecté pendant l'expiration ?
- L'IP est-elle libérée immédiatement ou après expiration ?

**[ATTENTION] N'oublie pas de remettre le lease time à 24h après !**

```bash
sudo nano /etc/dnsmasq.conf
# Change 5m en 24h
sudo systemctl restart dnsmasq
```

---

### Exercice 4 : Créer des plages multiples *** (Avancé)

**Objectif :** Configurer différentes plages DHCP pour différents usages.

**Scénario :**
- Plage 1 : 192.168.1.50-100 -> Appareils invités (courte durée)
- Plage 2 : 192.168.1.101-150 -> Appareils permanents (longue durée)

**[ATTENTION] Attention : DNSmasq ne supporte qu'UNE plage par interface !**

**Solution : Utiliser des "tags" DHCP**

```bash
sudo nano /etc/dnsmasq.conf
```

**Configuration avancée :**

```bash
# Plage par défaut (invités)
dhcp-range=192.168.1.50,192.168.1.100,255.255.255.0,2h

# Tag pour les appareils permanents
dhcp-host=AA:BB:CC:DD:EE:FF,set:permanent
dhcp-host=11:22:33:44:55:66,set:permanent

# Plage pour les appareils taggés "permanent"
dhcp-range=tag:permanent,192.168.1.101,192.168.1.150,255.255.255.0,7d

# Options spécifiques aux permanents
dhcp-option=tag:permanent,6,192.168.1.100
```

**Tester et observer les différences.**

---

### Exercice 5 : Simuler un conflit DHCP *** (Avancé - Éducatif)

**Objectif :** Comprendre ce qui se passe avec 2 serveurs DHCP.

**[ATTENTION] ATTENTION : Cela peut perturber ton réseau ! Fais-le sur un réseau de test.**

**Étapes :**

1. **Garde ton DHCP DNSmasq actif sur la VM**

2. **Réactive le DHCP de ta Box** (temporairement)

3. **Sur ton PC, renouvelle l'IP plusieurs fois**
   ```cmd
   for /L %i in (1,1,10) do (
       ipconfig /release
       ipconfig /renew
       ipconfig /all | findstr "Serveur DHCP"
       timeout 2
   )
   ```

4. **Observe les résultats**
   - Reçois-tu toujours la même IP ?
   - Le serveur DHCP change-t-il ?
   - Y a-t-il des incohérences ?

5. **Dans la VM, surveille les logs**
   ```bash
   sudo tail -f /var/log/dnsmasq.log
   ```

6. **Analyse les comportements**

**Questions :**
- Quel serveur répond en premier ?
- Les clients peuvent-ils fonctionner normalement ?
- Que se passe-t-il avec les paramètres (passerelle, DNS) ?

**[ATTENTION] Désactive le DHCP de la Box après l'exercice !**

---

## [RAPIDE] ALLER PLUS LOIN

### [OUTIL] Configuration PXE Boot (Network Boot)

**PXE = Démarrer un ordinateur depuis le réseau**

**Cas d'usage :**
- Installer un OS sans clé USB
- Laboratoires informatiques (démarrage centralisé)
- Récupération système

**Configuration DNSmasq pour PXE :**

```bash
sudo nano /etc/dnsmasq.conf
```

**Ajoute :**

```bash
# Activer PXE
dhcp-boot=pxelinux.0

# Serveur TFTP intégré
enable-tftp
tftp-root=/var/lib/tftpboot

# Options PXE
dhcp-option=66,192.168.1.100    # Serveur TFTP
dhcp-option=67,pxelinux.0        # Fichier de boot
```

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

```bash
# Installe le serveur TFTP et les fichiers
sudo apt install tftpd-hpa pxelinux syslinux-common

# Crée le dossier TFTP
sudo mkdir -p /var/lib/tftpboot/pxelinux.cfg

# Copie 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/

# Redémarre DNSmasq
sudo systemctl restart dnsmasq
```

**Tu peux maintenant booter un PC depuis le réseau !**

---

### [RESEAU] Créer un portail captif (Hotspot WiFi)

**Un portail captif = page d'accueil avant d'avoir Internet**

Utilisé dans :
- Hôtels, cafés, aéroports
- Réseaux invités avec conditions d'utilisation

**Outils :**
- **NoCatSplash** (simple)
- **Coova-Chilli** (plus complet)
- **pfSense** (solution complète)

**Installation de base de NoCatSplash :**

```bash
sudo apt install nodogsplash
```

**Configuration :**

```bash
sudo nano /etc/nodogsplash/nodogsplash.conf
```

**Intégration avec DNSmasq pour gérer les IPs des invités.**

---

### [SECURISE] Segmenter le réseau (VLANs)

**VLAN = Virtual LAN = Réseaux virtuels séparés**

**Exemple :**
- VLAN 10 : Appareils personnels (192.168.10.0/24)
- VLAN 20 : Appareils invités (192.168.20.0/24)
- VLAN 30 : IoT (192.168.30.0/24)

**Avantages :**
- Sécurité (isolation)
- Performance (moins de broadcast)
- Organisation

**Configuration avec DNSmasq multi-VLAN :**

```bash
# Interface VLAN 10
interface=enp0s3.10
dhcp-range=interface:enp0s3.10,192.168.10.50,192.168.10.150,24h

# Interface VLAN 20
interface=enp0s3.20
dhcp-range=interface:enp0s3.20,192.168.20.50,192.168.20.150,2h

# Interface VLAN 30
interface=enp0s3.30
dhcp-range=interface:enp0s3.30,192.168.30.50,192.168.30.150,7d
```

**Nécessite la configuration des VLANs au niveau réseau (switch, routeur).**

---

### [GRAPHIQUE] Monitoring avec des outils graphiques

**Webmin = Interface web pour gérer Linux**

```bash
# Installation
wget http://prdownloads.sourceforge.net/webadmin/webmin_2.0_all.deb
sudo dpkg -i webmin_2.0_all.deb
sudo apt install -f

# Accès : https://192.168.1.100:10000
```

**PHPIPam = Gestion visuelle des IPs**

Permet de voir graphiquement :
- Quelles IPs sont utilisées
- Lesquelles sont libres
- Historique d'attribution
- Documentation

---

### [DOCKER] Conteneuriser DNSmasq (Docker)

**Avantage :** Isolation, portabilité

**Exemple de Dockerfile :**

```dockerfile
FROM alpine:latest

RUN apk add --no-cache dnsmasq

COPY dnsmasq.conf /etc/dnsmasq.conf

EXPOSE 53/tcp 53/udp 67/udp

CMD ["dnsmasq", "-k", "--log-facility=-"]
```

**docker-compose.yml :**

```yaml
version: '3'
services:
  dnsmasq:
    build: .
    network_mode: host
    cap_add:
      - NET_ADMIN
    volumes:
      - ./dnsmasq.conf:/etc/dnsmasq.conf
      - ./leases:/var/lib/misc
    restart: unless-stopped
```

---

## [GUIDE] RESSOURCES SUPPLÉMENTAIRES

### [DOCS] Documentation officielle

**DNSmasq :**
- Site officiel : http://www.thekelleys.org.uk/dnsmasq/doc.html
- Manuel complet : `man dnsmasq`
- Configuration : `man dnsmasq.conf`

**DHCP (RFC - Standards) :**
- RFC 2131 : DHCP (protocole de base)
- RFC 2132 : Options DHCP

**VirtualBox :**
- Documentation réseau : https://www.virtualbox.org/manual/ch06.html

---

### [COURS] Pour approfondir

**Livres recommandés :**
- "TCP/IP Illustrated, Volume 1" - W. Richard Stevens
- "Computer Networks" - Andrew S. Tanenbaum

**Cours en ligne :**
- Cisco CCNA (certification réseau)
- CompTIA Network+
- Cours sur Udemy, Coursera, edX

**Communautés :**
- Reddit : r/homelab, r/networking
- Stack Overflow / Server Fault
- Forums Linux (Ubuntu Forums, LinuxQuestions.org)

---

### [OUTILS] Outils réseau utiles

```bash
# Installation d'outils de diagnostic
sudo apt install net-tools dnsutils tcpdump nmap wireshark-cli

# net-tools : ifconfig, netstat, arp
# dnsutils : dig, nslookup, host
# tcpdump : Capture de paquets réseau
# nmap : Scanner de ports et de réseau
# wireshark : Analyse de trafic réseau
```

**Exemples d'utilisation :**

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

# Scanner le réseau
nmap -sn 192.168.1.0/24

# Analyser les requêtes DNS
sudo tcpdump -i enp0s3 -n port 53

# Vérifier la connectivité réseau
mtr google.com
```

---

## [BRAVO] FÉLICITATIONS !

### [TROPHEE] Ce que tu as appris

**Concepts théoriques :**
- [OK] Qu'est-ce qu'une adresse IP
- [OK] Qu'est-ce que le DHCP et comment il fonctionne
- [OK] Le processus DORA (Discover, Offer, Request, Ack)
- [OK] Les modes réseau de VirtualBox
- [OK] DNS et résolution de noms
- [OK] Baux DHCP (lease time)
- [OK] Réservations DHCP

**Compétences pratiques :**
- [OK] Configurer VirtualBox en mode pont
- [OK] Donner une IP fixe à une VM Linux
- [OK] Installer et configurer DNSmasq
- [OK] Distribuer des IPs automatiquement
- [OK] Créer des réservations DHCP
- [OK] Surveiller l'activité réseau (logs, baux)
- [OK] Dépanner des problèmes réseau courants
- [OK] Utiliser les commandes réseau (ip, ping, netstat, etc.)

**Tu es maintenant capable de :**
- [OBJECTIF] Gérer un petit réseau local
- [OBJECTIF] Comprendre et résoudre des problèmes DHCP
- [OBJECTIF] Lire et interpréter des logs réseau
- [OBJECTIF] Configurer des services réseau sur Linux

---

### [RAPIDE] Prochaines étapes suggérées

**Niveau 1 - Consolider :**
1. Garde ton serveur DHCP actif quelques jours
2. Connecte différents appareils (téléphone, tablette, autre PC)
3. Crée des réservations pour chaque appareil
4. Surveille les logs quotidiennement

**Niveau 2 - Améliorer :**
1. Configure un serveur DNS complet (avec zone personnalisée)
2. Ajoute un serveur web (Apache/Nginx) sur la VM
3. Configure un NAS ou serveur de fichiers (Samba)
4. Mets en place des sauvegardes automatiques

**Niveau 3 - Expertise :**
1. Segmente ton réseau avec des VLANs
2. Configure un pare-feu avancé (pfSense, OPNsense)
3. Mets en place un système de monitoring (Nagios, Zabbix)
4. Apprends IPv6 et configure le DHCP IPv6
5. Configure un VPN (WireGuard, OpenVPN)

---

### [IDEE] Conseils finaux

**Pour bien progresser :**

1. **Pratique régulièrement**
   - Un peu chaque jour vaut mieux que beaucoup d'un coup
   - Refais les exercices jusqu'à les maîtriser

2. **Documente tes configurations**
   - Prends des notes
   - Fais des captures d'écran
   - Tiens un journal de tes modifications

3. **Expérimente sans peur**
   - C'est une VM, tu ne peux rien casser définitivement
   - Fais des snapshots VirtualBox avant les gros changements
   - Teste, casse, répare, apprends !

4. **Pose des questions**
   - Les communautés sont là pour aider
   - Explique clairement ton problème
   - Partage tes logs et configurations

5. **Enseigne aux autres**
   - La meilleure façon d'apprendre est d'enseigner
   - Explique à un ami ce que tu as appris
   - Écris tes propres guides

---

### [NOTE] Checklist de validation finale

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

**Configuration de base :**
- [ ] Configurer VirtualBox en mode pont
- [ ] Donner une IP fixe à la VM avec Netplan
- [ ] Installer DNSmasq
- [ ] Créer une configuration DHCP fonctionnelle
- [ ] Redémarrer DNSmasq sans erreur

**Tests :**
- [ ] Faire en sorte que ton PC reçoive une IP de la VM
- [ ] Vérifier que l'IP est dans la bonne plage
- [ ] Vérifier que le serveur DHCP est la VM
- [ ] Tester l'accès Internet depuis le PC
- [ ] Ping entre PC et VM dans les 2 sens

**Surveillance :**
- [ ] Voir les baux DHCP actifs
- [ ] Voir les logs en temps réel
- [ ] Identifier les 4 étapes DORA dans les logs
- [ ] Compter le nombre d'appareils connectés

**Avancé :**
- [ ] Créer une réservation DHCP
- [ ] Modifier le lease time
- [ ] Ajouter des options DHCP personnalisées
- [ ] Dépanner un problème DHCP

**Si tu peux cocher toutes ces cases, tu MAÎTRISES le DHCP ! [BRAVO]**

---

## [BRAVO] MESSAGE FINAL

**Bravo d'avoir suivi ce guide jusqu'au bout !**

Le réseau peut sembler complexe au début, mais tu viens de faire un **ÉNORME** pas en avant.

Tu ne regarderas plus jamais ton réseau domestique de la même façon. Tu comprends maintenant ce qui se passe "sous le capot" quand tu te connectes au WiFi.

**Cette compétence est précieuse :**
- Pour ta culture générale informatique
- Pour dépanner tes propres problèmes réseau
- Pour aider tes amis et ta famille
- Pour ta carrière (si tu vas dans l'IT/réseau)

**Continue d'apprendre, de pratiquer, d'expérimenter !**

Le monde du réseau est vaste et passionnant. DHCP n'est que le début. [RAPIDE]

---

## [TEL] AIDE ET SUPPORT

**Si tu es bloqué :**

1. **Relis le guide** (la réponse est souvent dedans)
2. **Consulte les logs** (ils disent toujours ce qui ne va pas)
3. **Cherche l'erreur sur Google** (tu n'es pas le premier à l'avoir)
4. **Demande sur les forums**
   - Explique clairement ton problème
   - Donne le contexte (OS, version, ce que tu as fait)