Agregar una VLAN en un trunk causa downtime en un server

Fecha: 26 de enero del 2023

 

Escenario

 

En este escenario está basado en un caso real más complejo, que por motivos de simplicidad lo limitamos a esta topología.

Tenemos dos switches en cascada, dos servers trabajando en la VLAN 20 transfiriendo datos críticos en tiempo real (una

aplicación X dejada a la imaginación de cada uno), y debemos agregar esta VLAN en el trunk inter-switches para agregar

un tercer server supongamos que en otro rack.

Al hacerlo, se corta la conectividad entre los dos primeros servers causando “un chiquero”.

¿El motivo ? encontrarlo es el desafío de este lab (realizado con equipos reales, en Packet Tracer no se comporta igual).

 

 

Este es el escenario inicial, la VLAN 10 no existe en el switch Cisco2960-2, ni la VLAN 20 no existe en el switch Cisco2960-1.

 

 

1.- Se configura la VLAN 20 en el switch 2960-1 y se asocia a los ports:

 

2960-1#conf t

Enter configuration commands, one per line.  End with CNTL/Z.

2960-1(config)#vlan 20

2960-1(config-vlan)#exit

2960-1(config)#

2960-1(config)#int gi1/0/3

2960-1(config-if)#switchport access vlan 20

2960-1(config-if)#exit

2960-1(config)#

2960-1(config)#interface GigabitEthernet1/0/24

2960-1(config-if)#switchport trunk allowed vlan add 20

2960-1(config-if)#end

2960-1#

 

 

 

2.- Se agrega la VLAN 20 en el trunk del switch 2960-2:

 

Aquí es cuando comienza el caos porque se pierde la conectividad entre los servers y suena el teléfono…

 

2960-2#conf t

Enter configuration commands, one per line.  End with CNTL/Z.

2960-2(config)#interface GigabitEthernet1/0/24

2960-2(config-if)#switchport trunk allowed vlan add 20

2960-2(config-if)#end

2960-2#

 

3.- Verificamos conectividad desde 192.168.20.10:

 

Acá lo probamos con ping para fines prácticos, pero de ser tráfico sensible a tiempo real, tanto TCP

como UDP, este corte causaría estragos.

 

Respuesta desde 192.168.20.10: bytes=32 tiempo=2ms TTL=64

Respuesta desde 192.168.20.10: bytes=32 tiempo=3ms TTL=64

Tiempo de espera agotado para esta solicitud.

Tiempo de espera agotado para esta solicitud.

Tiempo de espera agotado para esta solicitud.

Tiempo de espera agotado para esta solicitud.

Tiempo de espera agotado para esta solicitud.

Tiempo de espera agotado para esta solicitud.

Tiempo de espera agotado para esta solicitud.

Tiempo de espera agotado para esta solicitud.

Respuesta desde 192.168.20.10: bytes=32 tiempo=4ms TTL=64

Respuesta desde 192.168.20.10: bytes=32 tiempo=1ms TTL=64

 

4.- Verificamos que pasó:

 

Al verificar podemos ver que el downtime fué de aprox 30 segundos, lo que nos indica que podría venir

por el lado de spanning-tree, para esto corremos un debug y repetimos la prueba.

 

4.1.- Quitamos la VLAN del trunk:

 

2960-2(config)#interface GigabitEthernet1/0/24

2960-2(config-if)#switchport trunk allowed vlan remove 20

2960-2(config-if)#end

2960-2#

 

4.2.- Corremos el debug:

 

2960-2#debug spann events

Spanning Tree event debugging is on

2960-2#

 

4.3.- Agregamos la VLAN en el trunk:

 

2960-2#conf t

Enter configuration commands, one per line.  End with CNTL/Z.

2960-2(config)#interface GigabitEthernet1/0/24

2960-2(config-if)#switchport trunk allowed vlan add 20

2960-2(config-if)#end

2960-2#

 

4.4.- Verificamos en los logs del debug:

 

2960-2#

Jul 26 17:16:08.385: RSTP(20): initializing port Gi1/0/24

Jul 26 17:16:08.385: RSTP(20): Gi1/0/24 is now designated

