Cours Admin Système

Module-Kit de Maîtrise : STP (Spanning Tree Protocol)

Module-Kit de Maîtrise : STP

Spanning Tree Protocol - Reconstruction Pédagogique 200%

📍 ANALOGIE SYSTÉMIQUE

Format Texte Libre et application de styles et de couleurs texteul.

Thème_central: "Le Directeur de la Circulation Réseau"

Métaphore: "Un système de gestion du trafic aérien (ATC) pour un aéroport (votre réseau)."

Éléments_clés:

  • Élément_1: "L'Aéroport Principal (Pont Racine) est choisi comme référence unique pour tous les vols. C'est le point de convergence le plus 'important' ou le plus central."
  • Élément_2: "Les Tours de Contrôle (Commutateurs) échangent des messages radios (BPDU) pour se coordonner et éviter les collisions."
  • Élément_3: "Les Pistes Actives (Ports Désignés/Racine) sont les seules voies autorisées pour le décollage et l'atterrissage du trafic (données) vers/depuis l'aéroport principal."
  • Élément_4: "Les Pistes de Secours/Alternatives (Ports Alternatifs/Blocking) sont fermées à la circulation mais prêtes à être activées en cas de problème sur une piste active. Elles empêchent deux avions de s'engager en même temps (boucle)."
  • Élément_5: "Le Plan de Vol (Coût du Chemin) est calculé pour chaque avion (trame) pour déterminer la route la plus courte/efficace vers l'aéroport principal."

Risque_analogique: "Un pirate qui se fait passer pour un nouvel aéroport principal (Pont Racine usurpé) avec une fausse fréquence radio (BPDU forgés) et reroute tout le trafic vers son 'aéroport' pour l'espionner ou le faire crash. Cela correspond à une attaque par usurpation de pont racine (Root Guard/BPDU Guard)."

