Spanning-Tree Portfast & BPDUGuard

Spanning-Tree (STP), pour rappel, est un protocole prenant en charge la résolution des boucles dans un réseau de switches. Bien qu’efficace, ce protocole est lent … très lent … trop lent, une interface qui passe up/up va transiter par différents états avant de pouvoir fonctionner normalement (forwarder les trames), cela prend 30 secondes (pour la version standard de STP).

Imaginons une minute le cas d’un PC moderne, qui essaie d’obtenir son configuration IP par DHCP….

 

Temps 0: Le PC se met en route, son interface s’active, l’interface du switch passe up/up, Spanning Tree la place dans un état « LISTENING », aucune trame n’entre ou ne sort à l’exception des BPDUs (Bridge Protocol Data Unit, message de STP).

Temps 0+15s: L’interface du switch passe dans l’état « LEARNING », elle accepte désormais les trames provenant du PC mais ne les forwarde pas, son seul but ici est de peupler sa table d’adresses MAC.

Et pendant ce temps ….
Le PC est dans les starting-blocks, il émet des requêtes DHCP, espérant (en vein) d’obtenir sa configuration… Ces trames sont purement et simplement éliminées par le switch. Après quelques essais, le PC abandonne, et passe sur la roue de secours en s’auto-configurant une adresse APIPA.

Temps  0+30s: L’interface passe enfin en état « FORWARDING », elle accepte maintenant les trames et les forwarde normalement.

Résultat … pas d’accès réseau fonctionnel pour le PC jusqu’à ce qu’il se décide de retenter sa chance.

PortFast … une solution dangereuse mais nécessaire

Afin de palier à ce problème, Cisco a mis en place une fonctionnalité permettant de by-passer les états LISTENING et FORWARDING sous certaines conditions. Cette fonctionnalité c’est le « PortFast ».

Configuration de l’interface en portfast:

Switch(config)#interface FastEthernet 0/1
Switch(config-if)#spanning-tree portfast

Vérifier si PortFast est activé ou non sur l’interface:

Switch#spanning-tree interface FastEthernet0/1 portfast
VLAN1            enabled

Attention:

  • PortFast n’est actif qu’à condition de l’interface ne soit pas un trunk
  • PortFast désactive le comportement normal de STP et expose donc le switch aux dangers de boucles. Il faut donc s’en prémunir et se servir de fonctionnalités complémentaires

BPDUGuard … « You shall not pass! »

Autre fonctionnalité, complémentaire à PortFast, BPDUGuard a pour but de désactiver une interface qui recevrait un BPDU alors qu’elle n’aurait pas dû. Une interface pour laquelle BPDUGuard est activé, et qui reçoit un BPDU, sera placée en état errDisabled (down/down, même état qu’en cas de violation de Port-Security).

Pour être à nouveau fonctionnelle, l’interface devra être manuellement remise à zéro (shutdown / no shutdown) ou alors il faut utiliser les fonctionnalités « errdisable recovery » (ce sera pour un autre article).

Configuration de BPDUGuard:

Switch(config)#interface FastEthernet 0/1
Switch(config-if)#spanning-tree bpduguard enable

Remarque: Ne confondez pas BPDUGuard et BPDUFilter, ce dernier a pour but d’empêcher une interface d’émettre des BPDUs mais aussi de les ignorer quand ils entrent, mais ne résout en rien le problème de base, bien au contraire.

Exemples de dangers écartés grâce à BPDUGuard:

  • L’utilisateur Lambda connecte sans le savoir deux ports du même switch entre eux (Ho! Le joli câble qui traîne… Si je le branchais juste à côté ?)
  • Une erreur de configuration/cablâge qui entraîne une boucle entre plusieurs switches par des interfaces en PortFast.

 

NOTE: Merci à Thierry de m’avoir donné une idée d’article 😉

7 Comments on “Spanning-Tree Portfast & BPDUGuard

  1. Bonjour,

    Merci pour vos articles., ça m’aide bcp a avancer.

    Svp pourriez vous m’expliquer d’avantage la différence entre Bpdu Guard et Bpdu filter ? pourquoi Bpdu filter ne résout en rien le problème de base vu qu’il permet de bloquer lui aussi de bloquer les Bpdu ?

    Merci infiniment.

    • BPDUGuard est une fonctionnalité de sécurité dont le but est de détecter un BPDU là où il ne devrait pas y en avoir et de placer le port en ERR-DISABLE.

      BPDUFilter est une fonctionnalité qui désactive l’émission et force l’interface à ignorer les BPDU. Ce qui équivaut quasivment à désactiver STP sur cette interface.

  2. Salut Steve,

    Un petit commentaire fort sympathique pour t’inviter à compléter cette article avec les fonctionnalités suivantes du STP :

    – Root Guard
    – LOOP Guard
    – UDLD

    A+

      • En effet j’y ai déjà pensé. C’est donc dans ma « To-Do list », mais pour le moment je n’ai pas énormément de temps à consacrer au blog, donc ce ne sera pas pour demain, en tout cas c’est une bonne suggestion. Merci!

  3. Très heureux de voir de nouveaux articles ! Qui sont d’ailleurs toujours aussi bon !

    Sinon le commentaire qui est fait est très interessant aussi, j’en prend note dans un petit coin 🙂

    Bonne journée et merci à vous.

    Kit’

  4. Article limpide comme d’habitue 🙂

    Ça m’a fait penser à une astuce qu’un de mes mentors m’avait appris il y a quelques années lorsque je devais brancher un serveur sur un switch Cisco. Le serveur faisait du trunk 802.1Q avec le switch car plusieurs VLAN devait transiter.

    Mais impossible d’activer la fonctionnalité Portfast sur cette interface Trunk, par défaut ce n’est pas possible. En demandant à mon mentor, il m’a dit qu’il fallait ajouter la variable « trunk » à la fin de la commande pour forcer le Portfast sur l’interface même si cette dernière était en trunk. Simple et efficace !

    Voici la commande:
    Switch(config-if)# spanning-tree portfast trunk

    Bonne journée a tous !