====== STP - Spanning Tree Protocol ====== ===== Bridging loop ===== {{:wiki:site:cisco:bridging_loop.png|}} **Komunikace PC-1 to PC-4** - Uvažujme, že PC-1 zná MAC adresu PC-4 a switche mají prázdné CAM tabulky. - PC-1 pošle rámec s cílovou MAC (PC-4), oba sw ho přijmou na portu 1/1, a uloží si zdrojovou adresu PC-1 do CAM tabulky - Jelikož adresa PC-4 není v CAM tabulkách, musejí sw rámec rozeslat všemi porty, kromě těch, na kterých rámec přijali - Oba switche odešlou rámec z portů 2/1, PC-4 přijme dva rámce, každý switch zároveň přijme rámec od druhého switche. - Oba switche si na základě přijatého rámce od druhého switche upraví záznam v CAM tabulce. Dle zdrojové adresy v rámcích se switche domnívají, že PC-1 je nyní v segmentu B na portech 2/1. - Jelikož switche ještě neví, za kterým portem je PC-4 (PC-4 zatím nic nevysílal), musejí rámec, který přijaly od druhého switche, poslat na všechny porty kromě těch ze kterých jej přijaly. Tzn. ten samý rámec vyšlou z portů 1/1. - Oba zase přijmou rámec odeslaný druhým switchem a opraví záznam v CAM (PC-1 je na portu 1/1). - Tento rámec oba zase vyšlou z portu 2/1. Přijmou rámec vyslaný druhým switchem, opraví záznam v CAM (PC-1 je na portu 2/1). - Dále se celý proces opakuje... ===== Broadcast storm ===== * vznikne odesláním L2 broadcastu do vzniklé smyčky * Broadcast se ve smyčce "točí" donekonečna ===== BPDU ===== * src.mac = mac portu switche * dst.mac = **0180.c200.0000** * defaultně se rozesílá všemi porty každé **2 s** (Hello time) Dva typy: - Configuration BPDU - Topology Chnage Notification (TCN) BPDU **Hlavička Configuration BPDU:** ^bytes^field^ Poznámka^ ^2|**Protocol ID** | vždy 0 | ^1|**Version** | vždy 0 | ^1|**Message type** | Config/TCN | ^1|**Flags** | | ^8|**Root BID** | | ^4|**Root Path Cost**| | ^8|**Sender BID** | | ^2|**Port ID** | | ^2|**Message Age** | násobky 1/256s, tzn. 0-256s | ^2|**Max.Age** | násobky 1/256s, tzn. 0-256s | ^2|**Hello Time** | násobky 1/256s, tzn. 0-256s | ^2|**Forward Delay** | násobky 1/256s, tzn. 0-256s | ===== Volba Root Bridge ===== * Root Bridge je referčním bodem pro STP topologii * Každý switch má swé //Bridge ID//, na základě kterého dochází k volbě //roota// **Bridge ID //(8 byte)//** * Bridge Prority (2 byte) - 0-65535, def.32768 (0x8000) * MAC Addr. (6 byte) - unikátní adr. backplanu nebo supervizoru, nelze měnit * - čím nižší-tím lepší * (formát 32768.aaaabbbbcccc) * Každý switch po zapnutí se domnívá, že je root * Začne rozesílat BPDU, v polích RootBID a SenderBID uvádí své BridgeID * Jakmile získá BPDU jiného switche s nižším RootBID, musí si tuto hodnotu pamatovat a posílat i ve svých BPDU v poli RootBID. * Další BPDU porovnává s nejnižší známou hodnotou, kterou si pamatuje. * Za nějaký čas se switche shodnou na jednom, který má nejnižší BID - ten je root ===== Voba Root Portu ===== * Děje se jen na **nonroot** switchích! * //root path cost// - kumulativní hodnota, celková cena cesty k rootu, přenáší se v BPDU * //path cost// - jen lokální význam, cena cesty k sousednímu switchi **Path Cost:** * 1 byte * původně počítáno lineárně **1000Mbps / bandwidth linky** * dle nových pravidel, je cost **nelineární** ^ Link Bandwidth ^ Old STP Cost ^ New STP Cost ^ |4 Mbps | 250 | 250 | |**10 Mbps** | 100 | **100** | |16 Mbps | 63 | 62 | |45 Mbps | 22 | 39 | |**100 Mbps**| 10 | **19** | |155 Mbps | 6 | 14 | |622 Mbps | 2 | 6 | |**1 Gbps** | 1 | **4** | |**10 Gbps** | 0 | **2** | **Root Path Cost** * Root bride pošle BPDU s root path cost = 0 * Jakmile nejbližší sousední switch přijme BPDU, zvedne hodnotu root path cost o cenu linky, na které BPDU přijal. * Jestliže přijde BPDU ještě z jiného portu, děje se to samé. * Porovnají se získané hodnoty, port s nejnižší hodnotou root path cost se stane **root portem** * Pak se pošle BPDU dál s novou (tou nejnižší) hodnotou root path cost. ===== Volba Designated portu ===== * Vždy jeden na síťový segment * Designated port je jediný v segmentu, který může forwardovat provoz * Designated portem se stane port switche, který v segmentu posílá BPDU s nejnižší hodnotou root path cost ===== V případě stejných hodnot rozhoduje: ===== * Nižší Root BID * Nižší Root Path Cost * Nižší Sender BID * Nižší Sender port ID ===== STP Stavy portů ===== === Disabled === * Administratevly down === Blocking === * nemůže vysílat ani příjmat * nemůže přidávat MAC adresy do CAM table * Může jen příjmat BPDU === Listening === * Do tohoto stavu přechází v případě, je pravděpodobné, že se port stane root potem nebo designated portem * nemůže vysílat ani příjmat * Může vysílat a příjmat BPDU * //Forward Delay// = **15 s** >Switch# **show spanning interface fa 0/1** Vlan Port ID Designated Port ID Name Prio.Nbr Cost Sts Cost Bridge ID Prio.Nbr ----------------- ------------- -------------- --------------------------- -------- VLAN0001 128.1 19 LIS 0 32769 000a.f40a.2980 128.1 *Mar 16 14:31:15 UTC: STP SW: Fa0/1 new learning req for 1 vlans === Learning === * Přijímá a vysílá BPDU * Přijímá rámce a plní si CAM tabulku * nemůže vysílat * //Forward Delay// = **15 s** >Switch# **show spanning interface fa 0/1** Vlan Port ID Designated Port ID Name Prio.Nbr Cost Sts Cost Bridge ID Prio.Nbr ----------------- ------------- -------------- --------------------------- -------- VLAN0001 128.1 19 LRN 0 32768 00d0.5849.4100 32.129 *Mar 16 14:31:30 UTC: STP SW: Fa0/1 new forwarding req for 1 vlans === Forwarding === * Port je plně funkční >Switch# **show spanning interface fa 0/1** Vlan Port ID Designated Port ID Name Prio.Nbr Cost Sts Cost Bridge ID Prio.Nbr ----------------- ------------- -------------- --------------------------- -------- VLAN0001 128.1 19 FWD 0 32768 00d0.5849.4100 32.129 ===== Jak ručně určit stav STP? ===== - Všem linkám určit //cost// - Určit //Root Bridge// - switch s nejnižším Bridge ID - Určit //Root porty// - 1 per switch, nejnižší root path cost - Učit //Designated porty// - 1 per segment, nejnižší root path cost, v případě shody použít rozhodovací pravidla pro STP - Určit //Blocking porty// - všechny porty, které nejsou //root// nebo //designated// ===== STP Timers ===== Konfigurují se centralizovaně (s vyjímkou TCN BPDU Hello Time) na root bridgi, protože hodnoty timerů jsou přenášeny v BPDU. Defaultní hodnoty jsou nastaveny na //network diameter// = 7, počítáno od root bridge (včetně). Změna těchto hodnot se doporučuje provádět pouze změnou //net.diameteru// na root bridgi, který si pak hodnoty přepočítá. === Hello Time === * Dle 802.1D defaultně **2 s** * časový interval mezi Conf.BPDU odesílaných root bridgem * Změna HelloTime na root bridgi se týká všech nonroot switchů, protože nonroot switche Conf.BPDU jen přeposílají. * Hello Time pro TCN BPDU se konfiguruje lokálně na jednotlivých switchích === Forward Delay === * Defaultně **15 s** * Určuje délku //Listening// a //Learning// stavů === Max Age === * Defaultně **20 s** * Každý switch si pamatuje //nejlepší// přijaté BPDU, jakmile tato BPDU přestanou přicházet, switch po čase **Max Age** toto BPDU v paměti nahradí jiným a dojde ke změně topologie. ===== Topology Changes ===== TCN BPDU * Switch ho odesílá z root portu při každé změně (link up/down), netýká se změn na portech konfigurovaných jako **portfast** * Neobsahuje žádné informace, slouží jen k informaci o tom že došlo ke změně * TCN BPDU jsou odesílány v intervalech Hello Time, dokud nejsou potvrzeny sousedním switchem ACK BPDU, který je stejným způsobem propaguje dál směrem k rootu. * Jakmile root přijme TCN také ho potvrdí, následně všem rozešle Config.BPDU s nastaveným flagem Topology Change. * Díky tomu všechny switche zkrátí platnost CAM tabulky z def.300 s na Forward Delay 15 s. TCN BPDU ^byes^field^ ^ |2|Protocol ID|vždy 0| |1|Version|vždy 0| |1|Message Type| | === Direct Topology Changes === (link down) - Switch C a switch A detekují na svých portech(1/1 a 1/2) pád linky. - Switch C zahodí "best BPDU", které měl v paměti, protože BPDU bylo přijato portem, který nyní spadl. Běžně by se switch pokusil odeslat TCN z root portu, v tomto případě však root port spadl. V případě switche A se TCN neodesílá, protože switch je root bridge. - Root bridge, switch A, rozešle Config.BPDU s nastaveným TCN flagem. - Switche B a C po přijetí tohoto BPDU zkrátí platnost CAM tabulek na dobu Forward delay (15s). - Switch C přijal BPDU na portu 1/2, který byl dosud blokován, přijaté BPDU je v tuto chvíli nejlepší => port se stane novým root portem a přejde do stavu forwarding. {{:wiki:site:cisco:7-6.png|}} * U switchů A a B nedochází během konvergence k žádným změnám stavů portů, změna se týká pouze switche C * Ztráta konektivity hostů switche C, trvá dobu, kterou port 1/2 prochází stavy Listening a Learning, tedy celkem **30 sec**. === Indirect Topology Changes === (link up, but no data can pass between switches) - Switch A i C mají linku up, linkou však neprochází data a ani BPDU - Nedošlo k chybě linky, neposílá se žádné TCN. - Switch C má v paměti "best BPDU", které předtím přijal z portu 1/1. Nyní však tímto portem žádné BPDU nepřichází a po vypršení času Max Age toto "best BPDU" není platné a je z paměti vymazáno. - Dříve nebo později je přijato BPDU na portu 1/2, které je nyní nejlepší přijaté. Port 1/2 se stane root portem a přejde ze stavu Blocking přes Listening a Learning do stavu Forwarding. {{:wiki:site:cisco:7-7.png|}} * Hosti switche C v tomto případě ztratí konektivitu na čas Max Age (20s) + čas než dorazí další BPDU (2 s) + čas, který portu 1/2 trvá přechod do stavu forwarding (15 + 15 s) => celkem cca **52 sec**. === Insignificant Topology Changes === (access port up/down) - PC na portu 2/12 někdo vypne, switch detekuje pád linky. - Switch C začne posílat TCN BPDU směrem k rootovi (portem 1/1) - Root bridge jej potvrdí TCN ACK a pak rozešle Config.BPDU s TCN flagem. - Toto BPDU způsobí, že switch B a C zkrátí platnost svých CAM tabulek, v tabulkách zůstanou záznamy jen aktivních spojení. Zkrácená platnost tabulek trvá po dobu Forward delay + Max age. {{:wiki:site:cisco:7-8.png|}} * Jedná se jen o kosmetický problém a je třeba zvážit důsledky ve větší síti s mnoha PC, kde je zapínání a vypínání PC běžné. Časté mazání a zkracování platnosti CAM záznamů způsobuje nárůst broadcastového provozu. * Předejít se tomu dá nastavením portů pro hosty jako **Portfast** ====== Typy STP ====== ===== CST Common Spanning Tree ===== * IEEE 802.1Q - specifikuje jak jsou vlany přenášeny v trunku mezi switchi a zároveň specifikuje single instanci STP, která zahrnuje všechny VLANy. * Tato instance STP je nazývána CST Common Spanning Tree. * CST BPDU jsou přenášena v nativní VLAN a v netagovaných rámcích. * Jedna instance STP pro všechny VLANy je výhodná z hlediska konfigurace a zátěže CPU. * Záložní linky mezi switchi však jsou blokovány a jsou nevyužité. ===== PVST Per-VLAN Spanning Tree ===== //(Cisco)// * Pro každou VLAN zvláštní instance STP. * STP pro každou VLAN lze konfigurovat samostatně. * Umožňuje load balancing po záložních linkách (některé vlany jdou jednou cestou a ostaní druhou cestou) * Jelikož se jedná o proprietární prot., vyžaduje na truncích enkapsulaci ISL. * Není kompatibilní s CST, nedochází k výměnám BPDU. ===== PVST+ Per-VLAN Spanning Tree Plus ===== //(Cisco)// * Kompatibilní s CST i PVST. * PVST+ může sloužit jako překladač mezi CST a PVST. * S PVST komunikuje prostřednictvím ISL trunků, s CST si vyměňuje BPDU v netagovaných rámcích v nativní VLAN. * BPDU jiných instancí PVST+ jsou skrz část sítě s CST tunelována. Posílají se se speciální (mcast) cílovou MAC adresou, která CST switche nezajímá, avšak dorazí-li k PVST+ switchi, ten BPDU zpracuje. ====== Konfigurace STP ====== Defaultně - STP zapnuto. >Switch(config)# [**no**] **spanning-tree vlan** //vlan-id// >Switch(config-if)# [**no**] **spanning-tree vlan** //vlan-id// ===== STP Root Bridge ===== Root Bridge by měl být výkonný switch v centru L2 sítě. Nejlépe v distribuční vrstvě nebo blízko serverové farmy. Vždy je potřeba ručně nakonfigurovat root bridge a secondary root bridge, aby se předešlo nečekaným stavům. **Bridge ID** * Standartní dle 802.1D - 16 bitů bridge priority + MAC adr.VLAN * Rozšířené dle 802.1t - 4 bity priorita (0-61440 násobky 4096) + 12 bitů VLAN ID + MAC adr.VLAN Jestliže switch nepodporuje 1024 MAC adres pro vnitřní použití, je defaultně použito rozšířené bridge ID. V opačném případě je def. použito standartní Bridge ID. >Switch(config)# [**no**] **spanning-tree extended system-id** __Ručně:__ >Switch(config)# **spanning-tree vlan** //vlan-list// **priority** //bridge-priority// //Bridge priority:// * Standartně : 0-65535, def.32768 * Extended Sysem ID: 0-61440 (násobky 4096), def.32768 __Pomocí makra:__ >Switch(config)# **spanning-tree vlan** //vlan-id// **root** {**primary** | **secondary**} [**diameter** //diameter//] * makro přihlídne k aktuálním hodnotám v síti ve chvíli kdy je spuštěno, avšak nezaručí, že se switch stane rootem, popř. že si tento status udrží. * jelikož se jedná o makro, není vidět ve výpisu konfigurace switche * **primary** je-li aktuální priorita roota větší než 24576 switch si nastaví tuto prioritu, jeli priorita roota menší, switch si nastaví o 4096 nižší bridge prioritu (kromě nuly, tu je třeba nastavit ručně). * **secondary** - bridge priority se nastaví na 28672, spoléhá se to na to, že všechny switche jsou v defaultu, je to z důvodu, že další secondary root nelze zjistit, protože neposílá žádná BPDU. Switch(config)# spanning-tree vlan 1 root primary vlan 1 bridge priority set to 24576 vlan 1 bridge max aging time unchanged at 20 vlan 1 bridge hello time unchanged at 2 vlan 1 bridge forward delay unchanged at 15 __Příklad:__ * Switch A je root a má ve VLAN 100 prioritu 4200 * Switch B je v defaultu a používá extended sytem id - ve VLAN 100 má prioritu 32768+100=32868 >Switch_B(config)# **spanning-tree vlan 100 root primary** Tímto příkazem se nám nepodaří udělat ze switche B roota, protože pokud si má nastavit o 4096 nižší prioritu, musel by si nastavit 104 - což není násobek 4096, jediná zbývající možnost by byla nula, tu ale nelze nastavit pomocí makra - musí se zadat ručně: >Switch_B(config)# **spanning-tree vlan 100 priority 0** Nyní je priorita switche B 0+100=100. ===== Root Path Cost ===== * kumulativní hodnota všech hodnot cost po cestě k rootu * lze ovlivnit nastavením cost jednotlivých portů >Switch(config-if)# **spanning-tree** [**vlan** //vlan-id//] **cost** //cost(1-65535)// >Switch# **show spanning-tree interface** //type mod/num// [**cost**] Vlan Role Sts Cost Prio.Nbr Type ----------------- ---- --- ---------- -------- ----------------------------- VLAN0001 Root FWD 4 128.1 P2p VLAN0010 Desg FWD 4 128.1 P2p VLAN0020 Root FWD 4 128.1 P2p ===== Port ID ===== * 16 bitů = 8 bitů priorita + 8 bitů port number * Port priority = **0-255**, defaultně **128** * Port number = 0-255, na "nemodulárním" switchi odpovídá č.portu (fa 0/10 = 10), na modulárním switchi nebo v portchannelu už není odvoditelné. >Switch(config-if)# **spanning-tree** [**vlan** //vlan-list//] **port-priority** //port-priority// >Switch# **show spanning-tree interface** //type mod/num// ===== STP Timers ===== * **Nastavovat jen na ROOTOVI !!!** - časy se pomocí BPDU vypropagují do ostatních switchů * timery lze konfigurovat globálně (vynecháním parametru **vlan**) nebo pro konkrétní VLANy (instance STP) __Manuální konfigurace:__ >Switch(config)# **spanning-tree** [**vlan** //vlan-id//] **hello-time** //seconds(1-10,def.2)// >Switch(config)# **spanning-tree** [**vlan** //vlan-id//] **forward-time** //seconds(4-30,def.15)// >Switch(config)# **spanning-tree** [**vlan** //vlan-id//] **max-age** //seconds(6-40,def.20)// __Automatická konfigurace pomocí makra:__ >Switch(config)# **spanning-tree vlan** //vlan-list// **root** {**primary** | **secondary**} [**diameter** //diameter// [**hello-time** //hello-time//]] * //hello-time// je nepovinný, při neuvedení se použijí def.2s ze kterých se dopočítají zbylé timery pro zadaný //diameter// ===== PortFast ===== //(Cisco)// * zajišťuje **rychlou** konektivitu pro PC na access layer switchi * Stadartně portu trvá až 50s (30s STP + 20s PaGP) než přejde do stavu Forwarding po připojení PC * Na portech, kde je jen jedno zařízení (PC) je riziko vzniku smyčky malé * PortFast zajistí okamžitý přechod ze stavu Blocking do Forwarding (vynechají se stavy Listening a Learning) * Detekce smyček na portu však nadále probíhá a při vzniku smyčky port přejde do stavu Blocking * TCN BPDU se neposílají při změně stavu portu (up/down)! __Globální konfigurace:__ >Switch(config)# **spanning-tree portfast default** __Konfigurace per-interface:__ >Switch(config-if)# [**no**] **spanning-tree portfast** __Makro pro access port:__ * zapne na portu PortFast * nastaví port jako access * vypne na portu PaGP >Switch(config-if)# **switchport host** Switch(config-if)# switchport host switchport mode will be set to access spanning-tree portfast will be enabled channel group will be disabled >Switch# **show spanning-tree interface** //type mod/num// **portfast** Switch# show spanning-tree interface fastethernet 0/1 portfast VLAN0010 enabled ===== UplinkFast ===== //(Cisco)// * Slouží ke zrychlení zvednutí záložního uplinku na access switchích * Spadne-li na access switchi uplink (root port), zvednutí záložního běžně trvá až 50s, po celou tuto dobu je switch a jeho klienti odříznut od sítě. * Je-li záložních uplinků více, je okamžitě zvednut ten s nejnižší root path cost * Z principu své funkce nelze použít na Root Bridgi * Po zapnutí funguje pro celý switch a všechny VLANy * Zvednutím bridge priority na **49152** zajišťuje, aby se switch nemohl stát rootem * Port cost všech portů je zvednuta o **3000**, tím se zajistí, že porty budou znevýhodněny ve výpočtu root path cost pro níže připojené switche. * UplinkFast poskytuje mechanismus, který zajistí rychlý update CAM tabulky nadřazeného switche po změně uplinku. Posílá rámce s cílovou mcast adresou **0100.0ccd.cdcd** a do pole zdrojové adresy dosazuje adresy ze své CAM tabulky. Parametr **max-update-rate** udává počet paketů (pps) za sekundu. Defaultně je to 150pps, je-li nastavena 0 nic se neposílá. >Switch(config)# **spanning-tree uplinkfast** [**max-update-rate** //pkts-per-second(0-65535,def.150)//] >Switch# **show spanning-tree uplinkfast** Switch# show spanning-tree uplinkfast UplinkFast is enabled Station update rate set to 150 packets/sec. UplinkFast statistics Number of transitions via uplinkFast (all VLANs) : 2 Number of proxy multicast addresses transmitted (all VLANs) : 52 Name Interface List --------------------- -------------------------------- VLAN0001 Gi0/1(fwd) VLAN0010 Gi0/1(fwd) VLAN0100 Gi0/1(fwd) ===== BackboneFast ===== //(Cisco)// * Switch aktivně zjišťuje alternativní cesty k rootovi při detekci //indirect link failure// * //indirect link failure// je detekováno přijetím //slabšího (inferior)// BPDU na root portu nebo Blocked portu * Toto BPDU je rozesláno switchem, který ztratil kontakt s rootem a inzeruje v něm sebe jako roota. * Běžně switch musí čekat po dobu Max Age, než může takové BPDU akceptovat. * Je-li //slabší// BPDU přijato Blocked portem, je port zvolen rootem a ostatní Blocked porty jsou považovány za alternativní cesty k rootu. * Je-li //slabší// BPDU přijato Root portem, všechny Blocked porty jsou považovány za alternativní cesty k rootu. * Je-li //slabší// BPDU přijato Root portem, a na switchi není žádný Blocked port, switch usoudí že ztratil konektivitu s rootem. V tomto případě se switch snaží stát Root Bridgem. RLQ - Root Link Query protocol * je použit v případě že switch má nějaké Blocked porty * slouží ke zjištění zda upstream switche mají spojení s rootem * switch pošle RLQ Request * RLQ Request, je propagován sítí, je-li příjemcem root bridge nebo switch, který nemá spojení s rootem, odpoví zprávou RLQ Reply. * Jestliže RLQ Reply je přijato na root portu - je spojení s rootem OK. * Jestliže RLQ Reply je přijato nonroot portem, musí být zvolena alternativní cesta k rootu - max age timer okamžitě expiruje, aby mohl být vybrán nový root port. * Celá pointa BackboneFast spočívá jen ve zkrácení doby rekonvergence při zjištění problému s cestou k rootu. * Toho je dosaženo okamžitou expirací max Age timeru při zjištění chyby * Celkově lze tedy rekonvergence dosáhnout během **30s** (Listenning + Learnning) místo původních 50s (MaxAge + Listenning + Learning) * BackboneFast je defaultně vypnuto, v případě implementace, je nutné jej zapnout na __všech__ switchích v síti (z důvodu použití RLQ). >Switch(config)# **spanning-tree backbonefast** >Switch# **show spanning-tree backbonefast** Switch# show spanning-tree backbonefast BackboneFast is enabled ====== Monitoring STP ====== >Switch# **show spanning-tree** [**detail**] >Switch# **show spanning-tree** **vlan** //vlan-id// >Switch# **show spanning-tree** [**vlan** //vlan-id//] **summary** >Switch# **show spanning-tree** [**vlan** //vlan-id//] **root** >Switch# **show spanning-tree** [**vlan** //vlan-id//] **bridge** >Switch# **show spanning-tree bridge brief** >Switch# **show spanning-tree interface** //type mod/num// [**detail**] >Switch# **show spanning-tree uplinkfast** >Switch# **show spanning-tree backbonefast** ====== Protecting STP topology ====== {{:wiki:site:cisco:9-1.png|}} ===== Root Guard ===== * slouží k obraně před podvržením roota (připojení switche s nižší bridge priority) * měl by se zapnout na všech portech, kde za žádných okolností nebude root * jakmile jsou na portu se zapnutým Root Guardem přijímána tzv. //superior (lepší)// BPDU, port přejde do stavu **root-inconsistent**. Port nepropouští žádná data, může přenášet BPDU, nemůže je však zvenčí přijímat. Port se nemůže stát root portem. * jakmile přestanou přicházet //superior// BPDU, port přejde běžnými STP stavy do stavu forwarding * Pozor, RootGuard nerozlišuje VLANy, přijde-li //superior// BPDU, provoz na portu je blokován pro všechny VLANy. >Switch(config-if)# **spanning-tree guard root** >Switch# **show spanning-tree inconsistentports** ===== BPDU Guard ===== * Ochrana před příjmem nežádoucích BPDU * Obvykle se zapíná na PortFast portech na access switchích * po přijetí BPDU port přejde do stavu **err-disabled** a je vypnut, zvednout ho lze ručně pomocí **shut/no shut** nebo automaticky pomocí //errdisable timeout funkce// * BPDU Guard má zabránit potížím s připojením nežádoucího switche (změna topologie STP, možnost vzniku smyčky) * BPDU Guard neumí zabránit vzniku smyčky připojením hubu do dvou různých míst v síti, kde neběží STP Globální konfigurace: >Switch(config)# **spanning-tree portfast bpduguard default** * projeví se na všech PortFast portech Per-port konfigurace: >Switch(config-if)# [**no**] **spanning-tree bpduguard enable** >Switch# **show spanning-tree summary** >Switch# **show spanning-tree summary totals** ===== Loop Guard ===== * Ochrana proti náhlé ztrátě příjmu BPDU * Blocking port setrvává ve stavu Blocking dokud na něj chodí BPDU, jakmile se příjem BPDU přeruší port čeká dobu Max Age pak začne přecházet do stavu Forwarding, protože se domnívá, že vznik smyčky nehrozí a že na protějším konci linky není STP zařízení - toto může být příčinou vzniku smyčky! * LoopGuard sleduje příjem BPDU na nondesignated (blocking/alternate) portech, jakmile je přerušen příjem BPDU, LoopGuard uvede port do stavu **loop-inconsistent**, provoz je stále blokován. * Jakmile se příjem BPDU obnoví, LoopGuard nechá port projít běžnými STP stavy. Globální konfigurace: >Switch(config)# **spanning-tree loopguard default** Per-port konfigurace: >Switch(config-if)# [**no**] **spanning-tree guard loop** * Loop Guard funguje per-VLAN * Lze jej aktivovat globálně bez ohledu na funkce portů >Switch# **show spanning-tree summary** ===== UDLD ===== //(Cisco)// UniDirectional Link Detection Jednosměrný spoj: * nejpravděpodobnější výskyt na optických propojích, chyba GBIC, SFP nebo přerušení vlákna * nebezpečné pro STP, v případě, že Blocking port přestane přijímat BPDU, začne přecházet do stavu Forwarding a vznikne smyčka UDLD: * sleduje zda je linka opravdu //obousměrná// * switch posílá svému protějšku speciální L2 UDLD rámce obsahující identifikaci svého portu a očekává odpověď s identifikací protějšího portu * musí být nakonfigurováno na obou koncích sledované linky, jinak nejsou odesílány odpovědi * Porty na obou koncích posílají svá echa nezávisle, na lince běží tedy jakoby dva procesy UDLD * Echa jsou posílána v konfigurovatelných intervalech - def. **15 sec**, cílem je, aby UDLD stihlo zasáhnout dříve než port stihne přejít z blocking do forwarding stavu => celkový čas detekce jednosměrnosti musí být menší než Max Age + 2x Forwarding Delay tedy 50 sec. * UDLD detekuje jednosměrnest až po třetím echu bez odpovědi, defaultně tedy po **45 sec** * Jelikož každý switch si posílá vlastní echa, může být message time na obou koncích různý a UDLD bude fungovat normálně! **Normal mode** - po detekci jednosměrnosti není funkce portu omezena, port je označen jako **undetermined state** a je vygenerována syslog zpráva **Aggressive mode** - po detekci jednosměrnosti se switch pokusí ještě linku "profouknout", začne posílat echo každou sekundu po dobu 8s, nepřijde-li ani jedna odpověď, port přejde do stavu **errdisabled** __Globální konfigurace:__ * zapne se na všech optických portech * message time: * na Cat 3550 = def. 7sec * na Cat 4500 a 6500 = def. 15sec >Switch(config)# **udld** {**enable** | **aggressive** | **message time** //seconds(7-90,def.7 or 15)//} __Per-port konfigurace:__ * lze zapnout i na běžných portech * lze použít k vypnutí UDLD na konkrétních optických portech, je-li použita globální konfigurace >Switch(config-if)# **udld** {**enable** | **aggressive** | **disable**} __První konfigurace:__ * Je-li UDLD konfigurováno v běžící síti, může vzniknout obava, co se stane když ho zapnu na jednom konci a na druhém ještě není nakonfigurováno. * Tato situace je ošetřena tak, že UDLD při první konfiguraci nemá žádné informace o svém sousedovi, posílá tedy echa a čeká na odpověď * dokud není UDLD zapnuto na protějším konci, odpovědi na echa nepřichází * v tomto případě linka nespadne * UDLD začne řešit stav linky až po té co je nakonfigurováno na obou koncích __UDLD v EtherChannelu:__ * echa jsou odeílánána v jednolivích linkách channelu * UDLD tedy k portům přistupuje jednotlivě, tzn. neshodí celý EtherChannel, ale jen konkrétní linku >Switch# **show udld interface** //type mod/num// >Switch# **udld reset** ===== BPDU Filter ===== * Slouží k vypnutí STP na portu * Port nepřijímá a ani nevysílá BPDU * Jakmile na port přijde BPDU, port přestane být portfast * (při zvedání portu pár BPDU odejde = ochrana proti propojení dvou switchů s BPDU Filter) * Lze konfigurovat globálně nebo per-interface * Globální konfigurace zapne BPDU Filter na všech PortFast portech >Switch(config)# **spanning-tree bpdufilter default** >Switch(config-if)# **spanning-tree bpdufilter** {**enable** | **disable**} >Switch# **show spanning-tree summary**