# [COURS] GUIDE VLAN (802.1Q) SUR VIRTUALBOX - ULTRA DÉTAILLÉ POUR DÉBUTANTS ABSOLUS

---

## * AVANT DE COMMENCER : COMPRENDRE LES BASES

### Qu'est-ce qu'un VLAN ?

**VLAN = Virtual Local Area Network = Réseau Local Virtuel**

#### Analogie simple : L'immeuble avec plusieurs étages

Imagine un immeuble de bureaux :

```
[ENTREPRISE] IMMEUBLE (= TON CÂBLE RÉSEAU PHYSIQUE)
│
├─ [BLEU] Étage 1 : Comptabilité (VLAN 10)
│  └─ Seuls les comptables peuvent y accéder
│
├─ [VERT] Étage 2 : Direction (VLAN 20)
│  └─ Seuls les directeurs peuvent y accéder
│
└─ [JAUNE] Étage 3 : Invités (VLAN 30)
   └─ WiFi public, accès limité
```

**SANS VLAN (situation normale) :**
```
[RESEAU] Réseau unique (192.168.1.0/24)
│
├─ [CODE] PC Comptable (192.168.1.10)
├─ [CODE] PC Directeur (192.168.1.20)
└─ [MOBILE] Téléphone Invité (192.168.1.30)
     │
     └─ TOUS peuvent se parler ! [ATTENTION]
        Problème de sécurité potentiel
```

**AVEC VLAN (situation sécurisée) :**
```
[RESEAU] Câble physique unique
│
├─ [BLEU] VLAN 10 : Comptabilité (192.168.10.0/24)
│  ├─ [CODE] PC Comptable 1 (192.168.10.10)
│  └─ [CODE] PC Comptable 2 (192.168.10.11)
│      │
│      └─ Peuvent se parler entre eux [OK]
│
├─ [VERT] VLAN 20 : Direction (192.168.20.0/24)
│  └─ [CODE] PC Directeur (192.168.20.10)
│      │
│      └─ ISOLÉ des autres VLANs [OK]
│
└─ [JAUNE] VLAN 30 : Invités (192.168.30.0/24)
   └─ [MOBILE] Téléphone (192.168.30.10)
       │
       └─ Accès Internet uniquement, pas aux autres VLANs [OK]
```

---

### Pourquoi utiliser des VLANs ?

#### [OK] Avantages principaux :

**1. Sécurité**
- Isolation des réseaux sensibles
- Les invités ne peuvent pas accéder aux serveurs
- Limite la propagation des attaques

**2. Performance**
- Réduit le trafic de broadcast
- Moins de "bruit" réseau sur chaque segment

**3. Organisation**
- Groupement logique des appareils
- Facile à gérer et à comprendre

**4. Économie**
- Un seul câble pour plusieurs réseaux
- Pas besoin de câbles physiques séparés

---

### Qu'est-ce que 802.1Q ?

**802.1Q = Standard IEEE pour le marquage VLAN**

#### Comment ça marche ?

Quand un paquet réseau traverse le câble, 802.1Q ajoute une **étiquette** (tag) qui dit :
> "Ce paquet appartient au VLAN 10"

```
PAQUET RÉSEAU NORMAL :
┌────────────┬──────────┬─────────┐
│ Destination│  Source  │ Données │
└────────────┴──────────┴─────────┘

PAQUET RÉSEAU AVEC 802.1Q :
┌────────────┬──────────┬─────────────┬─────────┐
│ Destination│  Source  │ TAG VLAN 10 │ Données │
└────────────┴──────────┴─────────────┴─────────┘
                         ^^^^^^^^^^^^^
                    Étiquette ajoutée
```

**Le TAG contient :**
- **VLAN ID** : Numéro du VLAN (1 à 4094)
- **Priorité** : Pour la QoS (Quality of Service)

---

### Concepts importants

#### - Port "Access" (Accès)
**Port connecté à un appareil final (PC, téléphone, imprimante)**