🧠 MODÈLE MENTAL (Diagramme Flowchart)
flowchart TD A[STP: Éviter les boucles L2] --> B1["Étape 1: Élire le
Pont Racine (Root)"] A --> B2["Étape 2: Définir les
Ports Racine (RP)"] A --> B3["Étape 3: Élire les
Ports Désignés (DP)"] A --> B4["Étape 4: Bloquer les autres
Ports Alternatifs (AP)"] B1 --> C1["Critère: BID le plus bas
BID = Priorité + MAC"] B2 --> C2["Critère: Coût vers le Root
le plus faible (Path Cost)"] B3 --> C3["Critère: Sur un segment lien,
le port avec le meilleur
chemin vers le Root"] B4 --> C4["Action: État BLOCKING
Pas de trafic données"] C1 --> D["Topologie logique
sans boucle établie"] C2 --> D C3 --> D C4 --> D D --> E{["Lien actif tombe ?"]} E -- Oui --> F["Recalcul STA (Topology Change)
AP devient DP/RP
Temps de convergence:
STP=30-50s, RSTP <1s"] E -- Non --> G["État Stable
BPDU Hello toutes les 2s"] F --> D
⚡ NOYAU DUR (Les lois Immuables)
Loi #1 : STP est un protocole de couche 2, aveugle aux VLAN par défaut (802.1D). Preuve/Pourquoi : Une instance STP unique couvre tous les VLANs sauf si on utilise PVST+ (Cisco) qui crée une instance par VLAN.
Loi #2 : La décision STP est hiérarchique et s'arrête au premier critère discriminant. Preuve/Pourquoi : L'ordre est 1) BID Root le plus bas, 2) Coût de chemin racine le plus bas, 3) BID expéditeur le plus bas, 4) Priorité de port expéditeur la plus basse, 5) ID de port expéditeur le plus bas.
Loi #3 : Un port ne transmet du trafic utilisateur que s'il est à l'état FORWARDING. Preuve/Pourquoi : Les états BLOCKING, LISTENING, LEARNING sont des états transitoires ou bloquants. Seul FORWARDING apprend les MAC et forwarde les trames.
Loi #4 : Seul le Pont Racine génère des BPDU "de référence". Les autres commutateurs les relayent. Preuve/Pourquoi : Dans les BPDU reçues, l'identité du Root Bridge ne change pas. C'est le fondement de l'algorithme.
Loi #5 : Le coût de port est inversement proportionnel à la bande passante. Preuve/Pourquoi : 10 Mbps = Coût 100, 1 Gbps = Coût 4, 10 Gbps = Coût 2 (valeurs courtes IEEE). Plus le lien est rapide, plus son coût est bas, plus il a de chances d'être utilisé.
🔐 PROFONDEUR SÉCURITÉ & MÉTIER

🚨 RISQUE PRINCIPAL

Risque Principal : Usurpation de Pont Racine & Boucles Non Détectées

→ Attaque Type : Attaque par BPDU forgées. Un pirate connecte un switch (ex: Kali Linux avec yersinia) et envoie des BPDU annonçant un BID avec priorité 0, devenant le Root Bridge. Le trafic peut être redirigé vers son port d'écoute.

→ Détection : [Commande show ou log à monitorer]

show spanning-tree inconsistentports
show spanning-tree root
! Vérifier des changements fréquents du Root Bridge

→ Mitigation Immédiate : [Suite de commandes correctrices]

! Sur TOUS les ports d'accès (vers utilisateurs)
interface range gi0/1-24
 spanning-tree bpduguard enable
 spanning-tree portfast
! Sur TOUS les ports désignés/racine (vers infra)
 spanning-tree guard root

→ Intégration Entreprise : BPDU Guard et Root Guard sont des standards de sécurité de base. PortFast est obligatoire sur tout port d'accès. Playbook Ansible pour appliquer cette config sur tous les switches. SIEM : Alerte sur les logs %SPANTREE-2-ROOTGUARD_BLOCK ou %SPANTREE-2-BLOCK_BPDUGUARD.

- name: Harden STP on access ports
  ios_config:
    lines:
      - spanning-tree bpduguard enable
      - spanning-tree portfast
    parents: "interface {{ item }}"
  loop: "{{ access_interfaces }}"
📚 PROFONDEUR EXAMEN CCNA
Détail Oublié #1 : Le champ de priorité du Bridge ID fait 4 bits, mais Cisco l'incrémente par pas de 4096. La priorité réelle = Valeur de base (0-61440) + VLAN ID. Donc pour VLAN 10, priorité configurée 32768 = 32778 dans le BID.
Piège Fréquent #2 : Beaucoup pensent que show spanning-tree suffit. Il faut toujours vérifier show spanning-tree vlan X dans un environnement multi-VLAN, car le Root peut être différent par VLAN avec PVST+.
Question Type : Q: Sur un switch, les commandes spanning-tree vlan 1 priority 0 et spanning-tree vlan 1 root primary sont-elles équivalentes ? R: Presque, mais pas tout à fait. root primary fixe la priorité à 24576 si la priorité actuelle du root est >= 24576, sinon elle la fixe à 4096 de moins que le root actuel. priority 0 la fixe strictement à 0.
⚙️ LAB COMPLET : DE LA CONFIG À L'AUTOMATISATION

### Niveau 1 (CCNA) : Configuration Fondamentale

`[commande 1]` → *Objectif :* [...]
`[commande 2]` → *Vérification :* `[show command]` → *Sortie attendue :* [...]
! 1. Vérifier l'état STP actuel
show spanning-tree
show spanning-tree vlan 1
show spanning-tree root
! Objectif : Identifier le Root Bridge, les ports bloqués.

! 2. Forcer un switch à être le Root Bridge pour le VLAN 1
spanning-tree vlan 1 root primary
! Vérification :
show spanning-tree vlan 1 | include Bridge
! Sortie attendue : "This bridge is the root"

! 3. Modifier le coût d'un port pour influencer le chemin
interface GigabitEthernet0/1
 spanning-tree vlan 1 cost 10
! Justification : Rendre ce lien plus attractif (coût bas) pour le VLAN 1.

### Niveau 2 (Production Sécurisée) : Hardening

`[commande 1 avec options sécurité]` → *Risque si omis :* [...]
`[commande 2]` → *Justification best-practice :* [...]
! 1. Activer les protections de base sur TOUS les ports d'accès
interface range GigabitEthernet0/1-48
 switchport mode access
 spanning-tree portfast edge
 spanning-tree bpduguard enable
! Risque si omis : Une boucle physique créée par un utilisateur provoquerait une tempête de diffusion.

! 2. Activer Root Guard sur les ports uplink/trunk
interface range GigabitEthernet0/49-50
 switchport mode trunk
 spanning-tree guard root
! Justification : Empêche un switch downstream mal configuré ou malveillant de devenir le root.

! 3. Changer la version de STP pour une convergence rapide (RSTP/PVST+ est la norme)
spanning-tree mode rapid-pvst
! Vérification :
show spanning-tree summary | include Mode
! Sortie : "Switch is in rapid-pvst mode"

### Niveau 3 (Expert/Automatisation) : Script & Scale

# Extrait de script Python (Netmiko) ou playbook Ansible
[Code pertinent]
→ Avantage : [Temps gagné, erreurs évitées].
# Script Python (Netmiko) pour auditer la configuration STP sur un parc de switches
from netmiko import ConnectHandler
import csv

devices = [{'ip': '192.168.1.10', 'device_type': 'cisco_ios', 'username': 'admin', 'password': 'secret'}]

def audit_stp(connection):
    output = connection.send_command('show spanning-tree summary')
    lines = output.splitlines()
    stp_mode = 'Unknown'
    for line in lines:
        if 'rapid-pvst' in line.lower():
            stp_mode = 'Rapid-PVST'
        elif 'pvst' in line.lower():
            stp_mode = 'PVST+'
        elif 'mst' in line.lower():
            stp_mode = 'MST'
    # Vérifier BPDU Guard
    bpdu_check = connection.send_command('show run | inc bpduguard')
    bpdu_status = 'Enabled' if 'bpduguard' in bpdu_check else 'Disabled'
    return {'STP_Mode': stp_mode, 'BPDU_Guard': bpdu_status}

with open('stp_audit.csv', 'w', newline='') as csvfile:
    fieldnames = ['Device_IP', 'STP_Mode', 'BPDU_Guard']
    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)
    writer.writeheader()
    for device in devices:
        net_connect = ConnectHandler(**device)
        result = audit_stp(net_connect)
        result['Device_IP'] = device['ip']
        writer.writerow(result)
        net_connect.disconnect()
