Ağ Trafiğini Yakalama: tcpdump Temel Kullanımı

Ağ sorunlarını debug ederken ya da güvenlik olaylarını araştırırken en güçlü silahlardan biri tcpdump’tır. Bir sistemde ne olduğunu gerçekten anlamak istiyorsan, paket seviyesine inmek zorundasın. tcpdump bu işi komut satırından, herhangi bir GUI’ye ihtiyaç duymadan yapmanı sağlar. Hafif, hızlı ve neredeyse her Linux dağıtımında kurulu gelir. Bu yazıda tcpdump’ı sıfırdan öğreneceğiz, temel sözdiziminden başlayıp gerçek dünya senaryolarına kadar uzanan pratik bir yolculuk yapacağız.

tcpdump Nedir ve Neden Kullanmalısın?

tcpdump, ağ arayüzlerinden geçen paketleri yakalayan ve analiz eden bir komut satırı aracıdır. libpcap kütüphanesi üzerine inşa edilmiştir ve Wireshark da aynı kütüphaneyi kullanır. Aralarındaki fark şudur: Wireshark masaüstü ortamı ister, tcpdump ise SSH ile bağlandığın uzak bir sunucuda bile çalışır.

Peki ne zaman ihtiyaç duyarsın?

  • Bir uygulama beklenmedik şekilde bağlantı kurmaya çalışıyorsa
  • Firewall kurallarının doğru çalışıp çalışmadığını doğrulamak istiyorsan
  • DNS sorgularının nereye gittiğini görmek istiyorsan
  • Şüpheli ağ trafiği olduğunu düşünüyorsan
  • Uygulama geliştiricisiyle iletişim protokolü hakkında tartışıyorsan
  • Ağ performans sorunlarını analiz ediyorsan

tcpdump’ı kurmak için:

# Debian/Ubuntu
sudo apt install tcpdump

# RHEL/CentOS/Fedora
sudo yum install tcpdump
# veya
sudo dnf install tcpdump

# Arch Linux
sudo pacman -S tcpdump

Temel Kullanım: İlk Paketleri Yakalamak

tcpdump çalıştırmak için genellikle root yetkisi gerekir. Sudo ile kullanabilir ya da kullanıcını pcap grubuna ekleyebilirsin.

En basit kullanım tüm arayüzlerdeki trafiği izlemektir:

sudo tcpdump

Bu komut çalıştırıldığında ekrana akmaya başlayan satırlar seni korkutmasın. Her satır bir pakettir. Ctrl+C ile durdurabilirsin.

Gerçek dünyada ilk yapman gereken şey hangi ağ arayüzlerinin mevcut olduğunu öğrenmektir:

sudo tcpdump -D

Bu komut sisteminizde mevcut olan tüm ağ arayüzlerini numaralandırarak listeler. Örnek çıktı şöyle görünür:

1.eth0 [Up, Running, Connected]
2.lo [Up, Running, Loopback]
3.docker0 [Up, Running, Connected]
4.any (Pseudo-device that captures on all interfaces) [Up, Running]

Belirli bir arayüzde dinlemek için -i parametresini kullanırsın:

sudo tcpdump -i eth0

Temel Parametreler

Düzenli kullanacağın parametreleri şöyle özetleyebilirim:

  • -i [arayüz]: Belirli bir ağ arayüzünü dinle
  • -n: IP adreslerini hostname’e çevirme (performans için önemli)
  • -nn: IP adreslerini ve port numaralarını servis adına çevirme
  • -v: Verbose mod, daha fazla bilgi göster
  • -vv: Daha da ayrıntılı çıktı
  • -vvv: Maksimum ayrıntı
  • -c [sayı]: Belirtilen sayıda paket yakaladıktan sonra dur
  • -w [dosya]: Yakalanan paketleri pcap formatında dosyaya yaz
  • -r [dosya]: Daha önce kaydedilmiş pcap dosyasını oku
  • -A: Paket içeriğini ASCII olarak göster
  • -X: Paket içeriğini hem hex hem ASCII olarak göster
  • -e: Ethernet header bilgilerini göster (MAC adresleri)
  • -t: Zaman damgasını gösterme
  • -tttt: Okunabilir format zaman damgası kullan
  • -q: Kısa çıktı modu
  • -s [boyut]: Yakalanacak paket boyutunu belirle (0 = tüm paket)

Günlük kullanımda en çok işe yarayan kombinasyon şudur:

sudo tcpdump -i eth0 -nn -v

-nn parametresi kritiktir. Bunu kullanmadan tcpdump her IP adresi için DNS sorgusu yapar ve bu hem yavaşlatır hem de DNS sorgularının kendisi capture’a karışır.