Caractéristiques :
- [OK] Appartient à **UN SEUL** VLAN
- [OK] Les paquets sortent **SANS tag** (l'appareil ne voit pas le VLAN)
- [OK] Simple pour l'utilisateur final

Exemple :
```
[CODE] PC <--> Port Access VLAN 10 <--> Switch
      Paquets sans tag         Paquets avec tag VLAN 10
```

#### - Port "Trunk" (Trunk)
**Port qui transporte PLUSIEURS VLANs**

Caractéristiques :
- [OK] Peut transporter **TOUS les VLANs**
- [OK] Les paquets ont un **tag VLAN**
- [OK] Utilisé entre switches ou vers un routeur/serveur

Exemple :
```
Switch A <--> Port Trunk <--> Switch B
         │
         ├─ VLAN 10 (tagged)
         ├─ VLAN 20 (tagged)
         └─ VLAN 30 (tagged)
```

#### [BLEU] VLAN natif (Native VLAN)
**Le VLAN par défaut sur un port trunk**

- Sur un trunk, UN seul VLAN peut circuler **sans tag**
- Par défaut : VLAN 1
- [ATTENTION] Risque de sécurité si mal configuré

---

## [OBJECTIF] OBJECTIF DU PROJET

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

On va créer **3 VLANs distincts** sur notre VM Linux :

```
┌─────────────────────────────────────────────────────────────┐
│ [ECRAN] TON ORDINATEUR PHYSIQUE                                   │
│                                                              │
│ ┌──────────────────────────────────────────────────────────┐│
│ │ [PACKAGE] VirtualBox                                            ││
│ │                                                          ││
│ │ ┌────────────────────────────────────────────────────────┐││
│ │ │ [CODE] Machine Virtuelle (Ubuntu/Debian)                  │││
│ │ │                                                        │││
│ │ │ [RESEAU] Interface physique : enp0s3                        │││
│ │ │     │                                                  │││
│ │ │     ├─ [BLEU] VLAN 10 : Comptabilité (192.168.10.0/24)   │││
│ │ │     │   └─ enp0s3.10 (192.168.10.1)                  │││
│ │ │     │                                                  │││
│ │ │     ├─ [VERT] VLAN 20 : Direction (192.168.20.0/24)      │││
│ │ │     │   └─ enp0s3.20 (192.168.20.1)                  │││
│ │ │     │                                                  │││
│ │ │     └─ [JAUNE] VLAN 30 : Invités (192.168.30.0/24)        │││
│ │ │         └─ enp0s3.30 (192.168.30.1)                  │││
│ │ └────────────────────────────────────────────────────────┘││
│ └──────────────────────────────────────────────────────────┘│
└─────────────────────────────────────────────────────────────┘
```

### Architecture détaillée

```
[BLEU] VLAN 10 - COMPTABILITÉ (Réseau sécurisé)
├─ Réseau : 192.168.10.0/24
├─ Passerelle : 192.168.10.1 (la VM)
├─ Plage DHCP : 192.168.10.50 - 192.168.10.150
└─ Usage : Postes comptables, données sensibles

[VERT] VLAN 20 - DIRECTION (Réseau très sécurisé)
├─ Réseau : 192.168.20.0/24
├─ Passerelle : 192.168.20.1 (la VM)
├─ Plage DHCP : 192.168.20.50 - 192.168.20.150
└─ Usage : Direction, serveurs critiques

[JAUNE] VLAN 30 - INVITÉS (Réseau public)
├─ Réseau : 192.168.30.0/24
├─ Passerelle : 192.168.30.1 (la VM)
├─ Plage DHCP : 192.168.30.50 - 192.168.30.150
└─ Usage : WiFi invités, accès Internet uniquement
```

---

## [DOCS] ÉTAPE 0 : PRÉREQUIS

### Vérifications avant de commencer

[OK] **VirtualBox installé**
[OK] **VM Linux fonctionnelle** (Ubuntu 20.04+ ou Debian 11+)
[OK] **Tu as suivi le guide DHCP** (connaissance de base du réseau)
[OK] **Interface réseau en mode "Accès par pont"** (Bridged)

### Packages nécessaires

```bash
# Installe les outils VLAN
sudo apt update
sudo apt install vlan -y
```

**Explication :**
- `vlan` = Package contenant les outils pour gérer les VLANs sous Linux
- `-y` = Répond automatiquement "yes" aux confirmations

### Charger le module kernel VLAN

```bash
# Charge le module 8021q (802.1Q VLAN tagging)
sudo modprobe 8021q
```

**Explication :**
- `modprobe` = Charge un module du noyau Linux
- `8021q` = Module kernel pour le support 802.1Q VLAN

### Rendre le chargement permanent

```bash
# Ajoute le module au démarrage automatique
echo "8021q" | sudo tee -a /etc/modules
```

**Explication :**
- `echo "8021q"` = Écrit "8021q"
- `tee -a` = Ajoute (`-a`) au fichier
- `/etc/modules` = Fichier des modules à charger au boot

### Vérifier que le module est chargé

```bash
lsmod | grep 8021q
```

**Résultat attendu :**
```
8021q                  32768  0
garp                   16384  1 8021q
mrp                    20480  1 8021q
```

[OK] Si tu vois `8021q`, le module est chargé !

---

## [CONFIG] ÉTAPE 1 : CONFIGURATION DES INTERFACES VLAN

### [RECHERCHE] Trouver le nom de ton interface physique

```bash
ip a
```

**Résultat exemple :**
```
1: lo: <LOOPBACK,UP,LOWER_UP>
    inet 127.0.0.1/8 scope host lo

2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP>
    ^^^^^^
    TON INTERFACE PHYSIQUE
    inet 192.168.1.100/24 brd 192.168.1.255 scope global enp0s3
```

**Note le nom :** `enp0s3` (ou `eth0`, `ens33`, selon ta config)

[ATTENTION] **IMPORTANT :** Remplace `enp0s3` par TON nom d'interface dans TOUS les exemples suivants !

---

### [NOTE] Configuration avec Netplan

#### 1. Sauvegarde la configuration actuelle

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

**Pourquoi ?**
- Sécurité : Si tu fais une erreur, tu pourras restaurer
- `cp` = Copy (copier)

#### 2. Édite le fichier Netplan

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

[ATTENTION] **Remplace `01-netcfg.yaml` par le nom de TON fichier** (vérifie avec `ls /etc/netplan/`)

#### 3. Configuration complète (COPIE-COLLE CECI)

**[ATTENTION] ATTENTION CRITIQUE : L'INDENTATION EST VITALE !**
- Utilise **2 ESPACES** par niveau
- **JAMAIS de tabulation**
- Un espace de trop/moins = échec !

```yaml
network:
  version: 2
  renderer: networkd
  
  ethernets:
    # ──────────────────────────────────────────────────────────
    # INTERFACE PHYSIQUE PRINCIPALE
    # ──────────────────────────────────────────────────────────
    enp0s3:
      # [ATTENTION] CHANGE "enp0s3" par TON interface !
      
      # Pas d'IP sur l'interface physique (les VLANs auront leurs IPs)
      dhcp4: no
      dhcp6: no
      
      # IMPORTANT : Ne pas mettre d'adresse IP ici
      # Les IPs seront sur les sous-interfaces VLAN
  
  vlans:
    # ══════════════════════════════════════════════════════════
    # [BLEU] VLAN 10 - COMPTABILITÉ
    # ══════════════════════════════════════════════════════════
    enp0s3.10:
      # Explication du nom :
      # enp0s3 = Interface physique parente
      # .10 = VLAN ID 10
      # 
      # Linux créera automatiquement cette interface virtuelle
      
      # Interface parente (physique)
      id: 10
      link: enp0s3
      
      # Explication :
      # id: 10 = Numéro du VLAN (VLAN ID)
      # link: enp0s3 = Interface physique sur laquelle créer le VLAN
      
      # Configuration IP du VLAN 10
      addresses:
        - 192.168.10.1/24
      
      # Explication détaillée :
      # 192.168.10.1 = IP de la VM sur le VLAN 10
      #                Elle servira de passerelle pour ce VLAN
      # /24 = Masque de sous-réseau (255.255.255.0)
      #       Signifie : toutes les IPs de 192.168.10.1 à .254
      #       sont dans le même réseau
      
      # Pas de passerelle ni DNS sur cette interface
      # (La VM est elle-même la passerelle pour ce VLAN)
    
    # ══════════════════════════════════════════════════════════
    # [VERT] VLAN 20 - DIRECTION
    # ══════════════════════════════════════════════════════════
    enp0s3.20:
      id: 20
      link: enp0s3
      
      addresses:
        - 192.168.20.1/24
      
      # Explication :
      # Ce VLAN est complètement séparé du VLAN 10
      # Un appareil sur VLAN 10 (192.168.10.X) ne peut PAS
      # communiquer avec un appareil sur VLAN 20 (192.168.20.X)
      # sauf si on configure du routage (qu'on verra plus tard)
    
    # ══════════════════════════════════════════════════════════
    # [JAUNE] VLAN 30 - INVITÉS
    # ══════════════════════════════════════════════════════════
    enp0s3.30:
      id: 30
      link: enp0s3
      
      addresses:
        - 192.168.30.1/24
      
      # Explication :
      # VLAN dédié aux invités (WiFi public, visiteurs)
      # On limitera son accès aux autres VLANs via firewall
      # (configuré à l'étape suivante)
```

#### 4. Comprendre la structure YAML

**Visualisation de l'indentation :**

```yaml
network:                    <- Niveau 0 (0 espaces)
··version: 2                <- Niveau 1 (2 espaces)
··ethernets:                <- Niveau 1 (2 espaces)
····enp0s3:                 <- Niveau 2 (4 espaces)
······dhcp4: no             <- Niveau 3 (6 espaces)
··vlans:                    <- Niveau 1 (2 espaces)
····enp0s3.10:              <- Niveau 2 (4 espaces)
······id: 10                <- Niveau 3 (6 espaces)
······addresses:            <- Niveau 3 (6 espaces)
········- 192.168.10.1/24   <- Niveau 4 (8 espaces + tiret + espace)
```

**Règle absolue :**
- Chaque niveau = +2 espaces
- Les listes (`-`) = 1 espace après le tiret

#### 5. Sauvegarder le fichier

Dans `nano` :
1. **Sauvegarde** : `Ctrl + O` (lettre O)
2. **Confirme** : `Entrée`
3. **Quitte** : `Ctrl + X`

#### 6. Tester la syntaxe AVANT d'appliquer

```bash
sudo netplan try
```

**Explication :**
- `try` = Teste la configuration pendant 120 secondes
- Si tu ne confirmes pas, elle s'annule automatiquement
- Évite de te bloquer en cas d'erreur !

**Résultat attendu :**
```
Do you want to keep these settings?

Press ENTER before the timeout to accept the new configuration

Changes will revert in 120 seconds
```

**Appuie sur `Entrée`** pour confirmer que ça marche.

**En cas d'erreur :**
```
Error in network definition: invalid YAML syntax at line 15
```

Solutions :
1. Compte les espaces (doit être un multiple de 2)
2. Vérifie qu'il n'y a pas de tabulations
3. Vérifie que chaque liste commence par `- ` (tiret + espace)

#### 7. Appliquer définitivement

```bash
sudo netplan apply
```

[HOURGLASS_WITH_FLOWING_SAND] Attends 5 secondes...

---

### [OK] Vérifier que les VLANs sont créés

```bash
ip a
```

**Résultat attendu :**

```bash
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP>
    link/ether 08:00:27:3b:5c:a1 brd ff:ff:ff:ff:ff:ff
    # Pas d'IP ici [OK] (normal)

3: enp0s3.10@enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP>
    ^^^^^^^^^^
    INTERFACE VLAN 10 [OK]
    link/ether 08:00:27:3b:5c:a1 brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.1/24 brd 192.168.10.255 scope global enp0s3.10
         ^^^^^^^^^^^^^
         IP DU VLAN 10 [OK]

4: enp0s3.20@enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP>
    inet 192.168.20.1/24 brd 192.168.20.255 scope global enp0s3.20
         ^^^^^^^^^^^^^
         IP DU VLAN 20 [OK]

5: enp0s3.30@enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP>
    inet 192.168.30.1/24 brd 192.168.30.255 scope global enp0s3.30
         ^^^^^^^^^^^^^
         IP DU VLAN 30 [OK]
```

**Points à vérifier :**

[OK] Chaque VLAN apparaît comme `enp0s3.X@enp0s3`
[OK] Chaque VLAN a une IP dans son réseau (192.168.10.1, 192.168.20.1, 192.168.30.1)
[OK] Le statut est `UP` (actif)

---

### [TEST] Tester la connectivité des VLANs

```bash
# Ping vers le VLAN 10
ping -c 4 192.168.10.1

# Ping vers le VLAN 20
ping -c 4 192.168.20.1

# Ping vers le VLAN 30
ping -c 4 192.168.30.1
```

**Résultat attendu :**
```
PING 192.168.10.1 (192.168.10.1) 56(84) bytes of data.
64 bytes from 192.168.10.1: icmp_seq=1 ttl=64 time=0.035 ms
64 bytes from 192.168.10.1: icmp_seq=2 ttl=64 time=0.045 ms
64 bytes from 192.168.10.1: icmp_seq=3 ttl=64 time=0.038 ms
64 bytes from 192.168.10.1: icmp_seq=4 ttl=64 time=0.042 ms

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

[BRAVO] **Si les 3 pings fonctionnent, tes VLANs sont correctement configurés !**

---

## [PACKAGE] ÉTAPE 2 : ACTIVER LE ROUTAGE IP (FORWARDING)

### [REFLEXION] Pourquoi activer le routage ?

**Par défaut, Linux ne transmet PAS les paquets entre ses interfaces.**

```
Sans routage :
VLAN 10 <--> VM <-[X]-> VLAN 20
           ^
      Bloque les paquets

Avec routage :
VLAN 10 <--> VM <-[OK]-> VLAN 20
           ^
      Transmet les paquets
```

**On veut que la VM agisse comme un routeur :**
- Transmet les paquets entre VLANs (si autorisé par le firewall)
- Permet aux VLANs d'accéder à Internet via la Box

---

### [CONFIG] Activer le forwarding temporairement

```bash
sudo sysctl -w net.ipv4.ip_forward=1
```

**Explication :**
- `sysctl` = Configure les paramètres du kernel Linux
- `-w` = Write (écrire/modifier)
- `net.ipv4.ip_forward=1` = Active le forwarding IPv4
  - `1` = Activé
  - `0` = Désactivé

**Résultat :**
```
net.ipv4.ip_forward = 1
```

[OK] C'est activé... mais temporaire ! (sera désactivé au redémarrage)

---

### [CONFIG] Activer le forwarding DÉFINITIVEMENT

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

**Trouve cette ligne :**
```bash
#net.ipv4.ip_forward=1
^
Commentée (désactivée)
```

**Supprime le `#` pour obtenir :**
```bash
net.ipv4.ip_forward=1
```

**Sauvegarde :** `Ctrl + O` -> `Entrée` -> `Ctrl + X`

---

### [OK] Appliquer les changements

```bash
sudo sysctl -p
```

**Explication :**
- `-p` = Relit `/etc/sysctl.conf` et applique les paramètres

**Résultat attendu :**
```
net.ipv4.ip_forward = 1
```

---

### [TEST] Vérifier que le forwarding est actif

```bash
cat /proc/sys/net/ipv4/ip_forward
```

**Résultat attendu :**
```
1
```

[OK] Si tu vois `1`, le forwarding est activé !
[X] Si tu vois `0`, retourne en arrière et vérifie.

---

## [PACKAGE] ÉTAPE 3 : CONFIGURER DNSMASQ POUR PLUSIEURS VLANs

### [REFLEXION] Pourquoi reconfigurer DNSmasq ?

On va créer **un serveur DHCP par VLAN** :
- VLAN 10 -> distribue des IPs 192.168.10.X
- VLAN 20 -> distribue des IPs 192.168.20.X
- VLAN 30 -> distribue des IPs 192.168.30.X

---

### [NOTE] Configuration DNSmasq multi-VLAN

#### 1. Sauvegarde l'ancienne config

```bash
sudo cp /etc/dnsmasq.conf /etc/dnsmasq.conf.backup-vlan
```

#### 2. Édite la configuration

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

#### 3. Configuration complète (COPIE-COLLE)

```bash
# ═══════════════════════════════════════════════════════════════
# CONFIGURATION DNSMASQ - MULTI-VLAN
# ═══════════════════════════════════════════════════════════════
# Créé le : 2024-12-06
# Pour : Projet VLAN 802.1Q sur VirtualBox
# ═══════════════════════════════════════════════════════════════

# ────────────────────────────────────────────────────────────────
# 1. INTERFACES RÉSEAU
# ────────────────────────────────────────────────────────────────

# Écoute sur les 3 interfaces VLAN
interface=enp0s3.10
interface=enp0s3.20
interface=enp0s3.30

# [ATTENTION] CHANGE "enp0s3" par TON interface physique !

# Explication :
# On dit à DNSmasq d'écouter sur les 3 VLANs
# Il répondra aux requêtes DHCP sur chacun

# Ne répond QUE sur ces interfaces (sécurité)
bind-interfaces

# Explication :
# Sans cette option, DNSmasq écouterait partout
# bind-interfaces = "attache-toi UNIQUEMENT à ces interfaces"

# ────────────────────────────────────────────────────────────────
# 2. CONFIGURATION DHCP - VLAN 10 (COMPTABILITÉ)
# ────────────────────────────────────────────────────────────────

# Plage DHCP pour VLAN 10
dhcp-range=set:vlan10,192.168.10.50,192.168.10.150,255.255.255.0,24h

# Décortiquons cette ligne :
#
# dhcp-range = Définit une plage d'IPs à distribuer
#
# set:vlan10 = Crée un "tag" nommé "vlan10"
#              On pourra référencer ce tag plus tard
#              pour appliquer des options spécifiques
#
# 192.168.10.50 = Première IP disponible
# 192.168.10.150 = Dernière IP disponible
#                  -> 101 IPs disponibles
#
# 255.255.255.0 = Masque de sous-réseau (/24)
#
# 24h = Durée de location (bail)
#       Après 24h, l'appareil doit renouveler

# Options DHCP spécifiques au VLAN 10

# Option 3 : Passerelle (Gateway)
dhcp-option=tag:vlan10,option:router,192.168.10.1

# Explication :
# tag:vlan10 = Applique cette option UNIQUEMENT au VLAN 10
# option:router = Passerelle par défaut
# 192.168.10.1 = IP de la VM sur le VLAN 10
#
# Les appareils du VLAN 10 utiliseront 192.168.10.1
# comme porte de sortie vers Internet

# Option 6 : Serveurs DNS
dhcp-option=tag:vlan10,option:dns-server,192.168.10.1

# Explication :
# Les appareils du VLAN 10 utiliseront la VM (192.168.10.1)
# comme serveur DNS
# La VM fera "DNS forwarding" vers 8.8.8.8 (Google DNS)

# ────────────────────────────────────────────────────────────────
# 3. CONFIGURATION DHCP - VLAN 20 (DIRECTION)
# ────────────────────────────────────────────────────────────────

# Plage DHCP pour VLAN 20
dhcp-range=set:vlan20,192.168.20.50,192.168.20.150,255.255.255.0,24h

# Options DHCP spécifiques au VLAN 20
dhcp-option=tag:vlan20,option:router,192.168.20.1
dhcp-option=tag:vlan20,option:dns-server,192.168.20.1

# Explication :
# Configuration identique au VLAN 10, mais avec les IPs du VLAN 20
# Les appareils de ce VLAN sont complètement isolés du VLAN 10

# ────────────────────────────────────────────────────────────────
#4. CONFIGURATION DHCP - VLAN 30 (INVITÉS)
# ────────────────────────────────────────────────────────────────

# Plage DHCP pour VLAN 30
dhcp-range=set:vlan30,192.168.30.50,192.168.30.150,255.255.255.0,12h

# Explication :
# Durée de bail réduite (12h au lieu de 24h)
# Les invités se connectent généralement pour moins longtemps

# Options DHCP spécifiques au VLAN 30
dhcp-option=tag:vlan30,option:router,192.168.30.1
dhcp-option=tag:vlan30,option:dns-server,192.168.30.1

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

# Exemple : Réserver une IP pour un serveur comptable
# dhcp-host=aa:bb:cc:dd:ee:ff,192.168.10.100,serveur-compta,set:vlan10,infinite

# Explication :
# aa:bb:cc:dd:ee:ff = Adresse MAC de l'appareil
# 192.168.10.100 = IP fixe à attribuer
# serveur-compta = Nom d'hôte
# set:vlan10 = Applique le tag VLAN 10 (et ses options)
# infinite = Réservation permanente

# Pour trouver l'adresse MAC d'un appareil :
# Windows : ipconfig /all -> "Adresse physique"
# Mac : ifconfig -> "ether"
# Linux : ip link show

# Exemple : Réserver une IP pour un PC de direction
# dhcp-host=11:22:33:44:55:66,192.168.20.100,pc-directeur,set:vlan20,infinite

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

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

# Explication :
# DNSmasq transférera les requêtes DNS à Google DNS
# 
# Alternatives :
# Cloudflare : 1.1.1.1 et 1.0.0.1
# Quad9 : 9.9.9.9 et 149.112.112.112

# Taille du cache DNS
cache-size=1000

# Explication :
# DNSmasq garde 1000 réponses DNS en mémoire
# Les requêtes répétées sont instantanées (depuis le cache)

# ────────────────────────────────────────────────────────────────
# 7. CONFIGURATION DES DOMAINES LOCAUX
# ────────────────────────────────────────────────────────────────

# Domaines par VLAN
domain=compta.local,192.168.10.0/24
domain=direction.local,192.168.20.0/24
domain=invites.local,192.168.30.0/24

# Explication :
# Les appareils du VLAN 10 auront le suffixe ".compta.local"
# Les appareils du VLAN 20 auront le suffixe ".direction.local"
# Les appareils du VLAN 30 auront le suffixe ".invites.local"
#
# Exemple :
# Un PC nommé "pc-marie" sur VLAN 10 -> "pc-marie.compta.local"

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

# Explication :
# Permet de taper juste "pc-marie" au lieu de "pc-marie.compta.local"
# DNSmasq ajoutera automatiquement le domaine

# ────────────────────────────────────────────────────────────────
# 8. CONFIGURATION DES LOGS
# ────────────────────────────────────────────────────────────────

# Active les logs DHCP
log-dhcp

# Active les logs DNS
log-queries

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

# Explication :
# Tous les événements DHCP et DNS seront enregistrés
# Pour voir les logs en temps réel :
# sudo tail -f /var/log/dnsmasq.log

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

#### 4. Sauvegarder

`Ctrl + O` -> `Entrée` -> `Ctrl + X`

---

### [OK] Vérifier la syntaxe

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

**Résultat attendu :**
```
dnsmasq: syntax check OK.
```

---

### [SYNC] Redémarrer DNSmasq

```bash
sudo systemctl restart dnsmasq
```

### [OK] Vérifier le statut

```bash
sudo systemctl status dnsmasq
```

**Résultat attendu :**

```bash
[BLACK_CIRCLE] dnsmasq.service - dnsmasq - A lightweight DHCP and caching DNS server
   Active: active (running) since Fri 2024-12-06 12:00:00 UTC; 5s ago
   
dnsmasq-dhcp[2345]: DHCP, IP range 192.168.10.50 -- 192.168.10.150, lease time 24h
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                     VLAN 10 actif ! [OK]
                     
dnsmasq-dhcp[2345]: DHCP, IP range 192.168.20.50 -- 192.168.20.150, lease time 24h
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                     VLAN 20 actif ! [OK]
                     
dnsmasq-dhcp[2345]: DHCP, IP range 192.168.30.50 -- 192.168.30.150, lease time 12h
                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                     VLAN 30 actif ! [OK]
```

[BRAVO] **Si tu vois les 3 plages DHCP, c'est parfait !**

---

## [HOT] ÉTAPE 4 : CONFIGURER LE FIREWALL (IPTABLES)

### [REFLEXION] Pourquoi un firewall ?

**Par défaut, avec le routage activé, TOUS les VLANs peuvent communiquer entre eux.**

On veut :
- [OK] VLAN 10 et 20 peuvent accéder à Internet
- [OK] VLAN 30 peut SEULEMENT accéder à Internet (pas aux autres VLANs)
- [OK] VLAN 10 et 20 ne peuvent PAS se parler (isolation)

---

### [SECURITE] Règles de sécurité à implémenter

```
[BLEU] VLAN 10 (Comptabilité)
├─ [OK] Accès Internet
├─ [X] Pas d'accès VLAN 20
└─ [X] Pas d'accès VLAN 30

[VERT] VLAN 20 (Direction)
├─ [OK] Accès Internet
├─ [X] Pas d'accès VLAN 10
└─ [X] Pas d'accès VLAN 30

[JAUNE] VLAN 30 (Invités)
├─ [OK] Accès Internet UNIQUEMENT
├─ [X] Pas d'accès VLAN 10
└─ [X] Pas d'accès VLAN 20
```

---

### [NOTE] Script de configuration du firewall

#### 1. Crée le script

```bash
sudo nano /etc/firewall-vlan.sh
```

#### 2. Copie-colle cette configuration

```bash
#!/bin/bash
# ═══════════════════════════════════════════════════════════════
# SCRIPT DE CONFIGURATION FIREWALL POUR VLANS
# ═══════════════════════════════════════════════════════════════
# Créé le : 2024-12-06
# Usage : sudo bash /etc/firewall-vlan.sh
# ═══════════════════════════════════════════════════════════════

echo "[HOT] Configuration du firewall multi-VLAN..."

# ────────────────────────────────────────────────────────────────
# 1. RÉINITIALISATION (NETTOYAGE)
# ────────────────────────────────────────────────────────────────

echo "[NETTOYAGE] Nettoyage des règles existantes..."

# Supprime toutes les règles existantes
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X

# Explication :
# -F = Flush (supprime toutes les règles)
# -X = Supprime les chaînes personnalisées
# -t nat = Dans la table NAT (Network Address Translation)

# Politique par défaut : TOUT BLOQUER
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# Explication :
# -P = Policy (politique par défaut)
# INPUT DROP = Bloque tout le trafic ENTRANT par défaut
# FORWARD DROP = Bloque tout le trafic TRANSITE par défaut
# OUTPUT ACCEPT = Autorise tout le trafic SORTANT par défaut
#
# Approche "whitelist" : On bloque tout, puis on autorise 
# uniquement ce dont on a besoin (plus sécurisé)

# ────────────────────────────────────────────────────────────────
# 2. RÈGLES DE BASE (SÉCURITÉ)
# ────────────────────────────────────────────────────────────────

echo "[OK] Autorisation du trafic loopback..."

# Autoriser le trafic sur l'interface loopback (lo)
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Explication :
# -A = Append (ajoute une règle)
# -i lo = Interface d'entrée "loopback" (127.0.0.1)
# -o lo = Interface de sortie "loopback"
# -j ACCEPT = Action : ACCEPTER
#
# Le loopback permet à la VM de communiquer avec elle-même
# Exemple : localhost, 127.0.0.1
# ESSENTIEL pour le bon fonctionnement de nombreux services

echo "[OK] Autorisation des connexions établies..."

# Autoriser les connexions déjà établies et connexes
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

# Explication DÉTAILLÉE :
# -m state = Module "state" (suivi de connexion)
# --state ESTABLISHED = Connexion déjà établie
# --state RELATED = Connexion liée à une connexion établie
#
# Exemple concret :
# 1. Ton PC (VLAN 10) demande une page web à Google
#    -> Nouvelle connexion (NEW)
# 2. Google répond à ton PC
#    -> Connexion établie (ESTABLISHED) [OK] Autorisée par cette règle
#
# Sans cette règle, les réponses aux requêtes seraient bloquées !
# Le web ne fonctionnerait pas.

# ────────────────────────────────────────────────────────────────
# 3. AUTORISER LES SERVICES ESSENTIELS
# ────────────────────────────────────────────────────────────────

echo "[OK] Autorisation DHCP et DNS..."

# Autoriser DHCP (ports 67 et 68)
iptables -A INPUT -p udp --dport 67:68 -j ACCEPT
iptables -A INPUT -p udp --sport 67:68 -j ACCEPT

# Explication :
# -p udp = Protocole UDP
# --dport 67:68 = Port de destination 67 à 68
# --sport 67:68 = Port source 67 à 68
#
# Port 67 = DHCP server
# Port 68 = DHCP client
#
# Permet aux appareils de demander des IPs au serveur DHCP

# Autoriser DNS (port 53)
iptables -A INPUT -p udp --dport 53 -j ACCEPT
iptables -A INPUT -p tcp --dport 53 -j ACCEPT

# Explication :
# Port 53 = DNS (Domain Name System)
# UDP et TCP car DNS utilise les deux :
# - UDP pour les requêtes normales (rapide)
# - TCP pour les grosses réponses ou les transferts de zone

# Autoriser SSH (port 22) pour l'administration
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# Explication :
# Port 22 = SSH (Secure Shell)
# Permet de se connecter à distance à la VM
# IMPORTANT pour l'administration !
#
# [ATTENTION] SÉCURITÉ : En production, il est recommandé de :
# - Changer le port par défaut (ex: 2222)
# - Utiliser des clés SSH au lieu de mots de passe
# - Restreindre l'accès à certaines IPs seulement

# Autoriser ICMP (ping)
iptables -A INPUT -p icmp -j ACCEPT
iptables -A FORWARD -p icmp -j ACCEPT

# Explication :
# -p icmp = Protocole ICMP (Internet Control Message Protocol)
# Utilisé par la commande "ping" pour tester la connectivité
#
# Très utile pour le dépannage !
# Exemple : ping 192.168.10.1 pour vérifier que la VM répond

# ────────────────────────────────────────────────────────────────
# 4. RÈGLES INTER-VLAN (ISOLATION)
# ────────────────────────────────────────────────────────────────

echo "[INTERDIT] Blocage de la communication inter-VLAN..."

# Bloquer VLAN 10 -> VLAN 20
iptables -A FORWARD -s 192.168.10.0/24 -d 192.168.20.0/24 -j DROP
iptables -A FORWARD -s 192.168.20.0/24 -d 192.168.10.0/24 -j DROP

# Explication :
# -s = Source (IP source)
# -d = Destination (IP destination)
# -j DROP = Action : REJETER silencieusement (pas de réponse)
#
# 192.168.10.0/24 = Tout le réseau VLAN 10 (de .1 à .254)
# 192.168.20.0/24 = Tout le réseau VLAN 20 (de .1 à .254)
#
# Un PC sur VLAN 10 ne peut PAS communiquer avec VLAN 20
# et vice-versa

# Bloquer VLAN 10 -> VLAN 30
iptables -A FORWARD -s 192.168.10.0/24 -d 192.168.30.0/24 -j DROP
iptables -A FORWARD -s 192.168.30.0/24 -d 192.168.10.0/24 -j DROP

# Bloquer VLAN 20 -> VLAN 30
iptables -A FORWARD -s 192.168.20.0/24 -d 192.168.30.0/24 -j DROP
iptables -A FORWARD -s 192.168.30.0/24 -d 192.168.20.0/24 -j DROP

# ────────────────────────────────────────────────────────────────
# 5. NAT (MASQUERADING) POUR L'ACCÈS INTERNET
# ────────────────────────────────────────────────────────────────

echo "[WEB] Configuration du NAT pour l'accès Internet..."

# Trouve l'interface vers Internet (celle qui a une route par défaut)
WAN_INTERFACE=$(ip route | grep default | awk '{print $5}')

# Explication :
# ip route = Affiche les routes réseau
# grep default = Filtre la route par défaut (vers Internet)
# awk '{print $5}' = Extrait le nom de l'interface (colonne 5)
#
# Exemple de résultat : enp0s3 (l'interface physique)

echo "   Interface WAN détectée : $WAN_INTERFACE"

# Active le NAT (masquerading) pour tous les VLANs
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o $WAN_INTERFACE -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.20.0/24 -o $WAN_INTERFACE -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.30.0/24 -o $WAN_INTERFACE -j MASQUERADE

# Explication DÉTAILLÉE du NAT :
#
# NAT = Network Address Translation
# Masquerading = Une forme de NAT où la VM "cache" les IPs privées
#
# Sans NAT :
# ┌─────────────────────────────────────────────────┐
# │ PC VLAN 10 (192.168.10.51)                     │
# │ │                                                │
# │ └─ Demande : "Je veux aller sur google.com"    │
# │                                                  │
# │ Internet reçoit la demande avec IP source :    │
# │ 192.168.10.51 [X]                                │
# │ │                                                │
# │ └─ Problème : 192.168.10.51 est une IP PRIVÉE  │
# │    Internet ne sait pas où renvoyer la réponse │
# └─────────────────────────────────────────────────┘
#
# Avec NAT (MASQUERADE) :
# ┌─────────────────────────────────────────────────┐
# │ PC VLAN 10 (192.168.10.51)                     │
# │ │                                                │
# │ └─ Demande : "Je veux aller sur google.com"    │
# │    v                                             │
# │ VM remplace l'IP source :                       │
# │ 192.168.10.51 -> 192.168.1.100 [OK]               │
# │ │                                                │
# │ Internet reçoit la demande avec IP source :    │
# │ 192.168.1.100 (IP publique/routable)           │
# │ │                                                │
# │ └─ Internet renvoie la réponse à 192.168.1.100 │
# │    v                                             │
# │ VM retransmet au vrai destinataire :           │
# │ 192.168.1.100 -> 192.168.10.51 [OK]               │
# └─────────────────────────────────────────────────┘
#
# Analogie :
# C'est comme un service de réexpédition de courrier.
# Tout le courrier sort avec l'adresse de la VM, puis
# la VM distribue les réponses aux bons appartements (VLANs).

# Autoriser le forwarding vers Internet pour tous les VLANs
iptables -A FORWARD -s 192.168.10.0/24 -o $WAN_INTERFACE -j ACCEPT
iptables -A FORWARD -s 192.168.20.0/24 -o $WAN_INTERFACE -j ACCEPT
iptables -A FORWARD -s 192.168.30.0/24 -o $WAN_INTERFACE -j ACCEPT

# Explication :
# -o $WAN_INTERFACE = Interface de sortie (vers Internet)
# -j ACCEPT = Autoriser
#
# Permet aux 3 VLANs d'envoyer des paquets vers Internet

# ────────────────────────────────────────────────────────────────
# 6. RÈGLES SPÉCIFIQUES AU VLAN 30 (INVITÉS)
# ────────────────────────────────────────────────────────────────

echo "[VERROUILLE] Restrictions supplémentaires pour VLAN 30 (Invités)..."

# Bloquer l'accès à l'interface d'administration de la VM
iptables -A FORWARD -s 192.168.30.0/24 -d 192.168.10.1 -j DROP
iptables -A FORWARD -s 192.168.30.0/24 -d 192.168.20.1 -j DROP
iptables -A FORWARD -s 192.168.30.0/24 -d 192.168.30.1 -j DROP

# Explication :
# Les invités (VLAN 30) ne peuvent PAS accéder aux IPs des
# passerelles des autres VLANs, ni à la leur
#
# Empêche :
# - L'accès SSH à la VM
# - L'accès à l'interface web d'administration (si présente)
# - Les tentatives de scan réseau

# Bloquer les ports administratifs courants depuis VLAN 30
iptables -A FORWARD -s 192.168.30.0/24 -p tcp --dport 22 -j DROP    # SSH
iptables -A FORWARD -s 192.168.30.0/24 -p tcp --dport 23 -j DROP    # Telnet
iptables -A FORWARD -s 192.168.30.0/24 -p tcp --dport 3389 -j DROP  # RDP
iptables -A FORWARD -s 192.168.30.0/24 -p tcp --dport 5900 -j DROP  # VNC

# Explication :
# Empêche les invités de tenter de se connecter à distance
# aux machines des autres VLANs via :
# - SSH (port 22) : Terminal Linux/Mac
# - Telnet (port 23) : Terminal ancien (non sécurisé)
# - RDP (port 3389) : Bureau à distance Windows
# - VNC (port 5900) : Bureau à distance multi-plateforme

# ────────────────────────────────────────────────────────────────
# 7. JOURNALISATION (LOGS) DES PAQUETS BLOQUÉS
# ────────────────────────────────────────────────────────────────

echo "[NOTE] Activation de la journalisation..."

# Log des paquets bloqués en INPUT
iptables -A INPUT -j LOG --log-prefix "FIREWALL-INPUT-DROP: " --log-level 4

# Log des paquets bloqués en FORWARD
iptables -A FORWARD -j LOG --log-prefix "FIREWALL-FORWARD-DROP: " --log-level 4

# Explication :
# -j LOG = Journalise (log) le paquet
# --log-prefix = Préfixe pour identifier facilement dans les logs
# --log-level 4 = Niveau de log (4 = Warning)
#
# Les logs apparaîtront dans /var/log/kern.log ou /var/log/syslog
#
# Exemple de log :
# FIREWALL-FORWARD-DROP: IN=enp0s3.30 OUT=enp0s3.10 SRC=192.168.30.55 DST=192.168.10.10
#
# Très utile pour :
# - Déboguer les problèmes de connectivité
# - Détecter les tentatives d'intrusion
# - Analyser le trafic réseau bloqué

# ────────────────────────────────────────────────────────────────
# 8. SAUVEGARDE DES RÈGLES
# ────────────────────────────────────────────────────────────────

echo "[SAUVEGARDE] Sauvegarde des règles..."

# Crée le répertoire si inexistant
mkdir -p /etc/iptables

# Sauvegarde les règles dans un fichier
iptables-save > /etc/iptables/rules.v4

# Explication :
# iptables-save = Exporte toutes les règles actives
# > /etc/iptables/rules.v4 = Redirige vers un fichier
#
# Ce fichier permettra de restaurer les règles après un redémarrage

# ────────────────────────────────────────────────────────────────
# 9. AFFICHAGE DES RÈGLES
# ────────────────────────────────────────────────────────────────

echo ""
echo "[OK] Configuration du firewall terminée !"
echo ""
echo "[LISTE] Résumé des règles :"
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
iptables -L -v -n --line-numbers

# Explication :
# -L = List (affiche les règles)
# -v = Verbose (détaillé, avec compteurs de paquets)
# -n = Numérique (affiche les IPs, pas les noms d'hôtes)
# --line-numbers = Affiche les numéros de ligne

echo ""
echo "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"
echo ""
echo "Pour voir les logs du firewall en temps réel :"
echo "sudo tail -f /var/log/kern.log | grep FIREWALL"
echo ""

# ═══════════════════════════════════════════════════════════════
# FIN DU SCRIPT
# ═══════════════════════════════════════════════════════════════
```

#### 3. Sauvegarder

`Ctrl + O` -> `Entrée` -> `Ctrl + X`

---

### [RAPIDE] Rendre le script exécutable

```bash
sudo chmod +x /etc/firewall-vlan.sh
```

**Explication :**
- `chmod` = Change les permissions
- `+x` = Ajoute le droit d'exécution (executable)

---

### [BLACK_RIGHT-POINTING_TRIANGLE] Exécuter le script

```bash
sudo bash /etc/firewall-vlan.sh
```

**Résultat attendu :**

```bash
[HOT] Configuration du firewall multi-VLAN...
[NETTOYAGE] Nettoyage des règles existantes...
[OK] Autorisation du trafic loopback...
[OK] Autorisation des connexions établies...
[OK] Autorisation DHCP et DNS...
[INTERDIT] Blocage de la communication inter-VLAN...
[WEB] Configuration du NAT pour l'accès Internet...
   Interface WAN détectée : enp0s3
[VERROUILLE] Restrictions supplémentaires pour VLAN 30 (Invités)...
[NOTE] Activation de la journalisation...
[SAUVEGARDE] Sauvegarde des règles...

[OK] Configuration du firewall terminée !

[LISTE] Résumé des règles :
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
[Table des règles affichée...]
```

---

### [SYNC] Rendre le firewall permanent (au démarrage)

#### Méthode 1 : Avec iptables-persistent (Recommandée)

```bash
# Installe iptables-persistent
sudo apt install iptables-persistent -y
```

Pendant l'installation, il te demandera :
```
Save current IPv4 rules? [yes/no]
```
**Réponds : `yes`**

```
Save current IPv6 rules? [yes/no]
```
**Réponds : `yes`** (même si on n'utilise pas IPv6)

**Les règles seront automatiquement restaurées à chaque démarrage !**

---

#### Méthode 2 : Script au démarrage (Alternative)

```bash
sudo nano /etc/rc.local
```

**Ajoute cette ligne AVANT `exit 0` :**
```bash
# Charge les règles du firewall
bash /etc/firewall-vlan.sh
```

**Rends le fichier exécutable :**
```bash
sudo chmod +x /etc/rc.local
```

---

### [OK] Vérifier les règles actives

```bash
sudo iptables -L -v -n
```

**Tu devrais voir :**
- Chaîne INPUT (trafic entrant)
- Chaîne FORWARD (trafic transitant)
- Chaîne OUTPUT (trafic sortant)
- Règles de blocage inter-VLAN
- Règles NAT

---

## [TEST] ÉTAPE 5 : TESTER LA CONFIGURATION

### Configuration d'un switch managé (optionnel mais recommandé)

**[ATTENTION] NOTE IMPORTANTE :**
Pour tester complètement les VLANs, tu as besoin :
- **Soit** d'un switch managé qui supporte les VLANs 802.1Q
- **Soit** de créer plusieurs VMs (une par VLAN)

---

### [ECRAN] Méthode 1 : Tester avec des VMs supplémentaires

#### Créer 3 VMs de test

**VM Test 1 - VLAN 10 :**
1. Crée une nouvelle VM dans VirtualBox
2. Configure le réseau en "Accès par pont"
3. Dans la VM, configure une interface VLAN 10

**Dans la VM Test 1 :**
```bash
# Charge le module VLAN
sudo modprobe 8021q

# Crée l'interface VLAN 10
sudo ip link add link eth0 name eth0.10 type vlanid 10

# Active l'interface
sudo ip link set eth0.10 up

# Demande une IP au DHCP
sudo dhclient eth0.10

# Vérifie l'IP reçue
ip a show eth0.10
```

**Résultat attendu :**
```bash
eth0.10@eth0: <BROADCAST,MULTICAST,UP,LOWER_UP>
    inet 192.168.10.51/24 brd 192.168.10.255 scope global dynamic eth0.10
         ^^^^^^^^^^^^^
         IP du VLAN 10 ! [OK]
```

**Répète pour VLAN 20 et 30** avec les ID correspondants.

---

### [TEST] Tests de connectivité

#### Test 1 : Chaque VLAN peut accéder à Internet

**Dans VM Test 1 (VLAN 10) :**
```bash
ping -c 4 google.com
```

**Résultat attendu :** [OK] Ça marche !

**Dans VM Test 2 (VLAN 20) :**
```bash
ping -c 4 google.com
```

**Résultat attendu :** [OK] Ça marche !

**Dans VM Test 3 (VLAN 30) :**
```bash
ping -c 4 google.com
```

**Résultat attendu :** [OK] Ça marche !

---

#### Test 2 : Les VLANs sont isolés

**Depuis VM Test 1 (VLAN 10), essaye de ping VLAN 20 :**
```bash
ping -c 4 192.168.20.1
```

**Résultat attendu :**
```
PING 192.168.20.1 (192.168.20.1) 56(84) bytes of data.

--- 192.168.20.1 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3070ms
^^^^^^^^^^^^^^
BLOQUÉ ! [OK] (c'est voulu !)
```

---

#### Test 3 : Les invités (VLAN 30) ne peuvent pas accéder aux autres VLANs

**Depuis VM Test 3 (VLAN 30) :**
```bash
# Essaye VLAN 10
ping -c 4 192.168.10.1
# Bloqué [OK]

# Essaye VLAN 20
ping -c 4 192.168.20.1
# Bloqué [OK]

# Essaye SSH vers VLAN 10
ssh user@192.168.10.51
# Bloqué [OK]

# Mais Internet fonctionne
ping -c 4 google.com
# Fonctionne [OK]
```

---

### [GRAPHIQUE] Surveiller l'activité DHCP par VLAN

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

**Tu verras :**
```
dnsmasq-dhcp[2345]: DHCPDISCOVER(enp0s3.10) aa:bb:cc:dd:ee:ff
dnsmasq-dhcp[2345]: DHCPOFFER(enp0s3.10) 192.168.10.51 aa:bb:cc:dd:ee:ff
                                 ^^^^^^^^^
                                 VLAN 10 ! [OK]

dnsmasq-dhcp[2345]: DHCPDISCOVER(enp0s3.20) 11:22:33:44:55:66
dnsmasq-dhcp[2345]: DHCPOFFER(enp0s3.20) 192.168.20.51 11:22:33:44:55:66
                                 ^^^^^^^^^
                                 VLAN 20 ! [OK]

dnsmasq-dhcp[2345]: DHCPDISCOVER(enp0s3.30) 22:33:44:55:66:77
dnsmasq-dhcp[2345]: DHCPOFFER(enp0s3.30) 192.168.30.51 22:33:44:55:66:77
                                 ^^^^^^^^^
                                 VLAN 30 ! [OK]
```

---

### [LISTE] Voir les baux DHCP actifs par VLAN

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

**Résultat :**
```
1733520000 aa:bb:cc:dd:ee:ff 192.168.10.51 pc-compta *
1733520120 11:22:33:44:55:66 192.168.20.51 pc-direction *
1733520240 22:33:44:55:66:77 192.168.30.51 smartphone-invite *
```

---

### [RECHERCHE] Voir les logs du firewall

```bash
sudo tail -f /var/log/kern.log | grep FIREWALL
```

**Tu verras les paquets bloqués :**
```
FIREWALL-FORWARD-DROP: IN=enp0s3.30 OUT=enp0s3.10 SRC=192.168.30.55 DST=192.168.10.10
                            ^^^^^^^^        ^^^^^^^^
                            VLAN 30 tente   d'accéder au VLAN 10
                            -> BLOQUÉ [OK]
```

---

## [COURS] ÉTAPE 6 : SCÉNARIOS D'UTILISATION AVANCÉS

### [RESEAU] Cas 1 : Autoriser un serveur du VLAN 10 accessible depuis VLAN 20

**Scénario :** Tu veux qu'un serveur de fichiers (192.168.10.100) soit accessible depuis le VLAN 20.

```bash
# Édite le script firewall
sudo nano /etc/firewall-vlan.sh
```

**Ajoute AVANT les règles de blocage inter-VLAN :**

```bash
# Autoriser VLAN 20 à accéder au serveur de fichiers (VLAN 10)
iptables -A FORWARD -s 192.168.20.0/24 -d 192.168.10.100 -p tcp --dport 445 -j ACCEPT
iptables -A FORWARD -s 192.168.20.0/24 -d 192.168.10.100 -p tcp --dport 139 -j ACCEPT

# Explication :
# --dport 445 = Port SMB (partage de fichiers Windows)
# --dport 139 = Port NetBIOS
# Seul le serveur 192.168.10.100 est accessible, pas tout le VLAN 10
```

**Réapplique :**
```bash
sudo bash /etc/firewall-vlan.sh
```

---

### [RESEAU] Cas 2 : Limiter la bande passante pour le VLAN Invités

**Installer tc (traffic control) :**
```bash
sudo apt install iproute2 -y
```

**Limiter à 10 Mbps pour le VLAN 30 :**
```bash
# Limite la bande passante sortante
sudo tc qdisc add dev enp0s3.30 root tbf rate 10mbit burst 32kbit latency 400ms
```

**Explication :**
- `tc` = Traffic Control (contrôle du trafic)
- `qdisc` = Queue discipline (discipline de file d'attente)
- `tbf` = Token Bucket Filter (algorithme de limitation)
- `rate 10mbit` = Vitesse maximale : 10 Mbps
- `burst` = Rafale autorisée
- `latency` = Latence maximale

---

### [RESEAU] Cas 3 : Créer un VLAN pour caméras IP (sans accès Internet)

**Ajoute dans Netplan :**
```yaml
vlans:
  enp0s3.40:
    id: 40
    link: enp0s3
    addresses:
      - 192.168.40.1/24
```

**Applique :**
```bash
sudo netplan apply
```

**Configure DNSmasq :**
```bash
sudo nano /etc/dnsmasq.conf
```

**Ajoute :**
```bash
interface=enp0s3.40
dhcp-range=set:vlan40,192.168.40.50,192.168.40.150,255.255.255.0,24h
dhcp-option=tag:vlan40,option:router,192.168.40.1
dhcp-option=tag:vlan40,option:dns-server,192.168.40.1
```

**Dans le firewall, BLOQUE l'accès Internet pour VLAN 40 :**
```bash
# Bloque tout forwarding depuis VLAN 40
iptables -A FORWARD -s 192.168.40.0/24 -j DROP
```

**Résultat :** Les caméras peuvent communiquer entre elles et avec le serveur NVR, mais n'ont PAS d'accès Internet (sécurité !).

---

## [GRAPHIQUE] ÉTAPE 7 : COMMANDES UTILES POUR L'ADMINISTRATION

### [RECHERCHE] Diagnostics réseau

```bash
# Voir toutes les interfaces et leurs IPs
ip a

# Voir les routes
ip route

# Voir les connexions actives
ss -tuln

# Voir les statistiques réseau par interface
ip -s link

# Tester la connectivité VLAN par VLAN
ping -I enp0s3.10 8.8.8.8    # Depuis VLAN 10
ping -I enp0s3.20 8.8.8.8    # Depuis VLAN 20
ping -I enp0s3.30 8.8.8.8    # Depuis VLAN 30
```

---

### [HOT] Gestion du firewall

```bash
# Afficher toutes les règles
sudo iptables -L -v -n --line-numbers

# Afficher les règles NAT
sudo iptables -t nat -L -v -n

# Supprimer une règle spécifique (par numéro de ligne)
sudo iptables -D FORWARD 5    # Supprime la ligne 5 de FORWARD

# Réinitialiser TOUTES les règles (DANGER !)
sudo iptables -F
sudo iptables -X
sudo iptables -t nat -F

# Sauvegarder les règles actuelles
sudo iptables-save > /etc/iptables/rules.v4

# Restaurer les règles sauvegardées
sudo iptables-restore < /etc/iptables/rules.v4
```

---

### [GRAPHIQUE] Surveillance DHCP/DNS

```bash
# Logs en temps réel
sudo tail -f /var/log/dnsmasq.log

# Voir seulement les attributions DHCP
sudo tail -f /var/log/dnsmasq.log | grep DHCP

# Voir seulement les requêtes DNS
sudo tail -f /var/log/dnsmasq.log | grep query

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

# Statistiques par VLAN
cat /var/lib/misc/dnsmasq.leases | grep "192.168.10."    # VLAN 10
cat /var/lib/misc/dnsmasq.leases | grep "192.168.20."    # VLAN 20
cat /var/lib/misc/dnsmasq.leases | grep "192.168.30."    # VLAN 30
```

---

### [OUTILS] Dépannage

```bash
# Vérifier que le module VLAN est chargé
lsmod | grep 8021q

# Vérifier que le forwarding IP est actif
cat /proc/sys/net/ipv4/ip_forward    # Doit afficher "1"

# Tester DNSmasq
sudo dnsmasq --test

# Redémarrer les services
sudo systemctl restart dnsmasq
sudo systemctl restart networking

# Voir les erreurs système
sudo journalctl -xe

# Voir les logs kernel (firewall)
sudo dmesg | tail -50
```

---

## [BRAVO] RÉCAPITULATIF FINAL

### Ce que tu as construit :

```
[OK] 3 VLANs fonctionnels et isolés
[OK] Serveur DHCP pour chaque VLAN
[OK] Serveur DNS avec cache
[OK] Firewall avec isolation inter-VLAN
[OK] NAT pour l'accès Internet
[OK] Logs et surveillance
[OK] Configuration permanente (survivent au redémarrage)
```

---

### Architecture finale :

```
[WEB] Internet
│
├─ [RESEAU] Box/Routeur (192.168.1.1)
│
└─ [CODE] VM Linux (Serveur Multi-VLAN)
    │
    ├─ [BLEU] VLAN 10 - Comptabilité (192.168.10.0/24)
    │  ├─ Serveur DHCP actif [OK]
    │  ├─ Accès Internet [OK]
    │  └─ Isolation des autres VLANs [OK]
    │
    ├─ [VERT] VLAN 20 - Direction (192.168.20.0/24)
    │  ├─ Serveur DHCP actif [OK]
    │  ├─ Accès Internet [OK]
    │  └─ Isolation des autres VLANs [OK]
    │
    └─ [JAUNE] VLAN 30 - Invités (192.168.30.0/24)
       ├─ Serveur DHCP actif [OK]
       ├─ Accès Internet UNIQUEMENT [OK]
       └─ Isolation TOTALE [OK]
```

---

### [DOCS] Pour aller plus loin :

**Tu peux maintenant :**
- Ajouter d'autres VLANs (VLAN 40, 50, etc.)
- Configurer des VLANs pour VoIP, IoT, caméras
- Implémenter du QoS (Quality of Service)
- Créer des règles de firewall plus sophistiquées
- Mettre en place du monitoring avec Prometheus/Grafana

---

## [COURS] FÉLICITATIONS !

Tu maîtrises maintenant :
[OK] La théorie des VLANs (802.1Q)
[OK] La configuration réseau Linux avancée
[OK] Le routage inter-VLAN
[OK] La sécurité réseau avec iptables
[OK] L'administration de services réseau (DHCP/DNS)

**C'est une compétence TRÈS recherchée en administration réseau ! [RAPIDE]**

---

**FIN DU GUIDE VLAN 802.1Q ULTRA DÉTAILLÉ** [BRAVO]