print("Audit terminé. Voir 'stp_audit.csv'")

→ Avantage : [Temps gagné sur l'audit de sécurité, erreurs évitées, documentation automatisée.]

🚨 SCÉNARIO DE DÉPANNAGE AVANCÉ

Symptôme Complexe : Les utilisateurs du VLAN 10 se plaignent de lenteurs intermittentes et de déconnexions. Le monitoring montre une utilisation CPU à 95% sur le switch d'accès SW-ACC-01. Aucune alarme lien down.

Processus de Diagnostic (Arbre Décisionnel) (Format Texte Libre) :

1. Vérifier les erreurs sur les interfaces : show interface gi0/1-48 | include errors|broadcast. Si broadcast est anormalement élevé (ex: >100k/sec) → Suspicion de tempête de diffusion.

2. Identifier la source des broadcasts : show mac address-table count | include All. Si le nombre d'adresses MAC fluctue violemment → Instabilité de table MAC, symptôme de boucle.

3. Examiner STP : show spanning-tree vlan 10 inconsistentports. Si des ports sont listés → BPDU incohérentes reçues.

4. Localiser le port problématique : show spanning-tree vlan 10 detail | include Gi0/|from|forward. Chercher un port qui est dans l'état FORWARDING mais qui reçoit des BPDU (ce qui est anormal pour un port désigné/racine).

Root Cause Probable : Boucle de couche 2. Un utilisateur a connecté un câble Ethernet entre deux ports d'un switch ou entre deux switches dans le même VLAN, en bypassant les liens trunk managés. Les protections STP (BPDU Guard) étaient désactivées sur ces ports d'accès.

Fix et Rollback :

! Fix
[Commandes]
! Vérification du fix
[Commandes]
! Rollback au cas où
[Commandes de rollback]
! 1. IDENTIFICATION ET DÉSACTIVATION MANUELLE (CRISE)
! Trouver le port avec le plus de traffic broadcast
show interface gi0/23 counters | include broadcast
! Sortie:  input broadcast packets 123456789
! Couper le port suspect
interface GigabitEthernet0/23
 shutdown
 description LOOP_SUSPECT_DISABLED_$(date)

! 2. VÉRIFICATION QUE LA BOUCLE EST ROMPUE
! L'utilisation CPU doit redescendre rapidement
show processes cpu sorted | include CPU utilization
! Le traffic broadcast doit chuter
show interface gi0/1 counters | include broadcast

! 3. APPLIQUER LA CORRECTION PERMANENTE
interface GigabitEthernet0/23
! Réactiver après enquête
 no shutdown
 spanning-tree portfast edge
 spanning-tree bpduguard enable
! Rollback au cas où (si le port est critique et ne peut être désactivé)
! interface GigabitEthernet0/23
!  no spanning-tree bpduguard enable
!  spanning-tree bpdufilter enable  (MOINS SÉCURISÉ - temporaire)
🔗 CONNECTIONS SYSTÉMIQUES

← Module Précédent (VLANs & Trunking) : STP utilise les VLAN IDs via l'Extended System ID. Une mauvaise configuration de trunk (ex: VLAN natif incorrect) ou de VLAN peut mener STP à créer une topologie sous-optimale ou à bloquer le mauvais lien.

→ Module Suivant (EtherChannel & FHRP) : STP voit un EtherChannel (LAG) comme un seul lien logique. C'est la méthode privilégiée pour fournir de la redondance sans que STP ne bloque un des liens physiques. Comprendre les coûts STP est crucial pour configurer des EtherChannels efficaces. Les protocoles FHRP comme HSRP/GLBP fonctionnent au-dessus de STP ; si STP bloque le chemin vers le routeur actif, la redondance L3 échoue.

🔄 Écosystème Réel : Dans les réseaux définis par logiciel (SDN), le contrôleur (ex: Cisco DNA Center) utilise souvent un protocole comme Fabric Path ou se base sur EVPN/VXLAN qui supprime le besoin de STP en utilisant un routage de couche 3 sous-jacent. STP reste toutefois critique dans la couche d'accès traditionnelle (branch).

❓ VALIDATION PAR EXERCICE MENTAL

Question de Concept : En utilisant l'analogie du contrôle aérien, expliquez ce qui se passe si la tour de contrôle principale (Root Bridge) tombe en panne. Qui prend le relais et comment les avions (trames) sont-ils informés du nouveau plan ?

Question de Piège : Un switch a une priorité de 28672 pour le VLAN 100. Quel est le VLAN ID ? (Rappel : Priorité = Base + VLAN ID. 28672 - 28672 % 4096 = 28672. (28672 % 4096 = 0). Donc Base = 28672, VLAN ID = 0? Impossible. En fait, 28672 / 4096 = 7. La base est 7*4096=28672. Donc VLAN ID = 0. Cela signifie que la priorité a été configurée sans considérer le VLAN, ou qu'il s'agit du VLAN 1 (car 28672+1=28673). C'est un piège !)

Question de Crise : "Il est 3h du matin, tous les voyants des switches clignotent frénétiquement, le monitoring crie à la tempête de broadcast sur le VLAN de gestion. Quelle est votre première commande, votre première hypothèse, et votre plan d'action en 3 étapes ?"

→ 1ère commande : show logging | include %SPANTREE|%BPDUGUARD (chercher l'origine dans les logs).

→ 1ère hypothèse : Boucle L2 sur le VLAN de gestion due à une erreur de cablage ou un équipement défectueux.

→ Plan en 3 étapes : 1) Identifier et shutdown le segment fautif via les logs/CPU/broadcast. 2) Isoler le VLAN de gestion en coupant les trunks non essentiels temporairement. 3) Une fois stable, auditer et appliquer BPDU Guard / Root Guard sur tous les ports.

