Ana içeriğe geç

Bölüm 19:Paket Yakalama ve Çözümleme

8 dakikalık okumaGüncelleme:

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
  1. Giriş
  2. Adres Çubuğundan İsteğe
  3. Paket Anahtarlamalı Yol
  4. İsimden Adrese
  5. Önbellek, Tazelik ve Güven
  6. Port Numarası ve Soket
  7. Bağlantısız Taşıma: UDP
  8. Üç Adımlı El Sıkışma
  9. Simetrik Şifreleme
  10. Açık Anahtarlı Kriptografi
  11. TLS El Sıkışması
  12. Sertifika Zinciri
  13. HTTP Mesajının Anatomisi
  14. Durum, Çerez ve Oturum
  15. HTTP/2'den HTTP/3'e
  16. İçerik Dağıtım Ağları
  17. Diğer Uygulama Protokolleri
  18. Katmanlı Mimari
  19. Kapsülleme ve Başlıklar
  20. Paket Yakalama ve Çözümleme
  21. Ağ Arayüz Kartı
  22. Fiziksel Adresleme
  23. Hata Sezme ve CRC
  24. Adres Çözümleme: ARP
  25. Anahtarlama ve Ortam Erişimi
  26. Ağ Topolojileri
  27. Sanal Yerel Ağlar
  28. Kablosuz Erişim: 802.11
  29. Radyo Kanalı ve Kapasite
  30. Kablosuz Ağ Güvenliği
  31. Hücresel Ağlar
  32. Spektrum ve Kuşaklar
  33. Hareketlilik ve Aktarma
  34. Adres Kiralama: DHCP
  35. Adresin Anatomisi
  36. Adres Tükenmesi ve IPv6
  37. Yönlendirici Mimarisi
  38. Kuyruk Yönetimi
  39. Cihaz Yapılandırma
  40. Yönlendirme Protokolleri
  41. Kontrol Düzlemi ve SDN
  42. Ağ İzleme ve Yönetimi
  43. Alanlar Arası Yönlendirme
  44. Adres Çevirisi
  45. Ara Kutular
  46. Tünelleme ve IPsec
  47. Güvenlik Duvarları
  48. Operatör ve Metro Ağları
  49. Bitten Sinyale
  50. Çoklama Teknikleri
  51. İletim Ortamları
  52. Kablo Sonlandırma
  53. Fiber Optik İletim
  54. Bakır Erişim Ağı: DSL
  55. Pasif Optik Ağlar
  56. Kablo Erişim Ağları
  57. Denizaltı Kabloları
  58. Veri Merkezi Ağları
  59. Kapsülleme Çözme
  60. Güvenilir Aktarım
  61. Tıkanıklık Denetimi
  62. Trafik Çözümleme
  63. Gecikme Bütçesi
  64. 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ü.

Paket yakalama arayüzünün üç bölmesi tek ekranda: üstte satır satır yakalanmış paketler, ortada seçilen paketin katman katman açılmış ağacı, altta aynı paketin ham bayt dökümü. Ağaçtaki alan ile bayt aralığının eşleşmesi burada görünüyor.

Ağacın dalları ile bayt aralıkları birebir örtüşüyor:

ağaçtaki dalbayt aralığıuzunluk
çerçevenin tamamı0 – 533534 bayt
Ethernet II0 – 1314 bayt
Internet Protocol v414 – 3320 bayt
Transmission Control Protocol34 – 5320 bayt
Transport Layer Security54 – 533480 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ı