Las características avanzadas del protocolo STP es, posiblemente, uno de los temas menos comprendidos en cualquiera de los niveles de estudio de certificación Cisco. Por lo que se ha podido ver, estas características no han sido claramente documentadas o incluso la documentación existente presenta errores. En este post se describe la operación de 
PortFast, 
BPDU guard, y 
BPDU filter en detalle.
PortFast
La característica de PortFast 
fue originalmente desarrollada para resolver una situación donde una PC 
no logra obtener una dirección mediante DHCP debido a que el puerto del 
Switch no logra una transición al estado de reenvío (Forwarding) a 
tiempo. Esto se debe al STP que pasa por los estados de escuchar 
(Listening) y apreder (Learning), los cuales normalmente toman 30 
segundos.
 
PortFast permite que el puerto entre en un estado de Forwarding inmediatamente, pasando por alto los estados Listening y Learning. 
Debido a que el objetivo del PortFast es minimizar el tiempo que el puerto debe esperar a que el STP converja pasando por alto los estados de la transición normal solo debe ser configurado en puertos de borde (Edge ports) conectados a dispositivos finales.
Si PortFast está conectada a una interface conectada otro Switch, un bucle (loop) temporal de STP puede crearse. Esto es potencialmente perjudicial para la red. Por eso, el IOS de Cisco muestra un mensaje de advertencia cuando PortFast es habilitado.
Existe mucha desinformación sobre los detalles operacionales de PortFast circulando por la Internet.
Uno de los errores mas comunes es que el PortFast efectivamente deshabilita el STP y no se envían, ni reciben, BPDUs . Absolutamente todo en esta declaración es equivocado. 
El puerto habilitado con PortFast no solamente TRANSMITE BPDUs, sino que el estado operacional del PortFast de hecho depende de los BPDUs de entrada. Si el puerto recibe BPDUs, la característica de PortFast queda deshabilitada.
Ahora, es importante entender la diferencia entre el estado administrativo y operacional del PortFast. El estado administrativo se refiera a que es lo que está configurado en el dispositivo y el estado operacional define si la característica realmente está habilitada o deshabilitada.
Existen básicamente dos formas de habilitar el PortFast: Globalmente (
spanning-tree portfast default) o por interface (
spanning-tree portfast). Ambos comandos habilitan el PortFast en puertos que están operacionalmente como puertos de acceso. Por ejemplo, un puerto que es configurado administrativamente para negociar un enlace troncal pero falla en hacerlo, entonces opera en modo acceso.
Demos un vistazo a la línea de comandos. Una PC está conectada al Switch S1 en Eth0/2. El puerto está configurado en modo dynamic desirable y el PortFast está configurado en esa interface. Este es el estado administrativo. El Switch S1 no va a establecer un enlace troncal con la PC, entonces el puerto va a volver a modo de acceso y el PortFast va a estar habilitado. Este es el estado operacional.
S1#show run interface eth0/2
interface Ethernet0/2   
switchport mode dynamic desirable
spanning-tree portfast 
S1#show interface eth0/2 switchport 
Name: Et0/2
Switchport: Enabled
Administrative Mode: dynamic desirable
Operational Mode: static access
S1#show spanning-tree interface eth0/2 portfast
VLAN0001            enabled   
Y que acerca de los BPDUs? Todavía son enviados desde este puerto? Vamos a averiguarlo!.
S1#show spanning-tree interface eth0/2 detail | include BPDU
  BPDU: sent 580, received 0  
Claramente el puerto está enviando BPDUs. El STP está activo y corriendo.
Y que pasa si conectamos temporalmente un Switch Root a este puerto? El puerto va a recibir BPDU y la característica PortFast es efectivamente deshabilitada.
S1#show spanning-tree interface eth0/2 detail | include BPDU
 BPDU: sent 724, received 10    
S1#show spanning-tree interface eth0/2 portfast
VLAN0001            disabled   
Para el siguiente ejemplo, la PC es nuevamente conectada al S1 Eth0/2. Que ocurre si explícitamente configuramos la interface como troncal?  La característica de PortFast ya no va a estar habilitada.
S1#show run interface eth0/2 
interface Ethernet0/2                
 switchport trunk encapsulation dot1q                                          
 switchport mode trunk 
 spanning-tree portfast  