Filtreleme: tcpdump’ın Gücü

Ham trafik izlemek çoğu zaman anlamsızdır. Gerçek güç filtrelerdedir. tcpdump, BPF (Berkeley Packet Filter) sözdizimini kullanır.

Host Bazlı Filtreleme

Belirli bir IP adresinin trafiğini izlemek:

sudo tcpdump -i eth0 -nn host 192.168.1.100

Bu komut 192.168.1.100 adresine giden veya bu adresten gelen tüm trafiği gösterir.

Sadece bu host’tan gelen trafiği görmek istiyorsan:

sudo tcpdump -i eth0 -nn src host 192.168.1.100

Sadece bu host’a giden trafiği görmek için:

sudo tcpdump -i eth0 -nn dst host 192.168.1.100

Port Bazlı Filtreleme

HTTP trafiğini izlemek:

sudo tcpdump -i eth0 -nn port 80

Belirli bir kaynaktan gelen 443 trafiği:

sudo tcpdump -i eth0 -nn src port 443

Protokol Bazlı Filtreleme

Sadece TCP trafiği:

sudo tcpdump -i eth0 -nn tcp

Sadece UDP trafiği:

sudo tcpdump -i eth0 -nn udp

Sadece ICMP (ping) trafiği:

sudo tcpdump -i eth0 -nn icmp

Mantıksal Operatörler ile Gelişmiş Filtreleme

Birden fazla koşulu birleştirmek için and, or ve not operatörlerini kullanırsın. Parantez kullanıyorsan ters slash ile escape etmen gerekir:

# 192.168.1.100 hostunun 80 port trafiği
sudo tcpdump -i eth0 -nn host 192.168.1.100 and port 80

# 80 veya 443 port trafiği
sudo tcpdump -i eth0 -nn port 80 or port 443

# 192.168.1.100 dışındaki tüm host trafiği
sudo tcpdump -i eth0 -nn not host 192.168.1.100

# Belirli bir subnet'in trafiği
sudo tcpdump -i eth0 -nn net 192.168.1.0/24

# Karmaşık filtre örneği
sudo tcpdump -i eth0 -nn 'host 192.168.1.100 and (port 80 or port 443)'

Paketleri Dosyaya Kaydetmek

Uzun süreli izleme yapıyorsan veya analizi daha sonra yapmak istiyorsan paketleri dosyaya kaydetmek şarttır. -w parametresi pcap formatında kaydeder:

sudo tcpdump -i eth0 -nn -w /tmp/capture.pcap

Bu dosyayı daha sonra okumak için:

sudo tcpdump -r /tmp/capture.pcap

Okurken de filtre uygulayabilirsin:

sudo tcpdump -r /tmp/capture.pcap -nn port 443

pcap dosyaları Wireshark ile açılabilir. Yani sunucuda tcpdump ile yakalarsın, dosyayı kendi bilgisayarına indirirsin, Wireshark’ta görsel olarak analiz edersin. Bu kombinasyon çok güçlüdür.

Büyük capture’larda dosyayı belirli boyutta parçalamak için -C ve -G parametrelerini kullanabilirsin:

# Her 100MB'da yeni dosya oluştur
sudo tcpdump -i eth0 -nn -w /tmp/capture-%Y%m%d-%H%M%S.pcap -C 100

# Her 60 saniyede yeni dosya oluştur
sudo tcpdump -i eth0 -nn -w /tmp/capture-%Y%m%d-%H%M%S.pcap -G 60

Paket İçeriğini Görmek

Bazen paketin içinde ne var görmek istersin. Özellikle şifrelenmemiş protokollerde bu çok işe yarar.

-A parametresi ASCII içerik gösterir, HTTP gibi metin tabanlı protokoller için idealdir:

sudo tcpdump -i eth0 -nn -A port 80

-X parametresi hem hexadecimal hem ASCII gösterir, ikisi de lazımsa bunu kullan:

sudo tcpdump -i eth0 -nn -X port 80

-s parametresi ile yakalanacak paket boyutunu ayarlarsın. Varsayılan değer 262144 byte’tır (pratik olarak tüm paket). Eski sistemlerde varsayılan 68 byte’tı ve paket içeriğini kaçırıyordun, bu durumda:

sudo tcpdump -i eth0 -nn -s 0 -A port 80

-s 0 tüm paketin yakalanması anlamına gelir.

Gerçek Dünya Senaryoları

Senaryo 1: DNS Sorunlarını Debug Etmek

