English · Ελληνικά
Τα εφεδρικά links είναι ένας βρόχος που περιμένει να συμβεί — οπότε το spanning tree κλείνει το ένα, και η μισή σου bandwidth κοιμάται. Κατάλαβε την εκλογή, διάλεξε το root bridge σου σκόπιμα, πέρνα σε Rapid PVST+, και μετά συνένωσε αυτά τα εφεδρικά links σε ένα EtherChannel που τα χρησιμοποιεί όλα.
Σύνδεσε δύο switch μεταξύ τους δύο φορές — για εφεδρεία — και χωρίς προστασία έχτισες ένα bridging loop: τα ethernet frames δεν έχουν TTL, οπότε ένα broadcast κυκλοφορεί για πάντα, πολλαπλασιαζόμενο μέχρι και τα δύο switch να λιώσουν στο 100% CPU. Αυτό είναι broadcast storm, και ρίχνει δίκτυα σε δευτερόλεπτα. Το spanning tree (STP) είναι το ανοσοποιητικό σύστημα: τα switch εκλέγουν ένα root bridge, υπολογίζουν το συντομότερο δέντρο χωρίς βρόχους, και σκόπιμα κλείνουν κάθε εφεδρική διαδρομή. Βρόχοι αποτρέπονται — αλλά τα κλειστά links δεν κουβαλάνε τίποτα.
Αυτό είναι το trade-off που λύνει αυτό το post. Πρώτα, κατάλαβε και έλεγξε το STP: αν δεν διαλέξεις εσύ το root bridge, το διαλέγει το δίκτυο για σένα — συνήθως το παλιότερο, πιο αργό switch στο κτίριο. Μετά διεκδίκησε πίσω τη χαμένη bandwidth: το EtherChannel συνενώνει παράλληλα links σε ένα λογικό interface που το STP αντιμετωπίζει σαν μονοπάτι, οπότε όλα τα μέλη προωθούν ταυτόχρονα. Εφεδρεία και ρυθμαπόδοση — έτσι πρέπει να χτίζονται τα uplinks switch.
01
Τα πάντα στο spanning tree πηγάζουν από μία επιλογή: το root bridge. Κάθε switch μετράει την απόστασή του από το root, κρατάει την καλύτερή του διαδρομή, και κλείνει τις υπόλοιπες. Η εκλογή κερδίζεται από το χαμηλότερο bridge ID — πρώτα priority, μετά διεύθυνση MAC.
SW1# show spanning-tree vlan 10 VLAN0010 Spanning tree enabled protocol rstp Root ID Priority 24586 Address 0cd0.f894.1a00 Cost 4 Port 24 (GigabitEthernet0/24) ← ο δρόμος μου προς το root Bridge ID Priority 32778 (priority 32768 sys-id-ext 10) Address 70b3.d5aa.2c00 ← το δικό αυτού του switch ID Interface Role Sts Cost Prio.Nbr Type Gi0/1 Desg FWD 4 128.1 P2p Edge Gi0/23 Altn BLK 4 128.23 P2p ← η κλειστή εφεδρεία Gi0/24 Root FWD 4 128.24 P2p
Διάβασέ το από πάνω προς τα κάτω: το block Root ID ονομάζει το εκλεγμένο root και το κόστος μου για να το φτάσω· το block Bridge ID είμαι εγώ. Αν τα δύο block δείχνουν την ίδια διεύθυνση, αυτό το switch είναι το root. Παρακάτω, κάθε θύρα έχει έναν ρόλο: Root (η καλύτερή μου διαδρομή προς το root), Desg (designated — προωθεί για το τμήμα της), Altn BLK (ο σπαστής βρόχων, παρκαρισμένος σε blocking). Μία κλειστή θύρα ανά εφεδρικό βρόχο είναι το spanning tree να δουλεύει ακριβώς όπως σχεδιάστηκε.
Κάθε switch έχει default priority 32768, οπότε η εκλογή λύνεται με ισοπαλία στη χαμηλότερη διεύθυνση MAC — που συνήθως ανήκει στο παλιότερο switch στο κτίριο. Αποτέλεσμα: ένα δεκάχρονο access switch κάτω από ένα γραφείο γίνεται root, και όλη η inter-VLAN κίνηση περνάει hairpin μέσα από αυτό. Αν δεν έχεις ορίσει ποτέ priority, αυτή είναι η τοπολογία σου αυτή τη στιγμή. Έλεγξε με show spanning-tree root — αν το root δεν είναι το core σου, διόρθωσέ το στην ενότητα 02.
02
Το root bridge πρέπει να είναι το core switch σου — η συσκευή στη μέση των μοτίβων κίνησης. Μία εντολή ανά VLAN το καρφώνει, και μία δεύτερη ονομάζει το backup.
# Ο ευανάγνωστος τρόπος: το "primary" βάζει priority αρκετά χαμηλό για να κερδίσει (24576 ή χαμηλότερα) CORE(config)# spanning-tree vlan 10,20,99 root primary # Στο δεύτερο καλύτερο switch — το designated backup root: DIST(config)# spanning-tree vlan 10,20,99 root secondary # Ή όρισε τον αριθμό ρητά (πρέπει να είναι πολλαπλάσιο του 4096): CORE(config)# spanning-tree vlan 10 priority 24576 # Επαλήθευσε ότι το core τώρα κερδίζει: CORE# show spanning-tree vlan 10 | include This bridge is the root This bridge is the root
Η Cisco τρέχει ένα instance spanning-tree ανά VLAN (PVST+/Rapid PVST+), γι' αυτό κάθε εντολή παίρνει λίστα VLAN — και γι' αυτό ένα priority εμφανίζεται ως 32778 για το VLAN 10: το VLAN ID προστίθεται στο base priority (32768 + 10) ως το "sys-id-ext". Τα δέντρα ανά VLAN σημαίνουν επίσης ότι μπορείς να κάνεις ένα switch root για τα VLAN 10–20 και ένα άλλο για τα 30–40, μοιράζοντας το φορτίο σε δύο uplinks που αλλιώς θα κάθονταν μισο-κλειστά. Αυτό είναι δωρεάν βελτιστοποίηση σε κάθε σχεδιασμό dual-core.
03
Το κλασικό STP παίρνει 30–50 δευτερόλεπτα για να συγκλίνει μετά από αστοχία. Το Rapid PVST+ το κάνει σε περίπου ένα δευτερόλεπτο, με τις ίδιες εντολές που ήδη ξέρεις. Στα σύγχρονα Catalyst είναι συνήθως το default — αλλά επαλήθευσε, μην το υποθέτεις.
# Μία global εντολή, σε ΚΑΘΕ switch: SW1(config)# spanning-tree mode rapid-pvst SW1(config)# end # Επιβεβαίωσε — "protocol rstp" στην κεφαλίδα σημαίνει ότι το rapid είναι ενεργό: SW1# show spanning-tree summary | include mode Switch is in rapid-pvst mode # Και τα default PortFast/BPDU-guard από το post Ασφάλεια Switch: SW1(config)# spanning-tree portfast bpduguard default
Το Rapid PVST+ συνεργάζεται με το παλιό STP — ένα legacy switch στο δίκτυο σέρνει σιωπηλά αυτό το τμήμα πίσω σε αργά timers. Κάνε migrate τα πάντα, μετά επαλήθευσε ανά switch. Και το ζευγάρι PortFast + BPDU guard από το post Ασφάλεια Switch τώρα βγάζει πλήρες νόημα: το PortFast λέει στο STP «αυτή είναι θύρα host, παράλειψε την αναμονή listening/learning», και το BPDU guard επιβάλλει αυτή την υπόσχεση σκοτώνοντας τη θύρα αν εμφανιστεί ποτέ ένα switch εκεί.
04
Δύο ή τέσσερα παράλληλα links ανάμεσα στο ίδιο ζευγάρι switch, ένα λογικό interface. Το STP βλέπει ένα μοναδικό link οπότε τίποτα δεν κλείνει· η κίνηση κάνει hash σε όλα τα μέλη· ο θάνατος ενός μέλους είναι αόρατος στην τοπολογία.
# Διάλεξε τις θύρες-μέλη — πρέπει να είναι ΤΑΥΤΟΣΗΜΕΣ (speed, duplex, mode, VLAN) SW-A(config)# interface range GigabitEthernet0/23 - 24 SW-A(config-if-range)# channel-group 1 mode active # active = ξεκίνα LACP Creating a port-channel interface Port-channel 1 SW-A(config-if-range)# exit # Ρύθμισε το BUNDLE, όχι τα μέλη — οι ρυθμίσεις trunk πάνε εδώ: SW-A(config)# interface Port-channel1 SW-A(config-if)# switchport mode trunk SW-A(config-if)# switchport trunk native vlan 99 SW-A(config-if)# switchport trunk allowed vlan 10,20,99 SW-A(config-if)# end # SW-B: ακριβώς το ίδιο block. Το "active" και στις δύο πλευρές είναι το καθαρό pattern. # (mode on = static bundle, χωρίς πρωτόκολλο — μόνο αν μια συσκευή δεν μιλάει LACP.) SW-A# show etherchannel summary Flags: P - bundled in port-channel S - Layer2 U - in use Group Port-channel Protocol Ports ------+-------------+-----------+---------------------------- 1 Po1(SU) LACP Gi0/23(P) Gi0/24(P) # (SU) και κάθε μέλος (P) = υγιές. Μέλη (SD) ή (s) = δες την παγίδα.
Κάθε θύρα-μέλος πρέπει να ταιριάζει ακριβώς — speed, duplex, switchport mode, allowed VLAN, native VLAN. Μία ασυμφωνία και αυτό το μέλος δείχνει (s) suspended στο show etherchannel summary ενώ τα υπόλοιπα συνεχίζουν: πλήρωσες σιωπηλά για τέσσερα links και τρέχεις σε τρία. Χειρότερο: το mode on (static) στη μια πλευρά με LACP στην άλλη φτιάχνει ένα bundle που φαίνεται up αλλά μπορεί να κάνει loop ή blackhole, γιατί η μία πλευρά δεν ελέγχει τίποτα. Κανόνας: active/active με LACP, ρύθμισε μέσω του interface Port-channel, και διάβασε τα flags μετά από κάθε αλλαγή.
Το EtherChannel κάνει load-balance με hashing (src/dst MAC ή IP), οπότε κάθε ροή κολλάει σε ένα μέλος-link. Ένα bundle 4×1G σου δίνει 4 Gbps συνολικής χωρητικότητας, όχι έναν σωλήνα 4 Gbps για μία μεμονωμένη δουλειά backup — μία ροή ακόμα κορυφώνει στο 1G. Αυτό είναι το σωστό trade-off για uplinks switch που κουβαλάνε κίνηση πολλών χρηστών, αλλά αν μια μεμονωμένη μεταφορά server-προς-server χρειάζεται περισσότερο από ένα link-μέλος, χρειάζεσαι ένα πιο γρήγορο link, όχι ένα πιο φαρδύ bundle. Έλεγξε το hash με show etherchannel load-balance· το src-dst-ip απλώνει καλύτερα στα περισσότερα δίκτυα.
05
Τα επαναλαμβανόμενα ερωτήματα: ποιος είναι root, γιατί αυτή η θύρα είναι blocking, γιατί άλλαξε μόλις η τοπολογία, και είναι υγιές το bundle.
| Εντολη | Απανταει |
|---|---|
| show spanning-tree root | Root bridge, το priority του, και το κόστος/θύρα μου προς αυτό — ανά VLAN. |
| show spanning-tree vlan 10 | Ολόκληρο το δέντρο για ένα VLAN: ρόλοι, καταστάσεις, ποιος κλείνει. |
| show spanning-tree summary | Mode (rapid-pvst), default PortFast/BPDU-guard, μετρητές κλειστών θυρών. |
| show spanning-tree detail | include ieee|occurr | Πότε και από πού ήρθε η τελευταία αλλαγή τοπολογίας — ο ανιχνευτής flapping-port. |
| show etherchannel summary | Υγεία του bundle με μια ματιά — (SU) καλά, (SD)/(s) χαλασμένα. |
| show etherchannel load-balance | Η μέθοδος hashing σε χρήση. |
| show lacp neighbor | Επιβεβαιώνει ότι η άλλη πλευρά όντως μιλάει LACP. |
# Οι χρήστες αναφέρουν τυχαία παγώματα 1 δευτερολέπτου. Υποψιάζεσαι αλλαγές τοπολογίας STP: CORE# show spanning-tree vlan 10 detail | include occurr Number of topology changes 4817 last change occurred 00:00:41 ago from GigabitEthernet0/14 # 4817 αλλαγές και ανεβαίνουν, όλες από το Gi0/14 — ένα flapping link ή μια θύρα # host χωρίς PortFast που πηγαινοέρχεται. Διόρθωση: portfast στις θύρες host (οι edge θύρες # δεν παράγουν αλλαγές τοπολογίας), και έλεγξε την καλωδίωση του Gi0/14.
06
Τα bridge του RouterOS τρέχουν κι αυτά (R)STP, και το bonding είναι το EtherChannel του. Οι έννοιες περνάνε κατευθείαν.
| MikroTik / RouterOS | Cisco IOS |
|---|---|
| bridge protocol-mode=rstp | spanning-tree mode rapid-pvst |
| bridge priority=0x6000 | spanning-tree vlan X priority 24576 |
| Ένα δέντρο ανά bridge | Ένα δέντρο ανά VLAN (PVST+) — πιο λεπτός έλεγχος, περισσότερα να ελέγξεις |
| bridge port edge=yes | spanning-tree portfast |
| bridge port bpdu-guard=yes | spanning-tree bpduguard enable |
| /interface bonding mode=802.3ad | EtherChannel channel-group N mode active (LACP) |
| transmit-hash-policy=layer-2-and-3 | port-channel load-balance src-dst-ip |
Συμπερασματα
show spanning-tree είναι χαρακτηριστικό.spanning-tree vlan X root primary στο core, secondary στο backup του, επαλήθευσε με show spanning-tree root.active και στις δύο πλευρές, πάντα.show etherchannel summary μετά από κάθε αλλαγή.Το root bridge πρέπει να είναι απόφαση, όχι ό,τι έτυχε να εκλέξει το STP. Σχεδιάζω τοπολογίες switch όπου αυτό διαλέγεται σκόπιμα, τα uplinks είναι σωστά συνενωμένα, και το failover δοκιμάζεται τραβώντας ένα καλώδιο — όχι υποτίθεται από ένα διάγραμμα.
Κλεισε μια Discovery Call →