S1#show interface eth0/2 switchport                
Name: Et0/2 
Switchport: Enabled 
Administrative Mode: trunk 
Operational Mode: trunk 
S1#show spanning-tree interface eth0/2 portfast 
VLAN0001            disabled  
Existe un comando adicional de nivel de interface, spanning-tree portfast trunk, el cual habilita PortFast en enlaces troncales. La documentación puede ser un poco engañosa respecto de este comando. El documento dice, "Este comando habilita PortFast en la interface incluso en modo troncal," y luego dice, "Este comando permite configurar PortFast en enlaces troncales.". La primera frase es precisa. La segunda podría ser interpretada como habilitar PortFast solo en enlaces troncales, lo cual no es cierto y, de hecho, no es posible. No existe un comando para configurar PortFast solamente en puertos troncales operacionales.
S1(config)#interface eth0/2 
S1(config-if)#no spanning-tree portfast 
S1(config-if)#spanning-tree portfast trunk    
S1#show interface eth0/2 switchport 
Name: Et0/2 
Switchport: Enabled 
Administrative Mode: trunk 
Operational Mode: trunk 
S1#show spanning-tree interface eth0/2 portfast
VLAN0001            enabled  
Si se cambia la interface a modo acceso, la característica PortFast va a permanecer habilitada.
S1#show run interface eth0/2 
interface Ethernet0/2 
 switchport mode access 
 spanning-tree portfast trunk 
S1#show interface eth0/2 switchport        
Name: Et0/2 
Switchport: Enabled
Administrative Mode: static access                      
Operational Mode: static access
S1#show spanning-tree interface eth0/2 portfast    
VLAN0001            enabled   
Una convergencia más rápida es, posiblemente, el principal beneficio de la característica PortFast, pero no es la única. El Switch nunca genera una Notificación de Cambio de Topología (
TCN) cuando el estado de un puerto habilitado con PortFast cambia. En redes muy grandes (y planas) se puede llegar a un punto en el que la red está en un constante cambio de topología. Esto puede derivar en grandes problemas como una inundación excesiva de tráfico unicast, el cual puede hacer que la red se ponga lenta. Por eso es importante implementar correctamente el PortFast en la red.
BPDU Guard
 
 
BPDU
 guard previene que un puerto reciba BPDUs. Si el puerto recibe un BPDU, el puerto es colocado en un estado de error-disabled como una manera de proteger el puerto.
De la misma manera que la característica PortFast, el BPDU Guard tiene dos opciones de configuración: Global (
spanning-tree portfast bpduguard default) y por interface (
spanning-tree bpduguard enable).
 Como ya se puede observar de la sintaxis del comando, si es configurado globalmente  
BPDU Guard dependerá del estado operacional del  PortFast. Sin importar como PortFast fue configurado, a partir de que ha sido habilitado el BPDU Guard
 va a estar activo. En el caso de la configuración por interface esta habilita incondicionalmente  BPDU Guard en el puerto, independientemente del PortFast o del modo access/trunk.
Vamos a ver este comportamiento en la línea de comandos.
Los Switches S1 (root) 
y S2 estan directamente conectados en ambos extremos en el puerto Eth0/0. Vamos a verificar que el comando global no tiene efecto a no ser que esté relacionado con la característica con el PortFast.
Las interfaces están configuradas en modo de acceso, el BPDU Guard está habilitado globalmente, y portfast no está configurado. La configuración es idéntica en ambos switches.
S2#show interface eth0/0 switchport
Name: Et0/0
Switchport: Enabled
Administrative Mode: static access                   
Operational Mode: static access 
S2#show spanning-tree interface eth0/0 portfast
VLAN0001            disabled
S2(config)#spanning-tree portfast bpduguard default 
S2#show spanning-tree summary
Switch is in pvst mode
Root bridge for:            none
Extended system ID          is enabled
Portfast Default            is disabled
PortFast BPDU Guard Default is enabled 
Como puede verse, el BPDU Guard está habilitado globalmente. Solamente mirando el resultado de este comando podría sacarse una conclusión equivocada porque podría esperarse que el puerto esté en err-disabled después de recibir BPDUs. De todos modos, se están recibiendo BPDUs, pero el puerto todavía está transmitiendo. En este caso el PortFast no está habilitado, entonces el BPDU Guard nunca dispara el puerto hacia el estado de err-disable.
S2#show spanning-tree interface eth0/0 detail | include BPDU
  BPDU: sent 0, received 136     
