Ana içeriğe geç

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

8 dakikalık okumaGüncelleme:

Ağlar'a “Sen”i Katmak kitabının bir bölümü: adres çubuğuna yazdığın tek bir isteğin peşinden bakırla fiberin fiziğine inip karşı taraftan geri dönen uzun bir teknik yolculuk.

Kısım 4: Makineden Yerel Ağa (Bölüm 18-29)

Tüm bölümler
  1. Giriş
  2. Adres Çubuğundan İsteğe
  3. Paket Anahtarlamalı Yol
  4. İsimden Adrese
  5. DNS Kayıtları
  6. Önbellek, Tazelik ve Güven
  7. Port Numarası ve Soket
  8. Bağlantısız Taşıma: UDP
  9. Üç Adımlı El Sıkışma
  10. Simetrik Şifreleme
  11. Açık Anahtarlı Kriptografi
  12. TLS El Sıkışması
  13. Sertifika Zinciri
  14. HTTP Mesajının Anatomisi
  15. Durum, Çerez ve Oturum
  16. HTTP/2'den HTTP/3'e
  17. İçerik Dağıtım Ağları
  18. Diğer Uygulama Protokolleri
  19. Katmanlı Mimari
  20. Hizmet ve Protokol
  21. Encapsulation ve Başlıklar
  22. Paket Yakalama ve Çözümleme
  23. Ağ Interface Kartı
  24. Fiziksel Adresleme
  25. Hata Sezme ve CRC
  26. Adres Çözümleme: ARP
  27. Ortam Erişimi: CSMA/CD
  28. Switch'ler
  29. Ağ Topolojileri
  30. Sanal Yerel Ağlar
  31. Kablosuz Erişim: 802.11
  32. Radyo Kanalı ve Kapasite
  33. Kablosuz Ağ Güvenliği
  34. Hücresel Ağlar
  35. Spektrum ve Kuşaklar
  36. Hareketlilik ve Aktarma
  37. Adres Kiralama: DHCP
  38. Adresin Anatomisi
  39. Adres Tükenmesi ve IPv6
  40. Router Mimarisi
  41. Kuyruk Yönetimi
  42. Cihaz Yapılandırma
  43. Routing Protokolleri
  44. Kontrol Düzlemi ve SDN
  45. Ağ İzleme ve Yönetimi
  46. Alanlar Arası Routing
  47. Adres Çevirisi
  48. Ara Kutular
  49. Tünelleme ve IPsec
  50. Firewall'lar
  51. Ağ Saldırıları
  52. Operatör ve Metro Ağları
  53. Bitten Sinyale
  54. Sembol Hızı ve Kanal Kapasitesi
  55. Multiplexing Teknikleri
  56. İletim Ortamları
  57. Bakır Kablo Sonlandırma
  58. Fiber Sonlandırma
  59. Fiber Optik İletim
  60. Bakır Erişim Ağı: DSL
  61. DSL'de Hız ve Mesafe
  62. Pasif Optik Ağlar
  63. Kablo Erişim Ağları
  64. Kablo Modem ve CMTS
  65. Denizaltı Kabloları
  66. Veri Merkezi Ağları
  67. Encapsulation Çözme
  68. Güvenilir Aktarım
  69. Tıkanıklık Denetimi
  70. Trafik Çözümleme
  71. Gecikme Bütçesi
  72. Soket Programlama
  73. Eşten Eşe ve Protokol Tasarımı
  74. Uyarlanır Video Akışı
  75. Gerçek Zamanlı Ses ve Görüntü
  76. Kablosuz Sensör Ağlarının Mimarisi
  77. Sensör Ağlarında Ortam Erişimi
  78. Sensör Ağlarında Yönlendirme ve IP
  79. Zaman Eşitleme ve Konum Bulma
  80. Sensör Ağı Uygulamaları
  81. Mobil Kablosuz Sensör Ağları
  82. Son Söz

Diyelim ki bir yakalama aracı kurdun ve açılış ekranındaki kart listesinden kendi interface’ini seçtin. Satırlar akmaya başlıyor; her satır bir frame. Encapsulation 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 ne?

Trafiği kim kopyalıyor?