Kullanıcıların bazı sitelere erişemediği bir şikayet geldi. DNS düzgün çalışıyor mu?

sudo tcpdump -i eth0 -nn udp port 53

Bu komutla DNS sorgularını ve yanıtlarını görebilirsin. Eğer sorgular gidiyor ama yanıt gelmiyorsa DNS sunucusunda sorun var. Eğer hiç sorgu gitmiyorsa istemci tarafında sorun var demektir.

Belirli bir sunucuya giden DNS trafiğini izlemek için:

sudo tcpdump -i eth0 -nn udp port 53 and dst host 8.8.8.8

Senaryo 2: Şüpheli Outbound Bağlantıları Tespit Etmek

Bir sunucunun internete beklenmedik bağlantılar kurduğundan şüpheleniyorsun. Önce lokal ağ trafiğini dışarıda bırakarak dış trafiğe bakarsın:

sudo tcpdump -i eth0 -nn 'not net 192.168.0.0/16 and not net 10.0.0.0/8 and not net 172.16.0.0/12'

Bu filtre RFC1918 private IP aralıklarını dışarıda bırakır, sadece internete giden/gelen trafiği gösterir. Beklenmedik IP adresleri görürsen araştırmaya başlarsın.

Senaryo 3: TCP Handshake Sorunları

Bir servise bağlanılamıyor ama firewall kapalı, servis ayakta. TCP seviyesinde ne oluyor?

sudo tcpdump -i eth0 -nn 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0' and host 192.168.1.50

Bu filtre sadece SYN ve FIN paketlerini gösterir. TCP three-way handshake’i şöyle görürsün: SYN gider, SYN-ACK gelir, ACK gider. Eğer sadece SYN paketi gidip yanıt gelmiyorsa paketler bir yerde düşüyor demektir.

Senaryo 4: HTTP Trafiğini Analiz Etmek

Bir web uygulamasının hangi HTTP isteklerini yaptığını görmek istiyorsun:

sudo tcpdump -i eth0 -nn -A 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'

Bu karmaşık filtre boş olmayan TCP paketlerini gösterir, sadece handshake paketlerini değil. HTTP GET ve POST isteklerini net olarak görebilirsin.

Daha basit bir yaklaşımla sadece HTTP GET isteklerini görmek için:

sudo tcpdump -i eth0 -nn -A port 80 | grep -E "GET|POST|Host:"

Senaryo 5: ARP Trafiğini İzlemek

Ağda ARP spoofing saldırısından şüpheleniyorsun ya da sadece ARP tablosunun nasıl dolduğunu anlamak istiyorsun:

sudo tcpdump -i eth0 -nn arp

Aşırı miktarda ARP reply görüyorsan ve bunlar request olmadan geliyorsa ARP poisoning ihtimali var demektir.

Senaryo 6: Belirli Bir Süre Yakalama

Production ortamında genellikle belirli bir süre için capture alırsın. Bunun için timeout komutunu kullanabilirsin:

sudo timeout 60 tcpdump -i eth0 -nn -w /tmp/capture_$(date +%Y%m%d_%H%M%S).pcap

Bu komut 60 saniye boyunca paketi kaydeder sonra otomatik durur.

Çıktıyı Okumak

tcpdump çıktısı ilk bakışta karmaşık görünebilir. Bir TCP paket satırı şöyle görünür:

14:23:45.123456 IP 192.168.1.100.54321 > 93.184.216.34.443: Flags [S], seq 1234567890, win 64240, options [mss 1460,sackOK,TS val 123456 ecr 0,nop,wscale 7], length 0

Bunu okuyalım:

  • 14:23:45.123456: Zaman damgası
  • IP: Protokol tipi
  • 192.168.1.100.54321: Kaynak IP ve port
  • 93.184.216.34.443: Hedef IP ve port
  • Flags [S]: TCP bayrakları. S=SYN, F=FIN, R=RST, P=PSH, A=ACK, anlamına gelir
  • seq 1234567890: Sequence numarası
  • win 64240: TCP window size
  • length 0: Payload uzunluğu (SYN paketinde payload yok)

TCP bayraklarını öğrenmek önemlidir:

  • [S]: SYN, bağlantı başlatma
  • [S.]: SYN-ACK, bağlantı onayı
  • [.]: ACK, alındı onayı
  • [P.]: PSH-ACK, veri gönderme
  • [F.]: FIN-ACK, bağlantı sonlandırma
  • [R.]: RST-ACK, bağlantıyı sıfırlama
  • [R]: RST, anormal kapanma

Performans ve Dikkat Edilmesi Gerekenler