S2#show spanning-tree interface eth0/0 portfast
VLAN0001            disabled 
S2#show spanning-tree | begin Interface            
Interface          Role Sts Cost      Prio.Nbr Type
------------------- ---- --- --------- -------- ------ 
Et0/0              Root FWD 100      128.1    Shr
Vamos a activar el PortFast globalmente en S1.
S1(config)#spanning-tree portfast default 
S1#show spanning-tree summary
Switch is in pvst mode           
Root bridge for: VLAN0001
Extended system ID           is enabled    
Portfast Default             is enabled
PortFast BPDU Guard Default  is enabled                                        
S1#show spanning-tree interface eth0/0 portfast    
VLAN0001            enabled  
S1#show spanning-tree | begin Interface
Interface          Role Sts Cost      Prio.Nbr Type      
------------------- ---- --- --------- -------- ---------- 
Et0/0              Desg FWD 100      128.1 Shr Edge        
En este punto pueden surgir algunas preguntas: Porque el puerto está todavía reenviando tramas después que la característica PortFast ha sido habilitada? Porque no hay mensajes de log?. La respuesta recae en la operación normal del STP. El Switch está corriendo PVST+, y solamente el root switch 
envía BPDUs a cada intervalo Hello a no ser que ocurra un cambio en la topología. 
Debido a que S1 el el root switch y no han ocurrido eventos que provoquen que el S2 envíe un TCN, el S1 no ha recibido ningún BPDUs.
S1#show spanning-tree interface eth0/0 detail | include BPDU|Bpdu 
  Bpdu guard is enabled by default                      BPDU: sent 631, received 0  
Ejecutemos el mismo comando en el S2.
S2(config)#spanning-tree portfast default 
Tan pronto como el S2 ha recibido el siguiente BPDU del S1, el puerto cambia a err-disabled y los mesajes de error se presentan en la consola.
*Mar  3 11:26:15.503: %SPANTREE-2-BLOCK_BPDUGUARD: Received BPDU on port Ethernet0/0 with BPDU Guard enabled. Disabling port. 
*Mar  3 11:26:15.503: %PM-4-ERR_DISABLE: bpduguard error detected on Et0/0, putting Et0/0 in err-disable state 
*Mar  3 11:26:16.504: %LINEPROTO-5-UPDOWN: Line protocol on Interface Ethernet0/0, changed state to down 
*Mar  3 11:26:17.503: %LINK-3-UPDOWN: Interface Ethernet0/0, changed state to down
S2#show interface status err-disabled
Port      Name    Status        Reason      Err-disabled Vlans 
Et0/0              err-disabled  bpduguard
Existen dos formas de recuperar un puerto en estado de err-disabled, una es ingresando manualmente los comandos 
shutdown y 
no shutdown y la otra forma es con el comando 
errdisable recovery cause bpduguard. El intervalo de recuperación por defecto es de 300 segundos, pero puede cambiarse con el comando 
errdisable recovery interval.
S2#show errdisable recovery
ErrDisable Reason           Timer Status
-----------------           -------------- 
arp-inspection               Disabled
bpduguard                    Enabled 
channel-misconfig (STP)      Disabled        
--- output omitted ---                                        
                                                                                
Timer interval: 300 seconds 
Interfaces that will be enabled at the next timeout:
Interface      Errdisable reason      Time left(sec)
---------      -----------------      --------------
Et0/0                  bpduguard          275 
Obviamente, la recuperación automática no arregla la causa del problema. Después de 300 segundos el puerto debe ser rehabilitado por un breve periodo de tiempo hasta que entre nuevamente en estado de err-disabled cuando el siguiente BPDU desde el root switch sea recibido.
Ahora probemos rápidamente que la configuración de nivel de interface BPDU Guard es de hecho independiente del estado operacional PortFast o el modo access/trunk.
S2(config)#no spanning-tree portfast default 
S2(config)#no spanning-tree portfast bpduguard default 
S2(config)#interface Eth0/0 
S2(config-if)#spanning-tree bpduguard enable
S2#show spanning-tree interface eth0/0 portfast
VLAN0001            disabled   
S2#show spanning-tree interface eth0/0 detail | include Bpdu|BPDU
 Bpdu guard is enabled
 BPDU: sent 0, received 140
Cuando el primer BPDU es recibido, la interface se coloca en err-disabled.
*Mar  3 12:55:33.953: %SPANTREE-2-BLOCK_BPDUGUARD: Received BPDU on port Et0/0 with BPDU Guard enabled. Disabling port. 
*Mar  3 12:55:33.953: %PM-4-ERR_DISABLE: bpduguard error detected on Et0/0, putting Et0/0 in err-disable state 
*Mar  3 12:55:35.325: %LINK-3-UPDOWN: Interface Ethernet0/0, changed state to down
S2#show interface status err-disabled
Port      Name    Status        Reason      Err-disabled Vlans
Et0/0            err-disabled  bpduguard
BPDU Filter
La función BPDU
 Filter previene que ciertos puertos específicos envíen o reciban  BPDUs. 
