Bölüm 19:Paket Yakalama ve Çözümleme
Ağlar'a “Sen”i Katmak yazısının parçası: adres çubuğuna yazdığın tek bir isteğin peşinden bakırla fiberin fiziğine kadar inen uzun bir teknik yolculuk.
Tüm bölümler
- Giriş
- Adres Çubuğundan İsteğe
- Paket Anahtarlamalı Yol
- İsimden Adrese
- Önbellek, Tazelik ve Güven
- Port Numarası ve Soket
- Bağlantısız Taşıma: UDP
- Üç Adımlı El Sıkışma
- Simetrik Şifreleme
- Açık Anahtarlı Kriptografi
- TLS El Sıkışması
- Sertifika Zinciri
- HTTP Mesajının Anatomisi
- Durum, Çerez ve Oturum
- HTTP/2'den HTTP/3'e
- İçerik Dağıtım Ağları
- Diğer Uygulama Protokolleri
- Katmanlı Mimari
- Kapsülleme ve Başlıklar
- Paket Yakalama ve Çözümleme
- Ağ Arayüz Kartı
- Fiziksel Adresleme
- Hata Sezme ve CRC
- Adres Çözümleme: ARP
- Anahtarlama ve Ortam Erişimi
- Ağ Topolojileri
- Sanal Yerel Ağlar
- Kablosuz Erişim: 802.11
- Radyo Kanalı ve Kapasite
- Kablosuz Ağ Güvenliği
- Hücresel Ağlar
- Spektrum ve Kuşaklar
- Hareketlilik ve Aktarma
- Adres Kiralama: DHCP
- Adresin Anatomisi
- Adres Tükenmesi ve IPv6
- Yönlendirici Mimarisi
- Kuyruk Yönetimi
- Cihaz Yapılandırma
- Yönlendirme Protokolleri
- Kontrol Düzlemi ve SDN
- Ağ İzleme ve Yönetimi
- Alanlar Arası Yönlendirme
- Adres Çevirisi
- Ara Kutular
- Tünelleme ve IPsec
- Güvenlik Duvarları
- Operatör ve Metro Ağları
- Bitten Sinyale
- Çoklama Teknikleri
- İletim Ortamları
- Kablo Sonlandırma
- Fiber Optik İletim
- Bakır Erişim Ağı: DSL
- Pasif Optik Ağlar
- Kablo Erişim Ağları
- Denizaltı Kabloları
- Veri Merkezi Ağları
- Kapsülleme Çözme
- Güvenilir Aktarım
- Tıkanıklık Denetimi
- Trafik Çözümleme
- Gecikme Bütçesi
- Son Söz
Diyelim ki bir yakalama aracı kurdun ve açılış ekranındaki kart listesinden kendi arayüzünü seçtin. Satırlar akmaya başlıyor; her satır bir çerçeve. Kapsülleme merdivenini kurarken tek tek saydığın başlıklar şimdi o satırların içinde duruyor.
Anlatılan her zarfı yakalamak ve tek tek açıp görmek mümkün. Peki o satırları ekrana taşıyan şey tam olarak ne?
Trafiği kim kopyalıyor?
Ekranda gördüğün program yakalamayı kendisi yapmıyor. Altta, işletim sisteminin içinde duran bir paket yakalama kütüphanesi var; üstünde de senin tıkladığın çözümleyici arayüz. Arayüzün işi baytları adlandırmak.
Alt katman, kartın gönderdiği ve aldığı bütün Ethernet çerçevelerinin bir kopyasını alıyor. Kopya kelimesi burada teknik anlamıyla duruyor. Asıl trafik durmuyor, gecikmiyor, değişmiyor.
Bunun karşılığında araç yükseltilmiş yetki istiyor. Sebep tek: program doğrudan ağ kartına erişmek zorunda.
İlan edilen asgari gereksinimler şaşırtıcı derecede mütevazı: 400 MHz işlemci ve 60 MB boş disk. Üçüncü madde donanımla ilgili — karışık modu destekleyen bir ağ kartı. Asıl yük çözümlemede değil, kartın kopyaladığı trafikte.
Araç üç iş yapıyor. Trafiği anlık izliyor, izlediğini dosyaya kaydediyor, kaydı sonradan yeniden açtırıyor. Aynı ekran bu yüzden iki kaynaktan doluyor: canlı bir ağ kartından ya da daha önce kaydedilmiş bir pcap dosyasından.
Kart listesinde ne göreceğin işletim sistemine bağlı. Linux’ta eth0 ve wlan0, macOS’ta en0 ile lo0, Windows’ta üreticinin verdiği uzun ad. Fiziksel kartların yanında sanal geri döngü arayüzü de listede duruyor; makinenin kendi kendine konuşmasını oradan yakalıyorsun.
Wi-Fi kartıyla yakalayacaksan bir adım daha var: kartı izleme kipine almak. Kablolu kartta bu adım yok.
Neden komşunun paketlerini göremiyorsun?
Tehdit modelinin ilk maddesi karışık mod ve dinlemeydi; ekranda akan liste o maddenin somut hâli.
Ama dinlemeyi mümkün kılan şey ne araç ne de o mod. Ortamın yayın ortamı olması: paylaşılan Ethernet ve kablosuz bağlantı. Herkesin duyduğu bir yerde kartı susturmayı bırakmak yetiyor.
Anahtarlı bir yerel ağda hesap değişiyor. 192.0.2.10 numaralı makineden 192.0.2.11’e giden bir çerçeve, kartın karışık modda olsa bile 192.0.2.12’ye ulaşmıyor. Anahtar onu yalnızca hedefin bağlı olduğu porta gönderiyor.
İşin ters yüzü de var. Anahtarın kendi portları karışık modda çalışıyor; adres öğrenmesinin yolu tam olarak bu. Öğrendiklerini tuttuğu tablo ise sınırlı; tablo taşırılırsa anahtar çerçeveleri yeniden yayına veriyor ve dinleme geri geliyor.
Ekranda gördüğün şey bu yüzden ağın tamamı değil. Kartının duyabildiği kadarı.
Beş bölme, tek paket
Pencere beş bölmeye ayrılıyor: filtre satırı, paket listesi, seçilen paketin detay ağacı, ham bayt dökümü ve durum çubuğu. Listeden bir satır seçtiğin anda alttaki iki bölme dolmaya başlıyor.
Detay ağacı seçilen paketi katman katman açıyor. Katmanlı mimarideki sıra burada tıklanabilir bir ağaca dönüşüyor. Ağaçta bir alanı seçtiğinde aynı alan ham bayt dökümünde de işaretleniyor; iki bölme aynı paketin iki ayrı yazımı.
Aralıklar sabit. 534 baytlık bir çerçevede ilk 14 bayt Ethernet başlığı, sonraki 20 bayt IPv4, sonraki 20 bayt TCP. İlk 54 bayt zarf, gerisi uygulamanın yükü.