Bu işin en yaygın aracı Wireshark ve bölüm boyunca ondan söz edeceğim. Ekranda gördüğün program yakalamayı kendisi yapmıyor. Altta, işletim sistemiyle konuşan bir paket yakalama kütüphanesi var: Linux ve macOS’ta libpcap, Windows’ta Npcap. Üstünde de senin tıkladığın çözümleyici arayüz duruyor ve onun işi baytları adlandırmak.

Alt katman, kartın gönderdiği ve aldığı bütün Ethernet frame’lerinin 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.

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 ya da enp3s0, kablosuz için wlan0 ya da wlp3s0 gibi adlar; macOS’ta en0 ile lo0; Windows’ta üreticinin verdiği uzun ad. Fiziksel kartların yanında sanal geri döngü interface’i de listede duruyor; makinenin kendi kendine konuşmasını oradan yakalıyorsun.

Wi-Fi kartıyla yakalayacaksan bir adım daha var: kartı monitor mode’a (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 broadcast ortamı olması: paylaşılan Ethernet ve kablosuz bağlantı. Herkesin duyduğu bir yerde kartı susturmayı bırakmak yetiyor.

Switch’li bir yerel ağda hesap değişiyor. 192.0.2.10 numaralı makineden 192.0.2.11’e giden bir frame, kartın karışık modda olsa bile 192.0.2.12’ye ulaşmıyor. Switch onu yalnızca hedefin bağlı olduğu porta gönderiyor.

İşin ters yüzü de var. Switch’in kendi portları karışık modda çalışıyor; adres öğrenmesinin yolu bu. Öğrendiklerini tuttuğu tablo ise sınırlı; tablo sahte adreslerle taşırılırsa (MAC flooding) switch frame’leri yeniden herkese dağıtmaya başlıyor ve dinleme geri geliyor. Kurumsal ağlarda dinlemenin meşru yolu da switch’in kendisinde: bir portun trafiğini başka bir porta kopyalayan port yansıtma (port mirroring, SPAN) ayarı.

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 frame’de 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 interface'inin üç 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
frame’in 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 yakalanan toplam paketi, o an gösterilen paket sayısını ve etkin profilin adını taşıyor. İlk iki sayı 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ığı 23. bölümün işi.

Son bir ayrıntı: kayıt ekranında azami frame 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. Kendi gönderdiğin trafikte 1.514’ü çok aşan “frame”ler görürsen de şaşırma. Kart segmentleri bölme işini üstlendiği için, 19. bölümdeki katman ihlali yüzünden, yakalama o parçayı bölünmeden önceki büyük hâliyle görüyor.

Kayda soru sormak

Filtre kutusu bir tane değil, iki tane. Açılış ekranındakine yazdığın filtre, frame’ler 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: dhcp.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 kernel’a gitmiyor; önce küçük bir sanal makinenin komutlarına derleniyor. O sanal makinenin adı BPF ve programı doğrudan kernel’ın içinde, paket kullanıcı alanına kopyalanmadan önce koşuyor. Her frame 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 frame önce kopyalanacak, sonra atılacaktı; yani en pahalı iş, atılacak paket için de yapılacaktı. Kernel’da 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ü kernel 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. Fikir o kadar iyi çalıştı ki Linux’ta büyüyüp eBPF adını aldı: bugün kernel’ın içinde güvenli küçük programlar çalıştırmanın genel yolu, paket süzmekten performans ölçmeye kadar.

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 frame’ler hiç yazılmadı. Elenen frame 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 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: 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 frame yalnızca başlıktan ibaret. Uçlardaki durumları, yani CLOSE-WAIT ya da TIME-WAIT’i yakalamada göremezsin, çünkü telden geçmiyorlar; onlar 8. bölümdeki ss çıktısında, makinenin kendi tablosunda duruyor.

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 69. 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. 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 frame’i 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ı, paketleri zaman sırasına dizerek tek dosyada birleştiriyor.

Özet

  • Yakalama işini ekrandaki program yapmıyor: trafiği kopyalayan katman işletim sisteminin yanında 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 broadcast ortamı olması; switch’li bir ağda frame 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: frame’i tele koyacak olan ne?

22. bölüme devam et: Ağ Interface Kartı