June 2, 2026
Network Pusulası #7 — STP: Switch’leri Döngüden Kurtaran Protokol ve Root Hijacking Saldırısı
Ağ tasarımında ilginç bir paradoks vardır: yedeklilik ve döngü aynı madalyonun iki yüzüdür. Switch’leri birbirine birden fazla yoldan…
Toprak Külekçioğlu
7 min read
Ağ tasarımında ilginç bir paradoks vardır: yedeklilik ve döngü aynı madalyonun iki yüzüdür. Switch'leri birbirine birden fazla yoldan bağlamak istersin (biri kopsa diğeri çalışsın diye), ama bunu yaptığın anda istemeden bir döngü yaratırsın. Ve switch'lerin döngüye düşmesi, ağın çökmesi anlamına gelir.
İşte STP (Spanning Tree Protocol) tam bu paradoksu çözmek için var. Bu yazıda STP'nin nasıl çalıştığını, BPDU denen sihirli mesajları, root bridge'i nasıl seçtiğini ve sonunda da bu mekanizmanın saldırgan tarafından nasıl ele geçirilebileceğini göreceğiz.
Bir önceki yazıda Switch Spoofing'i konuşmuştuk; saldırganın DTP ile port'u trunk'a çevirip bütün VLAN'lara sızmasını anlatmıştık. Bu yazı onun kardeşi — saldırgan benzer bir mantıkla STP'yi de kandırıp ağın merkezine oturabiliyor.
Önce Şu Sorunu Görmemiz Lazım
Bir senaryo kuralım. Bir kurumda üç switch var, hepsi birbirine bağlı, çünkü yedeklilik istiyoruz:
SWITCH A ─────── SWITCH B
│ │
│ │
└─── SWITCH C ─┘SWITCH A ─────── SWITCH B
│ │
│ │
└─── SWITCH C ─┘Üçgen şeklinde bir topoloji. Bir bağlantı koparsa diğer iki bağlantı üzerinden trafik akmaya devam eder. Mantıklı bir tasarım.
Ama bir bilgisayar broadcast frame gönderse ne olur? Switch'in temel kuralını hatırla: hedefi bilmediği frame'leri tüm portlara dağıtır. Yani Switch A frame'i alır, B ve C'ye yollar. B aldığı frame'i A ve C'ye yollar. C aldığı frame'i A ve B'ye yollar. Sonsuz döngü başlar. Her tur, her switch frame'i yeniden çoğaltır ve ağda dolaşan frame sayısı saniyeler içinde milyonlara çıkar.
Bu duruma broadcast storm denir ve etkisi yıkıcıdır: switch'lerin CPU'su tamamen tükenir, ağ bant genişliği tıkanır, gerçek trafik geçemez, ağ pratikte çöker. Düzeltmenin tek yolu bağlantılardan birini fiziksel olarak çekmek ya da switch'leri kapatıp açmak.
İşte bu yüzden döngülü bir topoloji, yedeklilik sağladığı için iyi olsa da, döngüyü yöneten bir mekanizma olmadan kullanılamaz. O mekanizma STP.
STP'nin Felsefesi: "Olsun Ama Aktif Olmasın"
STP'nin yaklaşımı çok zarif. Diyor ki: "Yedek bağlantılar fiziksel olarak kalsın, ama hepsi aynı anda aktif olmasın. Birini ana yol olarak kullan, diğerlerini blokla. Eğer ana yol koparsa, blokladığın yedeği hemen aktif et."
Sonuç: Yukarıdaki üçgen aslında bir ağaç (tree) gibi açılır. Bir kenarı pasif, diğer ikisi aktif. Döngü ortadan kalkar, yedeklilik korunur.
Peki bu kararı kim veriyor? Switch'ler kendi aralarında konuşup karar veriyor. Bu konuşmayı sağlayan şey BPDU.
BPDU — Switch'lerin Birbiriyle Konuştuğu Dil
BPDU, "Bridge Protocol Data Unit"in kısaltması. "Bridge" kelimesi eski jargon, eskiden switch'lere bridge denirdi, terminoloji öyle yerleşmiş.
BPDU, switch'lerin birbirleriyle konuşmak için ürettiği özel bir frame. Normal kullanıcı trafiği değil, switch-to-switch yönetim mesajları. Switch'i ağa taktığın anda, herhangi bir trafik olmasa bile, switch trunk port'larından her 2 saniyede bir BPDU göndermeye başlar. Bu BPDU'lar STP'nin yaşam belirtisidir.
Bir BPDU'nun içinde kritik bilgiler bulunur:
Bridge ID (BID): Bu BPDU'yu gönderen switch'in kimliği. İki parçadan oluşur: Priority (öncelik değeri) ve MAC adresi. Yani:
Bridge ID = [Priority][MAC adresi]
Örnek: 32768.aaaa.bbbb.ccccBridge ID = [Priority][MAC adresi]
Örnek: 32768.aaaa.bbbb.ccccRoot Bridge ID: "Bu mesajı gönderirken, root bridge olduğunu düşündüğüm switch şu" diye beyan ettiği değer.
Root Path Cost: "Ben root'a ulaşmak için ne kadar yol kat ediyorum" değeri. Hızlı link ucuz, yavaş link pahalı.
Sender Bridge ID: Bu BPDU'yu şu anda gönderen switch'in kendi BID'si.
Port ID: BPDU'nun gönderildiği port numarası.
Switch'ler birbirinin BPDU'larını dinleyip bu bilgileri karşılaştırır, kararlar verir. STP'nin bütün dansı bu mesajların etrafında döner.
Priority — Yöneticinin Müdahale Kapısı
BPDU'nun içindeki Priority alanı çok önemli. Çünkü STP'nin "kim root olacak" yarışmasında birinci kriter budur.
Priority, 0 ile 65535 arasında bir sayıdır. Varsayılan değer 32768. Mantığı çok basit: Sayısal olarak düşük olan kazanır.
Hiç müdahale edilmediği durumda, bütün switch'ler 32768 priority ile gelir. Eşit priority demek "ikinci kritere git" demek, o da MAC adresi. Yani varsayılan durumda root'u MAC adresi belirler — genelde en eski switch (eski MAC numaraları küçük olduğu için) root olur.
Bu kabul edilemez bir durum, çünkü:
- Root rastgele seçilmiş oluyor, planlanmamış
- En eski switch genelde en zayıf switch'tir, root olmamalı
- Yeni bir switch eklendiğinde topoloji aniden değişebilir
İşte priority bu yüzden var. Yönetici "şu güçlü switch root olsun" demek istediğinde, o switch'in priority'sini düşürür:
Switch(config)# spanning-tree vlan 1 priority 4096Switch(config)# spanning-tree vlan 1 priority 4096Bu komut priority'yi 4096'ya çeker. Diğer switch'ler hâlâ 32768'de olduğu için, karşılaştırmada 4096 < 32768 → o switch kesin root olur. MAC'e bakılmaz bile.
Priority değerleri 4096'nın katları olarak verilir: 0, 4096, 8192, 12288, 16384… Bu Cisco'nun bir gerekliliği. En agresif seçim 0'dır, "kesin root ol" demek.
Pratikte mühendisler şöyle yapar:
- Asıl root olmasını istediği switch'e: priority 4096
- Yedek root: priority 8192
- Diğerleri: varsayılan 32768
Böylece root manuel olarak belirlenir, asıl root çökerse yedek root devreye girer, kullanıcı switch'lerinden hiçbiri root olamaz.
Switch'ler BPDU'larla Üç Aşamalı Yarışma Yapar
BPDU'lar konuşmaya başladığı anda STP üç adımda topolojiyi inşa eder.
Adım 1 — Root Bridge Seçimi
Bütün switch'ler başlangıçta kendini root sanır. BPDU'larında "root bridge benim, BID'm şu" diye beyan eder. İki switch birbirinin BPDU'sunu aldığında BID karşılaştırması yapar:
- Önce priority'lere bakılır → düşük olan kazanır
- Priority eşitse, MAC adreslerine bakılır → düşük olan kazanır
Switch kendisinden daha düşük BID'li bir root duyduğunda "tamam, ben root değilim" der ve kendi BPDU'larında o switch'i root olarak işaretler. Mesaj kademe kademe yayılır, herkes aynı root'ta hemfikir olur. Sonuçta bütün ağ tek bir root bridge'i kabul eder.
Adım 2 — Root Port Seçimi
Root seçildikten sonra, her switch (root hariç) kendine sorar: "Root'a en kısa yoldan hangi portumdan giderim?"
BPDU'lardaki Root Path Cost alanına bakılır. Her port'a gelen BPDU'nun maliyeti hesaplanır. En düşük maliyetli port Root Port seçilir. Her switch'in tek bir Root Port'u olur — root'a doğru bakan port.
Adım 3 — Designated Port Seçimi
Her link üzerinde (iki switch arası kablo), o linki yönetecek bir port seçilir. Bu Designated Port, link üzerinde root'a en yakın olan switch'in portudur. Root bridge'in bütün portları Designated'tir, çünkü root'a olan maliyeti 0'dır.
Geriye Kalan Portlar Bloklanır
Şimdi her port'un bir rolü var: ya Root Port, ya Designated Port, ya da Blocked Port. Bloklanan portlar fiziksel olarak bağlı ama kullanıcı trafiğini geçirmez. Sadece BPDU dinler ve "yedek" pozisyonda bekler. Aktif bir link koparsa, bloklanmış port hemen uyanır ve devreye girer.
Port Durumları — Yavaş Yavaş Aktifleşmek
STP'de bir port hemen forward etmeye başlamaz, bir dizi durumdan geçer:
- Disabled: Port idari olarak kapalı
- Blocking: BPDU dinler, veri trafiği geçirmez
- Listening: Kendisinin Root mu Designated mı olduğunu hesaplıyor (~15 saniye)
- Learning: MAC öğrenmeye başlıyor ama hâlâ trafik geçirmiyor (~15 saniye)
- Forwarding: Tam aktif, hem BPDU dinler hem trafik geçirir
Bir port "blocking"ten "forwarding"e geçerken 30 saniye kaybediyor. Klasik STP'nin yavaşlığı buradan geliyor — bir bağlantı koptuğunda yedeğin devreye girmesi yarım dakika sürebiliyor. Modern alternatifler (RSTP, MST) bu süreyi saniyelere indirmek için geliştirildi.
Bir Örnekle Bütünü Görelim
[Switch A] ← Root (priority 4096, manuel ayarlandı)
/ \
/ \
Link1 Link2
/ \
[Switch B] ──── [Switch C]
Link3[Switch A] ← Root (priority 4096, manuel ayarlandı)
/ \
/ \
Link1 Link2
/ \
[Switch B] ──── [Switch C]
Link3- Yönetici Switch A'nın priority'sini 4096 yaptı, diğerleri 32768. A root oldu.
- Switch B: Link1 üzerinden root'a en kısa yoldan ulaşıyor → Link1 portu = Root Port
- Switch C: Link2 üzerinden root'a en kısa yoldan ulaşıyor → Link2 portu = Root Port
- Link3 (B-C arası) bir döngü yaratır. STP bu linkin uçlarından birini Blocked durumuna alır. (Hangi portun bloklanacağı BPDU'lardaki Sender Bridge ID ve Port ID karşılaştırmasıyla belirlenir.)
Sonuç: Üç switch arasında üçgen vardı, STP onu bir ağaca dönüştürdü. Link3'ün bir ucu pasif. Eğer Link1 ya da Link2 koparsa, Link3 anında uyanır ve trafik akmaya devam eder.
STP'nin Karanlık Yüzü: Root Hijacking Saldırısı
Şimdi işin pentest tarafına geliyoruz. STP'nin temel bir güven sorunu var: BPDU'nun kim olduğunu doğrulayan bir mekanizma yok. Bir switch BPDU aldığında "bu gerçekten başka bir switch mi yoksa sahte mi" diye soramaz. BPDU'ya bakar ve içeriğine güvenir.
Saldırgan bu açığı şöyle kullanır: Kendi laptopundan sahte BPDU'lar üretir ve içine "priority 0" yazar. Yani "ben dünyanın en düşük BID'li switch'iyim, root benim" diye yalan söyler.
Switch'ler bu BPDU'yu alır ve mevcut root'un BID'siyle karşılaştırır. Mevcut root'un priority'si 4096 olsun, saldırganın 0. Sayısal karşılaştırma: 0 < 4096. Saldırgan kazanır. Ağ topolojisi yeniden inşa edilir, her switch artık saldırganın laptopuna "root" olarak bakar.
Bu noktada saldırgan ağın merkezine oturmuş olur. Bütün switch'ler trafiklerini ona göre yönlendirmeye başlar. Saldırgan Man-in-the-Middle pozisyonunda — istediği trafiği dinler, kaydeder, manipüle edebilir.
Saldırının teknik adı STP Root Role Hijacking ya da kısaca Root Bridge Takeover. Bir önceki yazıdaki Switch Spoofing'in akrabası: ikisi de switch'in "güvenmemesi gereken bir kaynağa güvenmesi" zafiyetinden besleniyor.
Savunma — İki Mekanizma Yeter
Bu saldırının önüne geçmek için Cisco iki özel özellik geliştirdi:
BPDU Guard — Kullanıcı portlarına uygulanan en sert önlem. "Bu port'tan BPDU gelmemeli" der. Çünkü kullanıcı portlarında bilgisayar, telefon olur, switch olmaz. Switch olmayan bir cihazdan BPDU geliyorsa şüphelidir.
Switch(config-if)# spanning-tree bpduguard enableSwitch(config-if)# spanning-tree bpduguard enableBu komut yazıldığında, port'tan BPDU geldiği anda port err-disable durumuna alınır (idari kapalı). Saldırgan BPDU göndermeye kalktığı saniye port ölür, saldırı başlamadan biter. Yöneticinin müdahalesi olmadan port açılmaz.
Root Guard — Trunk portlarda uygulanır. "Bu port'tan asla yeni bir root iddiası gelmesin" der. Eğer bu porttan daha düşük BID'li bir BPDU gelirse, port root-inconsistent durumuna alınır, yine pasifleşir.
Switch(config-if)# spanning-tree guard rootSwitch(config-if)# spanning-tree guard rootBu özellikle distribution-access katmanı arasındaki bağlantılarda kullanılır. Aşağıdaki access switch'leri root olmamalı, root yukarıda olmalı. Root Guard bu kuralı zorlar.
İki katmanlı savunma: BPDU Guard ile kullanıcı portları korunur, Root Guard ile switch-to-switch bağlantıları korunur. Birlikte uygulandığında STP saldırıları neredeyse imkansız hale gelir.
Modern Alternatifler — RSTP ve MST
STP klasik versiyonu artık eski. Yerine geliştirilenler:
RSTP (Rapid Spanning Tree Protocol) — STP'nin hızlandırılmış versiyonu. Aynı işi yapıyor ama yakınsama süresi 30 saniyeden 1–2 saniyeye düşürüldü. Modern switch'lerin varsayılan ayarı genelde budur.
MST (Multiple Spanning Tree) — VLAN'ları gruplara ayırıp her grup için ayrı bir STP ağacı kurar. Tek bir topoloji yerine birden fazla topoloji yönetir, yedek linklerin de aktif kullanılmasını sağlar (load balancing). Büyük, karmaşık ağlarda kullanılır.
Üçü de temelde aynı problemle uğraşıyor: döngüleri engelle, yedekliliği koru. BPDU mantığı üçünde de aynı. Sadece yakınsama hızı ve grup yönetimi farklı.
🧭 Network Pusulası: Bu Yazıda Ne Öğrendik?
- STP (Spanning Tree Protocol), yedekli switch topolojilerinde döngüleri engelleyen protokoldür. Yedek bağlantıları blocked duruma alır, aktif bağlantı koparsa yedek devreye girer.
- BPDU, switch'lerin birbiriyle konuştuğu özel mesajdır. Her 2 saniyede bir gönderilir, içinde Bridge ID, Root ID, Path Cost gibi kritik bilgiler vardır.
- Bridge ID = Priority + MAC adresi. Düşük olan kazanır.
- Priority, root seçiminde birinci kriterdir. Varsayılan 32768, manuel olarak 4096 ve katlarıyla ayarlanır. Yönetici priority'yi düşürerek istediği switch'i root yapar.
- STP üç aşamada topolojiyi inşa eder: Root Bridge → Root Port → Designated Port seçimi. Geri kalan portlar bloklanır.
- Portlar Blocking → Listening → Learning → Forwarding durumlarından geçer. Klasik STP'de 30+ saniye, RSTP'de 1–2 saniye.
- STP Root Hijacking saldırısında saldırgan priority 0'lı sahte BPDU göndererek kendini root yapar, ağın merkezine oturur, Man-in-the-Middle pozisyonu kazanır.
- Savunma: BPDU Guard (kullanıcı portlarında) + Root Guard (trunk portlarda). Birlikte uygulandığında STP saldırıları kapatılır.
- Modern alternatifler: RSTP (hızlı STP), MST (VLAN grupları için ayrı ağaçlar).
VLAN Hopping ve STP Hijacking, bir saldırganın ağ katmanında yapabileceği en temel iki saldırı. İkisini de gördük; ikisinin de savunması bir avuç komutla mümkün, ama ihmal edildiğinde sonuçları yıkıcı.
Bir sonraki yazıda ağ tasarımının büyük resmine bakacağız: Core, Distribution, Access katmanları. Yani bu yazılarda konuştuğumuz her şeyin hangi katmanda yaşadığını, kurumsal ağların nasıl tasarlandığını göreceğiz.🧭