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