Jul 26 17:16:08.395: RSTP(20): transmitting a proposal on Gi1/0/24

Jul 26 17:16:08.654: RSTP(20): updt roles, received superior bpdu on Gi1/0/24

Jul 26 17:16:08.654: RSTP(20): Gi1/0/24 is now root port

Jul 26 17:16:08.654: RSTP(20): syncing port Gi1/0/1 (entra en listening)

Jul 26 17:16:08.654: RSTP(20): syncing port Gi1/0/2 (entra en listening)

Jul 26 17:16:08.654: STP[20]: Generating TC trap for port GigabitEthernet1/0/24

Jul 26 17:16:08.657: RSTP(20): transmitting a proposal on Gi1/0/1

Jul 26 17:16:08.657: RSTP(20): transmitting a proposal on Gi1/0/2

Jul 26 17:16:08.839: RSTP(20): transmitting a proposal on Gi1/0/1

Jul 26 17:16:08.839: RSTP(20): transmitting a proposal on Gi1/0/2

Jul 26 17:16:10.842: RSTP(20): transmitting a proposal on Gi1/0/1

Jul 26 17:16:10.842: RSTP(20): transmitting a proposal on Gi1/0/2

Jul 26 17:16:12.848: RSTP(20): transmitting a proposal on Gi1/0/1

Jul 26 17:16:12.848: RSTP(20): transmitting a proposal on Gi1/0/2

Jul 26 17:16:14.851: RSTP(20): transmitting a proposal on Gi1/0/1

Jul 26 17:16:14.851: RSTP(20): transmitting a proposal on Gi1/0/2

Jul 26 17:16:16.857: RSTP(20): transmitting a proposal on Gi1/0/1

Jul 26 17:16:16.857: RSTP(20): transmitting a proposal on Gi1/0/2

Jul 26 17:16:18.860: RSTP(20): transmitting a proposal on Gi1/0/1

Jul 26 17:16:18.860: RSTP(20): transmitting a proposal on Gi1/0/2

Jul 26 17:16:20.873: RSTP(20): transmitting a proposal on Gi1/0/1

Jul 26 17:16:20.873: RSTP(20): transmitting a proposal on Gi1/0/2

Jul 26 17:16:22.876: RSTP(20): transmitting a proposal on Gi1/0/1

Jul 26 17:16:22.876: RSTP(20): transmitting a proposal on Gi1/0/2

Jul 26 17:16:23.655: RSTP(20): Gi1/0/1 fdwhile Expired (entra en learning)

Jul 26 17:16:23.655: RSTP(20): Gi1/0/2 fdwhile Expired (entra en learning)

Jul 26 17:16:24.882: RSTP(20): transmitting a proposal on Gi1/0/1

Jul 26 17:16:24.882: RSTP(20): transmitting a proposal on Gi1/0/2

Jul 26 17:16:26.885: RSTP(20): transmitting a proposal on Gi1/0/1

Jul 26 17:16:26.885: RSTP(20): transmitting a proposal on Gi1/0/2

Jul 26 17:16:28.891: RSTP(20): transmitting a proposal on Gi1/0/1

Jul 26 17:16:28.891: RSTP(20): transmitting a proposal on Gi1/0/2

Jul 26 17:16:30.894: RSTP(20): transmitting a proposal on Gi1/0/1

Jul 26 17:16:30.894: RSTP(20): transmitting a proposal on Gi1/0/2

Jul 26 17:16:32.897: RSTP(20): transmitting a proposal on Gi1/0/1

Jul 26 17:16:32.897: RSTP(20): transmitting a proposal on Gi1/0/2

Jul 26 17:16:34.903: RSTP(20): transmitting a proposal on Gi1/0/1

Jul 26 17:16:34.903: RSTP(20): transmitting a proposal on Gi1/0/2

Jul 26 17:16:36.913: RSTP(20): transmitting a proposal on Gi1/0/1

Jul 26 17:16:36.913: RSTP(20): transmitting a proposal on Gi1/0/2

Jul 26 17:16:38.661: RSTP(20): Gi1/0/1 fdwhile Expired (entra en forwarding)