Nuevamente, existen dos metodos para configurar esta característica: Globalmente (
spanning-tree portfast bpdufilter default) y por interface (
spanning-tree bpdufilter enable).
 La configuración por interface filtra incondicionalmente BPDUs en ambos sentidos, de ingreso y de salida - Independientemente del estado operacional del PortFast o del modo 
access/trunk.
Este es efectivamente el equivalente a apagar el STP. Pero hacer esto puede ser muy peligroso porque se puede crear fácilmente un loop permanente. Llama la atención que el IOS no muestre un mensaje de advertencia cuando este comando se aplica. Habilitar PortFast en la interface equivocada no representa un gran riesgo como en el caso del BDPU Filter, pero el IOS en ese caso si manda una advertencia al administrador.
Vamos a ver esto en acción. Los Switches S1 (root) y S2 están conectadas con los enlaces. Eth0/1 en S2 está bloqueado.
S1#show spanning-tree | begin Interface
                                        
Interface          Role Sts Cost      Prio.Nbr Type
------------------- ---- --- --------- -------- --------
Et0/0              Desg FWD 100      128.1    Shr
Et0/1              Desg FWD 100      128.2    Shr
S2#show spanning-tree | begin Interface
Interface          Role Sts Cost      Prio.Nbr Type
------------------- ---- --- --------- -------- --------
Et0/0              Root FWD 100      128.1    Shr
Et0/1              Altn BLK 100      128.2    Shr
Que ocurre si se habilita BPDU Filter en el S2?
S2(config)#interface range eth0/0 - 1
S2(config-if-range)#spanning-tree bpdufilter enable 
S1#show spanning-tree
                                      
VLAN0001                                           
  Spanning tree enabled protocol ieee
  Root ID   Priority    32769  
            Address aabb.cc00.1f00                   
            This bridge is the root
            Hello Time  2 sec  Max Age 20 sec  Forward Delay 15 sec
                                                                                
  Bridge ID  Priority    32769  (priority 32768 sys-id-ext 1)
            Address    aabb.cc00.1f00 
            Hello Time  2 sec  Max Age 20 sec  Forward Delay 15 sec 
            Aging Time  300 sec
                                                                                
Interface          Role Sts Cost      Prio.Nbr Type 
------------------- ---- --- --------- -------- -----------------------
Et0/0              Desg FWD 100      128.1    Shr                    
Et0/1              Desg FWD 100      128.2    Shr
S2#show spanning-tree
VLAN0001                                                                        
  Spanning tree enabled protocol ieee                         
  Root ID    Priority    32769                   
             Address    aabb.cc00.2000
            This bridge is the root
            Hello Time  2 sec  Max Age 20 sec  Forward Delay 15 sec 
                                                                                
  Bridge ID  Priority    32769  (priority 32768 sys-id-ext 1)
            Address    aabb.cc00.2000
            Hello Time  2 sec  Max Age 20 sec  Forward Delay 15 sec
            Aging Time  300 sec
                                                                                
Interface          Role Sts Cost      Prio.Nbr Type 
------------------- ---- --- --------- -------- -----------------------
Et0/0              Desg FWD 100      128.1    Shr
Et0/1              Desg FWD 100      128.2    Shr
Ambos Switches ahora piensan que son el root y todas sus interfaces están en estado de forwarding. Las BPDUs no se envían ni reciben en S2.
S2#show spanning-tree interface eth0/0 detail | include Bpdu|BPDU 
  Bpdu filter is enabled
  BPDU: sent 0, received 0 
S2#show spanning-tree interface eth0/1 detail | include Bpdu|BPDU
  Bpdu filter is enabled
  BPDU: sent 0, received 0 
Demos un vistazo a la utilización del ancho de banda. Son muchos paquetes!.
S2#show interface eth0/0
Ethernet0/0 is up, line protocol is up (connected)
  30 second input rate 12481000 bits/sec, 20262 packets/sec
  30 second output rate 12482000 bits/sec, 20264 packets/sec
S2#show interface eth0/1  
Ethernet0/1 is up, line protocol is up (connected)
  30 second input rate 12477000 bits/sec, 20256 packets/sec
  30 second output rate 12474000 bits/sec, 20250 packets/sec