🧩 MICRO-KIT ESSENTIEL (SYNTHÈSE 1 PAGE A4)

À la fin du Module-Kit de Maîtrise, générez un Micro-Kit Ultra-Synthétique tenant sur une seule page A4, contenant :

🔹 Les 5 Lois Immuables (version courte)

  1. STP bloque pour éviter les boucles.
  2. Le Root est élu au BID le plus bas.
  3. Chaque switch non-root a un seul Port Racine.
  4. Sur un segment, un seul Port Désigné.
  5. RSTP (rapid-pvst) est la norme en production.

🔹 Un mini-modèle mental simplifié (diagramme flowchart TD)

flowchart TD S[Start: STP Goal] --> R[Élire Root Bridge
Lowest BID Wins] R --> PR[Choisir Ports Racine
Lowest Path Cost to Root] PR --> DP[Choisir Ports Désignés
Best Path per Segment] DP --> B[Bloquer tous les autres
Ports Alternatifs] B --> L{Lien actif Down?} L -- Yes --> R L -- No --> S

🔹 Les 6 commandes CLI incontournables du module

  1. show spanning-tree vlan X
  2. show spanning-tree root
  3. show spanning-tree inconsistentports
  4. spanning-tree vlan X root primary
  5. spanning-tree bpduguard enable
  6. spanning-tree mode rapid-pvst

🔹 Les 3 pièges CCNA les plus fréquents

  1. Priorité par défaut = 32768, mais BID = 32768 + VLAN ID.
  2. PortFast sans BPDU Guard est dangereux.
  3. Coût 1G = 4 (valeur courte), pas 19 ou 1000.

🔹 Un scénario de dépannage résumé en 3 étapes

  1. Symptôme : CPU élevé, broadcast storm. Action : show interface | i broadcast → trouver le port.
  2. Diagnostic : Boucle L2. Action : shutdown le port fautif.
  3. Solution : spanning-tree bpduguard enable sur tous les ports d'accès.

🔹 Un mini-schéma Un diagramme flowchart TD ultra-intuitif

flowchart TD A[Topologie avec
redondance L2] --> B{STP Activé?} B -->|Oui| C[🚦 Ports Bloqués
Évite les boucles] C --> D[✓ Réseau Stable] B -->|Non| E[🔄 Boucle L2 créée] E --> F[🌪️ Tempête Broadcast] F --> G[💥 Panne Réseau]

🔹 1 risque sécurité + la mitigation la plus cruciale

Risque : Usurpation de Root Bridge via BPDU forgées.

Mitigation : spanning-tree bpduguard enable sur TOUS les ports d'accès (switchport mode access).

🔹 1 équation mentale (ex: "STP = Priorité + MAC → Root")

STP Decision =
Lowest [Root BID] →
Lowest [Path Cost] →
Lowest [Sender BID] →
Lowest [Sender Port ID]

Module-Kit de Maîtrise - Concepts du STP

© 2025