Bpduguard y STP como contramedida a un loop en un switch 3 En este post analizaremos bpduguard como contramedida a un loop o bucle en un switch. Esta contramedida nos permite también evitar que alguien conecte un switch que hable Spanning Tree Protocol a nuestra red. Un loop en un switch puede provocar una tormenta de broadcast en la red. Spanning-Tree Spanning-Tree Protocol, STP, permite tener una topologa redundada en una red de capa! libre de bucles l"gicos. Vamos a provocar un loop entre dos puertos para verificar que el switch está protegiendo a la red de loops. Vamos a analiar diferentes configuraciones para comparar el efecto del loop sobre nuestra red.
•
!aso "# El switch tiene activo portfast bpduguard a nivel global # los puertos de acceso est$n en port%ast.
spanning-tree spanning-tree spanning-tree spanning-tree spanning-tree spanning-tree spanning-tree spanning-tree
mode rapid-pvst logging portfast bpduguard default extend system-id
&on%iguraci"n de los puertos donde haremos el loop' interface FastEthernet0/13 FastEthernet0/13 description LOO s!itchport mode access s!itchport access vlan 100 s!itchport nonegotiate spanning-tree spanning-tree portfast " interface FastEthernet0/1# FastEthernet0/1# description LOO s!itchport mode access s!itchport access vlan 100 s!itchport nonegotiate spanning-tree spanning-tree portfast
Si conectamos el cable entre los puertos (3 # (), veremos que no llega a levantar, se enciende el led de lin* pero se apaga inmediatamente.
En los logs no aparece que ha levantado el puerto # aparece el evento que nos muestra la protecci$n del switch al loop. $an 11 1%&0%# 'E(& )*+,(EE-%-.LO.24+2& eceived .2 on port FastEthernet0/1# !ith .2 4uard enabled5 2isabling port5 $an 11 1%&0%# 'E(& )'-#-E26*+.LE & bpduguard error detected on Fa0/1# 7 putting Fa0/1# in err-disable state
Si miramos el estado de los puertos, veremos que los puertos no tienen lin*. El puerto () se ha puerto en error disable. +eando pings continuos entre equipos del mismo switch, veremos que no hemos perdido ni un solo paquete. %cciones a tomar#
+ebemos tener con%igurados los switches para enviar s#slog a un servidor # que éste nos enve un correo cuando detecte los eventos que nos interesan. +ebemos también deshacer el loop o bucle. Una vez deshecho el bucle del cable, habr$ que recuperar el error disable con un shutdown, no shutdown. E-iste la posibilidad de realizar un errordisable recover# autom$tico, pero para este caso, es meor realizarlo a mano, pues previamente deberemos deshacer el bucle del cable. Es recomendable tener desactivados los puertos de los switches que no est$n en uso en un entorno de producci"n. En un entorno de o%icinas, donde los puertos de los usuarios est$n activos con estaciones # telé%onos ip, es habitual que involuntariamente los usuarios hagan loops al reconectar cables # por tanto deben e-istir medidas de protecci"n como bpduguard para evitar desastres. El error m$s habitual de los usuarios es que conecten dos cables del switch / dos rosetas 0 a los telé%onos ip, uno en el puerto de switch del telé%ono # otro en el puerto de pc. Esto provocaria un loop. •
!aso El switch tiene activo port%ast bpduguard a nivel global # los puertos de acceso no tienen activo portfast.
%tenci$n ' %qu( estamos sin la protecci$n de portfast bpduguard sobre los puertos En este caso, si provocamos un loop, Spanning Tree por si s"lo no hace magia 1 &uidado con esta prueba, se producir$ un rec$lculo de STP # dependiendo de nuestra topologa, de la con%iguraci"n total de los switches, de la velocidad de los enlaces # de si el loop es local o entre switches puede darse el caso de interrupci"n en la red.
2eamos que sucede provocando un loop local'
!on la misma configuraci$n de puertos anterior a e)cepci$n del comando spanning-tree portfast, el switch iniciar$ la negociaci"n de spanningtree en dichos puertos al detectar lin*.
&omo hemos provocado un bucle, veremos transicionar un puerto a spanning-tree bloc*ing. +l loop será bloqueado por el switch, no perderemos paquetes # dichos puertos estar$n up pero uno de ellos bloqueado.
2eamos los logs' $an 11 1%&33&0# 'E(& )L6,-3-2O8,& 6nterface changed state to up $an 11 1%&33&0# 'E(& )L6,-3-2O8,& 6nterface changed state to up $an 11 1%&33&09 'E(& )L6,EO(O-9-2O8,& Line FastEthernet0/13 7 changed state to up $an 11 1%&33&09 'E(& )L6,EO(O-9-2O8,& Line FastEthernet0/1# 7 changed state to up
FastEthernet0/137 FastEthernet0/1#7 protocol on 6nterface
protocol on 6nterface
cisco: sho! spanning-tree bloc;edports ,ame .loc;ed 6nterfaces List 51# %p •
!aso ,# os puertos no est$n en port%ast pero tenemos activo bpduguard en cada puerto'
spanning-tree bpduguard enable
Sucede lo mismo que el caso (. os puertos se quedan sin lin* # uno de ellos entra en errdisable $an 11 1%?= 'E(& )*+,(EE-%-.LO.24+2& eceived .2 on port Fa0/1# !ith .2 4uard enabled5 2isabling port5 $an 11 1%?= 'E(& )'-#-E26*+.LE& bpduguard error detected on Fa0/1# 7 putting Fa0/1# in err-disable state •
!aso # Un usuario conecta un hub o switch no administrable detr$s de un puerto # provoca un loop con nuestro switch / dos enlaces entre el hub4switch no administrable # nuestro switch 0
Partiendo de la con%iguraci"n del caso (, un puerto entrar$ en error disable. •
!aso # Un usuario conecta un hub o switch no administrable # provoca un loop en el hub4switch no administrable.
Partimos de la con%iguraci"n del caso (. 5qu sucede lo mismo, pero en este caso aislará al hub/switch 0enemigo1, tanto si tenemos port%ast # globalmente 6spanning tree port%ast bpduguard de%ault7 / caso ( 0 o si tenemos bpduguard activo a nivel de puerto con 6spanningtree bpduguard enable7 / caso 3 0 2 por qu3 4 Es sencillo, al provocar un bucle en el hub4switch que nos han conectado, provocar$ una retransmisi"n de las bpdu8s # la recibiremos sobre el puerto de nuestro switch, detectar$ el problema # mover$ el uplin* con el hub4switch a err-disable.
============================================== ===============================
BPDUGuard vs BPDUFilter b# drodriguez 9 (: ;ov, !<(! 9 Switch 9 < comments +os caractersticas de seguridad para los BP56s de Spanning-Tree con nombres similares pero resultados mu# di%erentes.
Contexto Para intercambiar in%ormaci"n entre puentes, SpanningTree utiliza una trama especial llamada Bridge Protocol 5ata 6nit 7BP568 , esta tiene la in%ormaci"n con la que SpanningTree puede crear una topologa libre de bucles. Si tenemos un dispositivo renegado = el cl$sico eemplo siendo esos peque>os switches de ? puertos que los usuarios les encanta colocar en las salas de con%erencia = enviando @P+Us a la red, esto puede tener un e%ecto negativo /imagina la raz /root0 de SpanningTree cambiando de tu A:o switch in*s#s0 Para mitigar estos riesgos, &isco cre" BP569uard y BP56:ilter . 2amos a ver una tabla con los e%ectos de estos comandos'
BPDUGuard
BPDUFilter
Confguración BPDUGuard / BPDUFilter Esta es la topologa que vamos a utilizar, nada compleo, un !isco ,;< con una laptop conectada en el puerto Ca<4( # un 6Switch renegado7 conectado en Ca<4! # luego en Ca<43.
&on solo mi laptop conectada, este es el estado de la topologa' *81:sho! spanning-tree vlan 1 = +ddress 001@59ac353f00 (his bridge is the root Aello (ime % sec 'ax +ge %0 sec For!ard 2elay 19 sec .ridge 62
riority +ddress Aello (ime +ging (ime
1%%>= Bpriority 1%%>> sys-id-ext 1C 001@59ac353f00 % sec 'ax +ge %0 sec For!ard 2elay 19 sec 300 sec
6nterface ole *ts ost rio5,br (ype ------------------- ---- --- --------- --------------------------------------Fa0/1 2esg F82 1= 1%>53 %p Edge *81:sho! spanning-tree interface fa0/1 detail D include .2 .2& sent @17 received 0
Si solo conectamos SD! en Ca<4!, obtenemos que la raz de spanning tree root para la 2lan( cambio esto es por que el switch renegado tiene un @F+ mas bao' *81:sho! spanning-tree vlan 1 1=3 +ddress 00115=%#a5@900 ost 1= ort # BFastEthernet0/%C Aello (ime % sec 'ax +ge %0 sec For!ard 2elay 19 sec
.ridge 62
riority +ddress Aello (ime +ging (ime
1%%>= Bpriority 1%%>> sys-id-ext 1C 001@59ac353f00 % sec 'ax +ge %0 sec For!ard 2elay 19 sec 300 sec
6nterface ole *ts ost ------------------- ---- --- ---------------------------------------Fa0/1 2esg F82 1= Fa0/% oot F82 1=
rio5,br (ype -------1%>53 1%>5#
%p Edge %p
*81:sho! spanning-tree interface fa0/% detail D include .2 .2& sent 17 received 1%
Esto es, por supuesto, indeseable, nadie quisiera que esto sucediera en un ambiente de producci"n. Probemos BP569uard y BP56:ilter . Port%ast se encuentra activo globalmente # las inter%aces se encuentran en modo de acceso con +TP apagado. 5hora vo# a activar BP569uard globalmente /SD! esta todava conectado en Ca<4!0' *81BconfigC:spanning-tree portfast bpduguard default )*+,(EE-%-.LO.24+2& eceived .2 on port FastEthernet0/% !ith .2 4uard enabled5 2isabling port5 *81BconfigC: )'-#-E26*+.LE& bpduguard error detected on Fa0/%7 putting Fa0/% in err-disable state *81:sho! interface status err-disabled ort ,ame *tatus
eason
Err-disabled
El puerto esta errdisabled #, a no ser que errdisabled recover# este con%igurada, tiene que ser manualmente habilitado va shut4no shut. Fntentemos la version con BP569uard en la inter%az /Ca<4! esta shutdown0' *81Bconfig-ifC:spanning-tree bpduguard enable *81Bconfig-ifC:no shut *81Bconfig-ifC: )L6,-3-2O8,& 6nterface FastEthernet0/%7 changed state to up )L6,EO(O-9-2O8,& Line protocol on 6nterface FastEthernet0/%7 changed state to up )*+,(EE-%-.LO.24+2& eceived .2 on port Fa0/% !ith .2 4uard enabled5 2isabling port5 )'-#-E26*+.LE& bpduguard error detected on Fa0/%7 putting Fa0/% in err-disable state )L6,EO(O-9-2O8,& Line protocol on 6nterface FastEthernet0/%7 changed state to do!n *81Bconfig-ifC: )L6,-3-2O8,& 6nterface FastEthernet0/%7 changed state to do!n *81Bconfig-ifC:do sho! interface status err-disabled ort ,ame *tatus eason Err-disabled
Utilizando la alternativa /errdisable detect cause bpduguard shutdown vlan0 podemos evitar que la inter%az %isica sea colocada en errdisabled'
)L6,-9-A+,4E2& 6nterface FastEthernet0/%7 changed state to administratively do!n *81BconfigC:errdisable detect cause bpduguard shutdo!n vlan *81BconfigC:int fa0/% *81Bconfig-ifC:no shut *81Bconfig-ifC: )L6,-3-2O8,& 6nterface FastEthernet0/%7 changed state to up )L6,EO(O-9-2O8,& Line protocol on 6nterface FastEthernet0/%7 changed state to up )*+,(EE-%-.LO.24+2<& eceived .2 on port Fa0/%7 vlan 1 !ith .2 4uard enabled5 2isabling vlan5 *81Bconfig-ifC: )'-#-E26*+.LE<& bpduguard error detected on Fa0/%7 vlan 15 utting in err-disable state5 *81Bconfig-ifC:do sho! interface status err-disabled ort ,ame *tatus
eason
*81Bconfig-ifC:do sho! ip interface brief D 6nterface 6-+ddress O 'ethod
Err-disabled
exclude do!n *tatus rotocol up up up up up up
*81:sho! spanning-tree interface fa0/% no spanning tree info available for FastEthernet0/% *81:sho! spanning-tree = +ddress 001@59ac353f00 (his bridge is the root Aello (ime % sec 'ax +ge %0 sec For!ard 2elay 19 sec .ridge 62
riority +ddress Aello (ime +ging (ime
1%%>= Bpriority 1%%>> sys-id-ext 1C 001@59ac353f00 % sec 'ax +ge %0 sec For!ard 2elay 19 sec 300 sec
6nterface ole *ts ost rio5,br (ype ------------------- ---- --- --------- -----------------------------Fa0/1 2esg F82 1= 1%>53 %p Edge
a inter%az se mantiene arriba pero vlan ( esta errdisabled # no se encuentra participando en el dominio de spanning tree. Probemos @P+UCilter, primero globalmente' *81BconfigC:spanning-tree portfast bpdufilter default *81BconfigC:int fa0/% *81Bconfig-ifC:no shut )L6,-3-2O8,& 6nterface FastEthernet0/%7 changed state to up )L6,EO(O-9-2O8,& Line protocol on 6nterface FastEthernet0/%7 changed state to up *81:sh spanning-tree interface fa0/% portfast
*81:sho! spanning-tree interface fa0/% detail D include .2 .2& sent %7 received ? *81:sho! spanning-tree interface fa0/% detail D include .2 .2& sent %7 received @ *81:sho! spanning-tree interface fa0/% detail D include .2 .2& sent %7 received > *81:sho! spanning-tree interface fa0/% detail D include .2 .2& sent %7 received 11
a inter%az se levanta, el dispositivo observa @P+Us llegando, elimina el estado Port Cast. Un detalle interesante es que no se generan mensaes por causa de @P+UCilter 5hora en la inter%az' *81BconfigC:no spanning-tree portfast bpdufilter default *81BconfigC:int fa0/% *81Bconfig-ifC:shut )L6,-9-A+,4E2& 6nterface FastEthernet0/%7 changed state to administratively do!n )L6,EO(O-9-2O8,& Line protocol on 6nterface FastEthernet0/%7 changed state to do!n *81Bconfig-ifC:spanning-tree bpdufilter enable *81Bconfig-ifC:no shut *81Bconfig-ifC: )L6,-3-2O8,& 6nterface FastEthernet0/%7 changed state to up )L6,EO(O-9-2O8,& Line protocol on 6nterface FastEthernet0/%7 changed state to up *81Bconfig-ifC:GH *81:sho! spanning-tree vlan 1 = +ddress 001@59ac353f00 (his bridge is the root Aello (ime % sec 'ax +ge %0 sec .ridge 62
riority +ddress Aello (ime +ging (ime
For!ard 2elay 19 sec
1%%>= Bpriority 1%%>> sys-id-ext 1C 001@59ac353f00 % sec 'ax +ge %0 sec For!ard 2elay 19 sec 300 sec
6nterface ole *ts ost ------------------- ---- --- ---------------------------------------Fa0/1 2esg F82 1= Fa0/% 2esg F82 1=
rio5,br (ype -------1%>53 1%>5#
%p Edge %p Edge
*81:sho! spanning-tree interface fa0/% portfast
5hora la inter%az levanta, port %ast se mantiene, los @P+Us no son enviados # los que recibimos son ignorados. Esto basicamente ha desactivado Spanning tree en Ca<4!.
2eamos que %$cil es %ormar un bucle en esta con%iguraci"n, todo lo que tenemos que hacer es conectar Ca<4! # Ca<43, generar algo de tra%ico aleatorio /en nuestro caso una petici"n 5GP0' *81:sho! run D begin 0/% interface FastEthernet0/% s!itchport mode access s!itchport nonegotiate spanning-tree bpdufilter enable " interface FastEthernet0/3 s!itchport mode access s!itchport nonegotiate spanning-tree bpdufilter enable " *81:ping 151515% (ype escape seIuence to abort5 *ending 97 100-byte 6' Echos to 151515%7 timeout is % seconds& 555 *uccess rate is 0 percent B0/3C *81:sh controllers utiliJation ort eceive tiliJation Fa0/1 0 Fa0/% =3 Fa0/3 0 Fa0/# 0 Fa0/9 0 Fa0/? 0 Fa0/@ 0 Fa0/> 0 Fa0/= 0 Fa0/10 0 Fa0/11 0 Fa0/1% 0 Fa0/13 0 Fa0/1# 0 Fa0/19 0 Fa0/1? 0 Fa0/1@ 0 Fa0/1> 0 Fa0/1= 0 Fa0/%0 0 Fa0/%1 0 Fa0/%% 0 Fa0/%3 0 Fa0/%# 0 4i0/1 0 4i0/% 0
(ransmit tiliJation 0 0 =3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
(otal orts & %? *!itch eceive .and!idth ercentage tiliJation & % *!itch (ransmit .and!idth ercentage tiliJation & % *!itch Fabric ercentage tiliJation & % *81:sh processes cpu
D exclude 0500
utiliJation for five seconds& @0)/%>)K one minute& 9#)K five minutes& ?0) 62 untimeBmsC 6nvo;ed u*ecs 9*ec 1'in 9'in (( rocess = #=33%= 3@1%%> 13%> 395=#) %951=) %?5?0) 0 + 6nput 9# 1@%? 1==0>0 > 0519) 0511) 0511) 0 Fifo Error 2etec %311=@#3 =#01 %100 1511) 05?3) 05@1) 0 'arvell !;-a o!
En unos cuantos segundos, podemos observar como la utilizaci"n en Ca<4!3 salta hasta niveles m$-imos # el &PU del switch sube hasta H
Conclusiones +os mecanismos mu# Jtiles para proteger el dominio de spanningtree. Es necesario tomar en cuenta las variaciones en el %uncionamiento dependiendo de la aplicaci"n del comando # por supuesto tener mucho cuidado al habilitar BP56:ilter en una interfa, vimos que r$pido se puede crear un bucle en nuestro peque>o laboratorio con solo dos dispositivos # una petici"n de 5PG siendo enviada entre ambos switchs.
CCNP SWIC! "# Protegiendo la to$olog%a de S$anning&tree ' redes / certifcaciones / ccn$(route&s)itc* / s)itc* +
Protegiendo contra BPDUs ines$erados Root Guard &ontrola donde pueden encontrarse # conectarse los Goot @ridge candidatos. @$sicamente un switch aprende el @ridge F+ del Goot @ridge actual. Si otro switch anuncia una @P+U superior o con meor @ridge F+ en un puerto donde est$ con%igurado Goot Kuard, el switch local no permite que el nuevo switch sea el Goot @ridge. Lientras se sigan recibiendo @P+Us con meor @ridge Fd el puerto se mantendr$ en el estado root-inconsistent de STP. ;o se enva ni recibe datos en este estado solo escucha @P+Us. &uando dea de recibir sus @P+Us entonces pasa por los estados de STP normales hasta el Corwarding de %orma autom$tica.
Goot Kuard designa que un puerto solo puede enviar o reenviar @P+Us, pero no puede usarse para recibir @P+Us. Por lo que previene que un puerto sea Goot Port por donde normalmente se reciben @P+Us desde el Goot @ridge. Para con%igurarlo se debe hacer en cada puerto con el siguiente comando'
*!itchBconfig-ifC: spanning-tree guard root
Para ver que puertos est$n es estado root-inconsistent podemos usar este comando' *!itch: show spanning-tree inconsistentports
BPDU Guard Protege la integridad de los puertos que tiene activado PortCast. Si se recibe una @P+U en un puerto donde est$ con%igurado con @P+U Kuard ese puerto se pone inmediatamente en estado errdisable. Si se dea de recibir las @P+Us el puerto sigue en el estado errdisable. El puerto se pone en shutdown # +E@E ser activado manualmente o autom$ticamente usando el comando errdisable recovery.
Podemos con%igurarlo de %orma global que solo a%ectar$ a los puertos que estén con PortCast' *!itchBconfigC: spanning-tree portfast bpduguard default
También se puede activar o desactivar /en caso de que esté globalmente activado0 en cada puerto con el comando' *!itchBconfig-ifC: noM spanning-tree bpduguard enable
Protección contra $,rdida re$entina de BPDUs Loop Guard Lantiene la pista de la actividad de @P+Us en puertos nondesignated. Lientras se reciben @P+Us se permite que el puerto %uncione normalmente, pero cuando se dean de recibir las @P+Us, oop Kuard, pasa el puerto al estado de loopinconsistent. El puerto sigue bloqueado en este punto para prevenir bucles # que siga como nondesignated. &uando se vuelven a recibir @P+Us por el puerto, oop Kuard hace que el puerto pase por los estados de STP hasta que quede en Corwarding.
Por de%ecto oop Kuard est$ desactivado en todos los puertos # lo podemos activar globalmente con el siguiente comando' *!itchBconfigC: spanning-tree loopguard default
M para activarlo o desactivarlo en un puerto concreto podemos usar el comando' *!itchBconfig-ifC: noM spanning-tree guard loop
5unque oop Kuard se activa en un puerto solo bloquea la 2lan por donde se dean de recibir @P+U no el puerto completo. UDLD UniDirectional Link Detection /U++0 monitoriza un puerto para ver si realmente es bidireccional. El switch enva una trama espacial de &apa ! U++ identi%icando su puerto a intervalos regulares que se puede con%igurar pero por de%ecto son (: segundos. U++ espera que el switch del otro e-tremo responda esas tramas por el mismo enlace con su propia identi%icaci"n a>adida. Si la comunicaci"n se mantiene el enlace se considera bidireccional si no se considera unidireccional.
Na# dos modos de operaci"n'
•
Modo Normal# cuando se detecta un enlace unidireccional el $uerto
continua nor-al . UDD si-$le-ente -arca el $uerto con estado indeter-inado . genera un -ensa0e de s.slog1 •
Modo Agresivo# cuando se detecta un enlace unidireccional se
env%an -ensa0es UDD cada segundo durante 2 segundos3 si ninguno de esos -ensa0es se res$onden el $uerto se $asa al estado errdisa4led1 U++ puede con%igurarse de %orma global /aunque solo a%ecta a los puertos de %ibra0' *!itchBconfigC: udld Nenable D aggressive D message time seconds
También podemos con%igurarlo por cada puerto' *!itchBconfig-ifC: udld Nenable D aggressive D disable
Para modo normal usaremos enable # para modo agresivo aggressive. # podemos indicar el intervalo de los mensaes.
Usando el fltro de BPDUs $ara desactivar SP en un $uerto1 Siempre se debe usar STP para evitar bucles, pero en ciertos casos se puede necesitar evitar el envo o proceso de @P+Us en uno o varios puertos para ello podemos usar el %iltro de @P+Us que deshabilita el STP en dichos puertos. Por de%ecto, evidentemente, est$ desactivado este %iltro, pero podemos activarlo tanto globalmente como a nivel de inter%ace. Para activarlo globalmente aunque SOO a%ectar$ a los puertos con%igurados como PortCast' *!itchBconfigC: spanning-tree portfast bpdufilter default
&on esto con%igura TO+OS los puerto sPortCast con el %iltro de @P+Us. Si se ven @P+Us el puerto pierde su estado de PortCast, @P+U %iltering se deshabilita # STP toma el control por de%ecto. &uando el puerto se levanta /UP0 enva (< @P+Us, si escucha cualquier @P+U durante ese periodo, PortCast # el %iltro @P+U se deshabilitan. Para activar o desactivar ciertos puertos concretos' *!itchBconfig-ifC: spanning-tree bpdufilter Nenable D disable
Fgnora todas la @P+Us que recibe. ;o transmite @P+Us. =>T%' si se habilita @P+U Kuard # @P+U Ciltering en la misma inter%ace, @P+U Kuard no tiene e%ecto #a que @P+U Ciltering tiene pre%erencia.
Solución de $ro4le-as con la $rotección de SP Luestra un listado con los puertos que est$n etiquetados en estado inconsistente' *!itch: show spanning-tree inconsistentports
Para ver in%ormaci"n detallada de las razones del estado inconsistente de un puerto' *!itch: show spanning-tree interface type mod/num detail M
Luestra los estados globales de @P+U Kuard, @P+U %ilter # oop Kuard
*!itch: show spanning-tree summary
Luestra el estado U++ de uno o todos los puertos' *!itch: show udld type mod/numM
2uelve a habilitar los puertos que U++ en modo agresivo puso en errdisable' *!itch: udld reset