Ağacın dalları ile bayt aralıkları birebir örtüşüyor:
| ağaçtaki dal | bayt aralığı | uzunluk |
|---|---|---|
| çerçevenin tamamı | 0 – 533 | 534 bayt |
| Ethernet II | 0 – 13 | 14 bayt |
| Internet Protocol v4 | 14 – 33 | 20 bayt |
| Transmission Control Protocol | 34 – 53 | 20 bayt |
| Transport Layer Security | 54 – 533 | 480 bayt |
Bir dalı açtığın anda sağdaki ham dökümde o aralık işaretleniyor. Zarf elli dördüncü baytta bitiyor, gerisi yük. TLS varsa ağaç yalnızca kaydın türünü ve uzunluğunu veriyor; içerik şifreli olduğu için açılmıyor.
Çözümleyicinin bir daldan diğerine geçme yolu, başlıkların içindeki tür alanları. Ethernet tür alanındaki onaltılık 0806 değeri ARP demek. IP başlığındaki protokol alanında 1 ICMP, 6 TCP, 17 UDP demek. Ağaç bu sayılara bakarak dallanıyor.
Durum çubuğu üç sayı taşıyor: yakalanan toplam paket, o an gösterilen paket sayısı ve etkin profil adı. İkisi arasındaki fark, filtrenin ne kadarını elediğini söylüyor.
Adres çözümleme açıldığında listedeki MAC adresinin ilk 24 biti çözülüyor ve kartı üreten firmanın adı yanına yazılıyor. Bu bilgi ağa sorulmuyor. Program kendi içinde tuttuğu manuf dosyasına bakıyor. Adresin geri kalanının neyi adlandırdığı 21. bölümün işi.
Son bir ayrıntı: kayıt ekranında azami çerçeve 1.514 bayt görünüyor, oysa tel üstünde 1.518 bayt. Aradaki 4 bayt FCS alanı; kart onu doğruladıktan sonra atıyor ve kopyaya hiç koymuyor.
Kayda soru sormak
Filtre kutusu bir tane değil, iki tane. Açılış ekranındakine yazdığın filtre, çerçeveler daha diske yazılmadan alt katmanda uygulanıyor; elediği paket kayda hiç girmiyor. Yakalama sürerken kullandığın kutu ise gösterim filtresi ve elde duran kaydı süzüyor.
İkisinin dili de ayrı. Yakalama filtresi port numarası yazıyor: port 67 or port 68. Gösterim filtresi protokolün alan yolunu yazıyor: bootp.option.dhcp == 3. Aynı DHCP trafiğini seçen iki cümle, iki ayrı sözlükten.
İki dilin ayrı olmasının sebebi zevk değil, nerede çalıştıkları. Yazdığın yakalama filtresi bir metin olarak çekirdeğe gitmiyor; önce küçük bir sanal makinenin komutlarına derleniyor. O sanal makinenin adı BPF ve programı doğrudan çekirdeğin içinde, paket kullanıcı alanına kopyalanmadan önce koşuyor. Her çerçeve için birkaç düzine komut çalışıyor ve sonuç tek bir karar oluyor: kopyala ya da bırak.
Kazancın nereden geldiği buradan çıkıyor. Filtre kullanıcı alanında olsaydı, elenecek her çerçeve önce kopyalanacak, sonra atılacaktı — yani en pahalı iş, atılacak paket için de yapılacaktı. Çekirdekte elemek o kopyayı hiç yaptırmıyor.
Bedeli de dilin darlığı. BPF programı sabit bir yerden başlayıp sabit adımlarla ilerleyen bir yapıya bakabiliyor; “şu protokolün şu alanı” gibi adlandırılmış bir sözlüğü yok, çünkü çekirdek DHCP’nin ne olduğunu bilmiyor. Gösterim filtresi ise kayıt zaten diskteyken, bütün protokol ayrıştırıcıları elinin altındayken çalışıyor. Biri hızlı ve kaba, öteki yavaş ve ayrıntılı.
Aynı sanal makineyi başka yerlerde de göreceksin. tcpdump’ın filtre satırı bunu kullanıyor; komut satırından yakalama yaparken yazacağın ifade de aynı derleyiciden geçiyor.
Alan yolları sayıları da adlandırıyor. DHCP mesaj türünde 1 DISCOVER, 2 OFFER, 3 REQUEST, 4 ACK demek; ARP’ta işlem kodu 1 ise istek, 2 ise cevap anlamına geliyor. Gösterim filtreleri karşılaştırma ve mantık işleçleriyle birleşiyor: ==, !=, >, < ile and, or, xor, not. Her işlecin hem sözcük hem simge yazımı var.
Soket four-tuple’ında tanıştığın port numarası, filtre dilinde üç ayrı alana ayrılıyor. tcp.port == 80 iki yönü birden, tcp.srcport kaynağı, tcp.dstport == 443 yalnızca hedefi seçiyor. tcp.flags.syn == 1 ise kaydın içindeki bütün bağlantı kurulumlarını listeliyor.
Bunları ezberlemene gerek yok. Detay ağacındaki bir alana sağ tıklayıp Apply as Filter demek o alanı filtre satırına yazıyor. contains işleci de belirli bir protokolün gövdesinde metin arıyor.
DerinleşmeYakalama filtresi ile gösterim filtresi neden aynı şey değil?
İkisi de aynı trafiği seçiyor ama aynı yerde durmuyorlar. Yakalama filtresinin bedeli geri alınamaz olması. Yoğun bir hattı bir saat boyunca yalnızca DHCP portlarıyla izlediysen, sonradan aklına gelen ‘o sırada hangi bağlantı koptu’ sorusunun cevabı elinde yok. O çerçeveler hiç yazılmadı. Elenen çerçeve sayaçlara da girmiyor: durum çubuğundaki yakalanan toplam onları hiç görmediği için “ne kadarını kaçırdım” sorusunun cevabı da kayıtta yok.
Kazancı da tam olarak aynı yerden geliyor. Kalabalık bir hatta her şeyi diske yazmak kısa sürede gigabaytlara çıkıyor. Erken eleme, diski ve işlemciyi daha ilk anda koruyor.
Gösterim filtresinde böyle bir kayıp yok. Filtre satırını temizlediğin anda gizlenen paketler geri geliyor, çünkü hiçbiri atılmamıştı.
Sık kullandığın uzun bir gösterim filtresini bir düğmeye bile bağlayabilirsin; aynı kaydı her açışında tek tıkla süzülüyor. Yakalama filtresinde böyle bir düğmenin anlamı yok, çünkü onun eleme anı çoktan geçmiş oluyor.
Aynı ödünleşim günlük kaydından veri ambarına kadar her yerde çıkıyor. Genellenebilir ders şu: bir süzgeç ne kadar erken uygulanırsa o kadar ucuza gelir ve o kadar geri alınamaz olur.
Akış takibi aynı bağlantıya ait TCP paketlerini birleştirip tek bir konuşma olarak gösteriyor. Bayraklar tek tek okunuyor: SYN başlatır, ACK onaylar, RST ani sonlandırır, FIN düzgün kapatır. Yüksüz bir ACK satırında uygulama verisi len=0 yazıyor; o çerçeve yalnızca başlıktan ibaret. Kapanış sırasında uçlardaki durumlar CLOSE_WAIT, TIME_WAIT ve FIN_WAIT adlarını alıyor.
Konuşmanın içeriğine gelince, orada bir sınır var. TLS yoksa sokete yazılan parola İnternet’i düz metin olarak geçiyor ve ekranda da düz metin okunuyor. TLS varsa yakalayıcı yalnızca kaydın türünü ve uzunluğunu görüyor. El sıkışmada kurulan oturum anahtarı elinde olmadan içerik açılmıyor; o anahtarı araca vermeyi 60. bölüme bırakıyorum.
İstatistik ekranları kaydın bütününü sayıyor. Protokol hiyerarşisi hangi protokolden kaç paket olduğunu, IPv4 istatistiği her adresin kaç kez geçtiğini, HTTP sayacı metotları ve yanıt kodlarını veriyor; örnek bir kayıtta 165 GET isteği sayılmış. Kaydın tamamı yerine yalnızca seçtiğin paketleri ayrı bir dosyaya da yazabilirsin: numara aralığı, virgülle ayrılmış numaralar ya da işaretlediklerin.
Kendi kaydını üç komutla üretip sorgulayabilirsin:
sudo tcpdump -i eth0 -c 200 -w birinci.pcap
capinfos birinci.pcap
mergecap -w butun.pcap birinci.pcap ikinci.pcapİlk komut aynı yakalama katmanını kullanıyor ve iki yüz çerçeveyi dosyaya yazıyor. capinfos dosyanın özetini döküyor: paket sayısı, ilk ve son paketin zamanı, yakalamanın süresi. mergecap iki kaydı tek dosyada birleştiriyor ve birleşmiş dosyanın hangi iki dosyadan geldiğini bile söylüyor.
Özet
Peki, ne öğrendik?
- Yakalama işini arayüz yapmıyor: trafiği kopyalayan katman işletim sisteminin içinde duruyor, kopya asıl akışı geciktirmiyor ve o erişim yükseltilmiş yetki istiyor.
- Karışık mod tek başına yetmiyor: dinlemeyi mümkün kılan şey ortamın yayın olması, anahtarlı bir ağda çerçeve komşunun portuna zaten hiç gitmiyor.
- Ağaç ile bayt dökümü aynı paketi gösteriyor: bir alanı seçmek onun bayt aralığını işaretliyor, ilk elli dört bayt zarf, gerisi yük.
- İki filtre iki ayrı dil konuşuyor: biri yakalama başlarken port düzeyinde eliyor, diğeri elde duran kaydı alan yollarıyla süzüyor.
Ekrandaki her satırı açtın, baytlarını saydın, hangi aralığın kime ait olduğunu gördün. Ama bu kopyayı sana veren şey hâlâ kutunun içinde duruyor: çerçeveyi tele koyacak olan tam olarak ne?
20. bölüme devam et: Ağ Arayüz Kartı