Yüksek trafikli bir sunucuda tcpdump çalıştırırken dikkatli olmak gerekir. Bazı pratik önlemler:

Buffer boyutunu artır. Yüksek hızlı ağlarda paket kaybı yaşanabilir. -B parametresiyle buffer boyutunu artırabilirsin:

sudo tcpdump -i eth0 -nn -B 4096 -w /tmp/capture.pcap

Sadece ihtiyacın olan trafiği yakala. Filtre olmadan tüm trafiği yakalamak hem CPU hem de disk için yorucudur. Her zaman mümkün olan en spesifik filtreyi kullanmaya çalış.

Paket sayısını sınırla. Debug için çoğu zaman ilk birkaç yüz paket yeterlidir:

sudo tcpdump -i eth0 -nn -c 500 host 192.168.1.100

Disk dolmasını önle. Özellikle uzun süreli capture’larda disk dolabilir. Ring buffer özelliğini kullan:

# 10 adet 100MB dosya yaz, dolunca eskiyi sil (ring buffer)
sudo tcpdump -i eth0 -nn -w /tmp/cap.pcap -C 100 -W 10

Hassas veri konusunda dikkatli ol. tcpdump şifresiz trafiğin içeriğini gösterir. Parola, token, kişisel veri içeren capture dosyalarını güvenli şekilde sakla ve işin bitince sil:

sudo shred -vfz /tmp/capture.pcap

tcpdump’ı Daha Verimli Kullanmak

Alias tanımla. Sürekli kullandığın uzun komutları alias olarak ekle:

alias tcpwatch='sudo tcpdump -i eth0 -nn -v'
alias tcpsave='sudo tcpdump -i eth0 -nn -s 0 -w'

grep ile kombine et. Çıktıyı filtrelemek için grep kullanabilirsin, ancak bu BPF filtresi kadar verimli değildir:

sudo tcpdump -i eth0 -nn -A port 80 | grep -i "user-agent"

tee ile hem ekranda gör hem kaydet:

sudo tcpdump -i eth0 -nn -w - | tee /tmp/capture.pcap | tcpdump -r -

Uzak sunucudan yerel Wireshark’ta canlı izleme. Bu çok kullanışlı bir trick’tir:

ssh user@remote-server "sudo tcpdump -i eth0 -nn -s 0 -w - not port 22" | wireshark -k -i -

Bu komutla uzak sunucunun trafiğini kendi bilgisayarındaki Wireshark’ta canlı izleyebilirsin. Port 22 filtresi SSH oturumunun kendisinin capture’a karışmasını önler.

Sık Yapılan Hatalar

Hostname çözümlemesi açık bırakmak. -n parametresi olmadan tcpdump her IP için reverse DNS sorgusu yapar. Bu hem yavaşlatır hem de DNS trafiği capture’a girer. Her zaman -nn kullan.

Snaplen’i unutmak. Bazı eski sistemlerde varsayılan snaplen (paket boyutu limiti) çok düşüktür. Tam paket içeriği görmek istiyorsan -s 0 ekle.

Yanlış arayüzü dinlemek. Trafik göremiyorsan hangi arayüzden geçtiğini kontrol et. -D ile arayüzleri listele, gerekirse any kullan:

sudo tcpdump -i any -nn host 192.168.1.100

pcap dosyasını çok büyütmek. Sınırsız kayıt başlatıp gitmeyi unutmak disk dolmasına yol açar. Her zaman -c veya -G ile süre/boyut sınırı koy.

Sonuç

tcpdump, sysadmin toolbox’ının vazgeçilmez araçlarından biridir. Ağ sorunlarını gerçekten anlamak, güvenlik olaylarını araştırmak ve uygulamaların ağ davranışını doğrulamak için paket seviyesine inmek gerekir. Bu yazıda gördüğümüz gibi temel kullanım oldukça basittir, asıl güç BPF filtreleri ve farklı parametrelerin kombinasyonundan gelir.

Öğrenmenin en iyi yolu pratik yapmaktır. Kendi lab ortamında çeşitli senaryolar dene, farklı filtreler yaz, pcap dosyalarını Wireshark’ta aç ve paketleri incele. tcpdump’ı rahatça kullandığında ağ sorunlarına bakış açın tamamen değişecek. Artık “neden bağlanamıyor?” sorusunu tahmin etmek yerine paketin gerçekten nerede takıldığını göreceksin.

Son olarak şunu vurgulayayım: tcpdump yetkili olduğun sistemlerde ve ağlarda kullan. İzinsiz ağ trafiği yakalamak hem etik dışıdır hem de pek çok ülkede yasaldır.

Yorum yapın