Jul 26 17:16:38.661: RSTP(20): Gi1/0/2 fdwhile Expired (entra en forwarding)

                      |

2960-2#       30 segundos de corte

 

 

4.5.- Verificamos como queda el spanning-tree:

 

2960-2#sh spanning-tree vlan 20

 

VLAN0020

  Spanning tree enabled protocol rstp

  Root ID    Priority    32788

             Address     005f.86a7.2a00 (se convierte en root porque 2 es menor a c (que sería 12 en decimal))

             Cost        4

             Port        24 (GigabitEthernet1/0/24)

             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec

 

  Bridge ID  Priority    32788  (priority 32768 sys-id-ext 20)

             Address     005f.86a7.c080

             Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec

             Aging Time  300 sec

 

Interface           Role Sts Cost      Prio.Nbr Type

------------------- ---- --- --------- -------- --------------------------------

Gi1/0/1             Desg FWD 4         128.1    P2p

Gi1/0/2             Desg FWD 19        128.2    P2p

Gi1/0/24            Root FWD 4         128.24   P2p

 

2960-2#

 

5.- Pero, con spanning-tree convencional sucede ?

 

Repetimos el paso 2 pero con STP convencional (PVST a secas) para verificar si sucede lo mismo.

 

5.1.- Quitamos la VLAN 20 del trunk:

 

2960-2(config)#interface GigabitEthernet1/0/24

2960-2(config-if)#switchport trunk allowed vlan remove 20

2960-2(config-if)#end

2960-2#

 

5.2.- Activamos el modo convencional en ambos switches:

 

2960-1#conf t

Enter configuration commands, one per line.  End with CNTL/Z.

2960-1(config)#spanning-tree mode pvst

2960-1(config)#

 

2960-2#conf t

Enter configuration commands, one per line.  End with CNTL/Z.

2960-2(config)#spanning-tree mode pvst

2960-2(config)#

 

5.3.- Agregamos la VLAN 20 en el trunk:

 

2960-2#conf t

Enter configuration commands, one per line.  End with CNTL/Z.

2960-2(config)#interface GigabitEthernet1/0/24

2960-2(config-if)#switchport trunk allowed vlan add 20

2960-2(config-if)#

 

5.4.- Verificamos en los logs del debug:

 

Jul 26 17:21:04.342: set portid: VLAN0020 Gi1/0/24: new port id 8018

Jul 26 17:21:04.342: STP: VLAN0020 Gi1/0/24 -> listening

Jul 26 17:21:04.880: STP: VLAN0020 heard root 32788-005f.86a7.2a00 on Gi1/0/24

Jul 26 17:21:04.880:     supersedes 32788-005f.86a7.c080

Jul 26 17:21:04.880: STP: VLAN0020 new root is 32788, 005f.86a7.2a00 on port Gi1/0/24, cost 4

Jul 27 07:21:04.880: STP: VLAN0020 sent Topology Change Notice on Gi1/0/24

2960-2(config-if)#

2960-2(config-if)#

 

Podemos ver que sólo afecta el port 24 del uplink, por lo tanto con PVST (o STP) convencional no ocurre el corte.

 

6.- Solución al problema inicial:

 

La solución es fácil y evitable de antemano: se debe configurar la priority para la VLAN 20 en el switch 2960-2 para

que sea el root de la misma. Esto es si consideramos que la VLAN 20 es más crítica en el 2960-2 que en el otro.

 

2960-2(config)#spanning-tree vlan 20 priority 4096 (con esto se convierte en root)

2960-2(config)#

 

Este comando no genera cortes en el switch 2960-2 y al agregar la VLAN 20 en el trunk en el 2960-1 si va a generar

cortes, ya que al estar standalone con la VLAN 20 sin pasar por el trunk, este se percibe root de la misma, pero como

el server C es nuevo en este switch (de hecho la VLAN 20 es nueva en este switch) no se generarían “daños”.

 

Otra solución más elemental y que no necesita entender de spanning-tree es realizar el cambio cuando no hay tráfico,

pero no es una solución tan elegante como este laboratorio :-)

                 

(2023) burning (spanning) tree

Rosario, Argentina