Este es un ejercicio emulado en IOL. Además de los dos switches, no existen otros dispositivos y ningún otro tráfico. Entonces usted se puede imaginar como esta configuración podría rápidamente colapsar la red. Use con mucha precaución este comando.
La configuración global es mas intrincada. De manera similar a la característica BPDU Guard, el BPDU Filter global es habilitado en las interfaces que tiene el estado PortFast operational. En modo global, el switch no filtra los BPDUs de entrada, pero la mayoría (aunque no todas) las BPDUs de salida son filtradas. Cuando un puerto se enciende, se mandan 11 BPDUs. Si se reciben BPDUs las características 
PortFast y BPDU Filter se deshabilitan.
Vamos a ver como trabaja esto. Ambas interfaces en S1 han sido configuradas con BPDU Filter de interface. Ambas interfaces en S2 tienen el 
spanning-tree portfast trunk configurado entonces PortFast va a estar operacional y BPDU Filter está habilitado globalmente.
S1#show spanning-tree interface eth0/0 detail | include Bpdu|BPDU 
  Bpdu filter is enabled
  BPDU: sent 0, received 0
                                                                          
S1#show spanning-tree interface eth0/1 detail | include Bpdu|BPDU
  Bpdu filter is enabled
  BPDU: sent 0, received 0  
S2#show spanning-tree summary
Switch is in pvst mode
Root bridge for: VLAN0001
Extended system ID           is enabled
Portfast Default             is disabled 
PortFast BPDU Guard Default  is disabled         
Portfast BPDU Filter Default is enabled
El puerto manda 11 BPDUs y se detiene.
S2#show spanning-tree interface eth0/0 detail | include Bpdu|BPDU
  Bpdu filter is enabled by default
  BPDU: sent 11, received 0 
S2#show spanning-tree interface eth0/1 detail | include Bpdu|BPDU
  Bpdu filter is enabled by default 
  BPDU: sent 11, received 0  
Note lo que ocurre en S2 cuando el BPDU Filter de interface es deshabilitado en S1.
S1(config)#interface range eth0/0 - 1
S1(config-if-range)#no spanning-tree bpdufilter enable
S2#debug spanning-tree events
*Mar  3 15:01:09.027: STP: VLAN0001 heard root 32769-aabb.cc00.1f00 on Et0/1 
*Mar  3 15:01:09.027: supersedes 32769-aabb.cc00.2000
*Mar 
 3 15:01:09.027: STP: VLAN0001 new root is 32769, aabb.cc00.1f00 on port
 Et0/1, cost 100 *Mar  3 15:01:09.027: STP: VLAN0001 new root port 
Et0/0, cost 100
*Mar  3 15:01:09.027: STP: VLAN0001 sent Topology Change Notice on Et0/0 
*Mar  3 15:01:09.027: STP[1]: Generating TC trap for port Ethernet0/1
*Mar  3 15:01:09.027: STP: VLAN0001 Et0/1 -> blocking  
El S2
 escucha BPDUs superiores, deshabilita efectivamente el BPDU Filter y retorna el STP a su operación normal. El Eth0/0 se convierte en root port y Eth0/1 queda bloqueado.
S2#show spanning-tree | begin Interface
Interface          Role Sts Cost      Prio.Nbr Type
------------------- ---- --- --------- -------- --------
Et0/0              Root FWD 100      128.1    Shr
Et0/1              Altn BLK 100      128.2    Shr
Resumen
En este artículo hemos presentado características avanzadas de STP de manera extensa, pero a continuación nos gustaría resaltar los puntos más importantes:
- PortFast mueve inmediatamente el puerto al estado de forwarding, pasando por alto los estados listening y learning.
 
- Un puerto con PortFast habilitado continua enviando BPDUs.
 
- Si se recibe un BPDU, PortFast se deshabilita.
 
- El switch nunca genera un TCN cuando un puerto habilitado con PortFast cambia entre up o down.
 
- Existe diferencia entre estado administrativo y estado operacional.
 
- El comando spanning-tree portfast trunk habilita PortFast en puertos de acceso y troncales.
 
- BPDU Guard y BPDU Filter en modo global son dependientes de PortFast operacional.
 
- BPDU Guard y BPDU Filter en modo interface es incodicional.
 
- Un
 BPDU Filter mal configurado es mucho mas peligroso que un PortFast mal configurado, aun así el IOS
 no genera un mensaje de advertencia acerca de esto.
 
- PortFast
 puede crear un loop temporal de maximo 2 segundos (intervalo por defecto del Hello) 
hasta que el siguiente BPDU se recibe y el PortFast queda deshabilitado. El BPDU Filter 
puede crear un loop permanente porque todos los BPDUs son ignorados.
 
- Recuerde la operación del STP - en que casos los BPDUs son enviados y cuando no
 
Tomado de: https://learningnetwork.cisco.com/blogs/vip-perspectives/2016/03/10/advanced-stp-features-portfast-bpdu-guard-and-bpdu-filter
Traducido por José R. Torrico Gumucio, Instructor Cisco Networking Academy