tcpdump ile Anlık Paket Analizi ve Sorun Tespiti

Ağ sorunlarını gidermek bazen gerçekten sinir bozucu olabilir. Uygulama bağlanamıyor, servis zaman aşımına uğruyor ya da paketler bir yere kadar gidip kayboluyor. İşte tam bu noktada tcpdump devreye giriyor. GUI olmadan, ekstra bir araç kurmadan, doğrudan terminalden ağ trafiğini yakalayıp inceleyebileceğin bu araç, her sysadmin’in vazgeçilmezi olmalı.

Bu yazıda tcpdump’ı sıfırdan ele alacağız. Temel kullanımdan başlayıp gerçek hayatta karşılaştığın senaryolara kadar gideceğiz. Hazırsan başlayalım.

tcpdump Nedir ve Neden Önemlidir?

tcpdump, libpcap kütüphanesini kullanan bir komut satırı paket analizörüdür. Linux, macOS ve BSD sistemlerinde varsayılan olarak gelir ya da kolayca kurulabilir. Ağ arayüzünden geçen paketleri yakalar, filtreler ve okunabilir bir formatta ekrana döker.

Neden bu kadar önemli? Çünkü:

  • Kernel seviyesinde çalışır, yani uygulama katmanındaki sorunları bile yakalar
  • Wireshark kurma imkanın yoksa sunucuda doğrudan kullanabilirsin
  • Firewall ve NAT sorunlarını paketin nereye kadar gittiğini görerek tespit edersin
  • Wireshark ile entegre çalışır, .pcap dosyasını kaydedip GUI’de analiz edebilirsin
  • Üretim sistemlerde herhangi bir servis yeniden başlatmadan kullanabilirsin

Kurulum için:

# Debian/Ubuntu
apt-get install tcpdump

# RHEL/CentOS/Rocky
yum install tcpdump
# veya
dnf install tcpdump

# Kurulumu doğrula
which tcpdump
tcpdump --version

Temel Kullanım ve Önemli Parametreler

tcpdump’ı root ya da tcpdump grubuna üye bir kullanıcı olarak çalıştırman gerekir. Sudo ile de sorunsuz çalışır.

En basit kullanım:

# Varsayılan arayüzdeki tüm trafiği yakala
sudo tcpdump

# Belirli bir arayüzde dinle
sudo tcpdump -i eth0

# Tüm arayüzleri listele
sudo tcpdump -D

Sık kullandığım parametreler şunlar:

  • -i: Dinlenecek ağ arayüzünü belirtir (eth0, ens3, bond0 gibi)
  • -n: IP adreslerini hostname’e çevirme (daha hızlı çalışır)
  • -nn: IP ve port isimlerini çevirme (80 yerine http yazmasın)
  • -v: Verbose, daha fazla bilgi göster
  • -vv: Daha da fazla detay
  • -vvv: Maksimum detay
  • -c: Belirtilen sayıda paket yakalandıktan sonra dur
  • -w: Paketleri bir dosyaya kaydet (.pcap formatı)
  • -r: Kaydedilmiş bir dosyadan oku
  • -s: Snap length, her paketten kaç byte yakalanacağını belirler (0 = tamamını yakala)
  • -X: Paket içeriğini hem hex hem ASCII olarak göster
  • -A: Paket içeriğini sadece ASCII olarak göster (HTTP gibi text protokoller için harika)
  • -e: Ethernet header bilgisini de göster (MAC adresleri)
  • -t: Zaman damgasını gösterme
  • -tttt: Okunabilir zaman damgası formatı kullan

Temel bir analiz için kullandığım standart komut şu şekilde:

# Okunabilir format, isim çözümlemesiz, tam paket içeriği
sudo tcpdump -i eth0 -nn -s 0 -v

Filtreleme: tcpdump’ın Asıl Gücü

Ham trafik yakalamak çoğu zaman işe yaramaz çünkü çok fazla gürültü oluşur. Filtreleme burada devreye giriyor. tcpdump, BPF (Berkeley Packet Filter) sözdizimini kullanır.

Host ve Port Filtreleri

# Belirli bir IP ile olan trafiği yakala
sudo tcpdump -i eth0 -nn host 192.168.1.100

# Belirli bir porta gelen ve giden trafiği yakala
sudo tcpdump -i eth0 -nn port 80

# Belirli bir IP'den belirli porta giden trafiği yakala
sudo tcpdump -i eth0 -nn src 192.168.1.100 and dst port 443

# Birden fazla port
sudo tcpdump -i eth0 -nn port 80 or port 443 or port 8080

# Belirli bir portu hariç tut (SSH gürültüsünü filtrele)
sudo tcpdump -i eth0 -nn not port 22

Protokol Filtreleri

# 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

# Sadece ARP paketleri
sudo tcpdump -i eth0 -nn arp

TCP Flag Filtreleri

TCP sorunlarını gidermede en çok kullandığım filtreler bunlar:

# Sadece SYN paketlerini yakala (yeni bağlantı denemeleri)
sudo tcpdump -i eth0 -nn 'tcp[tcpflags] & (tcp-syn) != 0'

# SYN-ACK paketleri (bağlantı kabul edildi)
sudo tcpdump -i eth0 -nn 'tcp[tcpflags] & (tcp-syn|tcp-ack) == (tcp-syn|tcp-ack)'

# RST paketleri (bağlantı kesildi veya reddedildi)
sudo tcpdump -i eth0 -nn 'tcp[tcpflags] & (tcp-rst) != 0'

# FIN paketleri (bağlantı kapatma)
sudo tcpdump -i eth0 -nn 'tcp[tcpflags] & (tcp-fin) != 0'

RST paketlerini görmek kritik. Eğer bir servise bağlanmaya çalışıyorsun ve karşı taraf RST gönderiyorsa, port erişilebilir ama bağlantıyı reddediyor demektir. Bu genellikle firewall kuralı değil, uygulamanın dinlememesi ya da güvenlik duvarının RST injection yapmasına işaret eder.

Gerçek Dünya Senaryoları

Senaryo 1: Web Uygulaması Zaman Aşımına Uğruyor

Kullanıcılar “connection timeout” hatası alıyor. Uygulama sunucusu çalışıyor gibi görünüyor ama bağlantılar tamamlanmıyor.

İlk yapacağım şey, hangi noktada kopukluğun yaşandığını görmek. Uygulama sunucusunda şunu çalıştırıyorum:

# HTTP/HTTPS trafiğini izle ve içeriği de göster
sudo tcpdump -i eth0 -nn -A -s 0 'tcp port 80 or tcp port 443' | head -200

# Sadece SYN paketlerini izle, bağlantılar geliyor mu?
sudo tcpdump -i eth0 -nn 'tcp[tcpflags] & (tcp-syn) != 0 and port 80'

Eğer SYN paketleri geliyor ama SYN-ACK dönmüyorsa sorun sunucudadır. SYN-ACK gönderilip yanıt gelmiyorsa sorun istemci tarafındadır ya da route sorunudur. Hiç SYN gelmiyorsa paketler sunucuya ulaşmıyordur.

Senaryo 2: DNS Sorunu Tespiti

Uygulamanın belirli host isimlerini çözemediği bildiriliyor. DNS mi çalışmıyor, yoksa yanlış nameserver mı kullanılıyor?

# DNS trafiğini izle (UDP 53 ve TCP 53)
sudo tcpdump -i eth0 -nn -v 'port 53'

# Belirli bir query için izle
sudo tcpdump -i eth0 -nn -v 'port 53 and host 8.8.8.8'

Bu çıktıda şunlara bakıyorum:

  • Query gidiyor mu?
  • Gidiyorsa yanıt geliyor mu?
  • Yanıt NXDOMAIN mu, SERVFAIL mi?
  • Hangi nameserver’a sorgu gönderiliyor?

Bazen problem şu oluyor: /etc/resolv.conf yanlış nameserver’ı işaret ediyor ve sorgular yanıtsız kalıyor. tcpdump ile sorgunun nereye gittiğini gördüğünde mesele hemen çözülüyor.

Senaryo 3: Database Bağlantı Sorunu

Uygulama loglarında “too many connections” ya da “connection refused” görüyorsun ama netstat veya ss ile port açık görünüyor.

# PostgreSQL veya MySQL bağlantılarını izle
sudo tcpdump -i lo -nn -v 'port 5432'
# ya da
sudo tcpdump -i eth0 -nn -v 'port 3306'

# RST paketleri var mı kontrol et
sudo tcpdump -i eth0 -nn 'tcp[tcpflags] & (tcp-rst) != 0 and port 5432'

Loopback interface’i (lo) izlemeyi unutma. Uygulama ve veritabanı aynı sunucudaysa trafik lo üzerinden geçer, eth0‘dan göremezsin.

RST paketleri görüyorsan ve hedef port veritabanı portuysa, veritabanı maksimum bağlantı limitine ulaşmış ve yeni bağlantıları reddediyor olabilir.

Senaryo 4: Yüksek Latency Analizi

Bir servis yavaş çalışıyor. Sorun ağda mı, yoksa uygulamada mı?

# Zaman damgalarıyla birlikte trafiği yakala ve dosyaya kaydet
sudo tcpdump -i eth0 -nn -tttt -s 0 -w /tmp/capture.pcap 'host 10.0.0.50 and port 8080'

# Birkaç dakika sonra durdur ve analiz et
sudo tcpdump -r /tmp/capture.pcap -nn -tttt | grep -E "(SYN|ACK|HTTP)"

Zaman damgalarına bakarak request-response arasındaki süreyi hesaplayabilirsin. SYN gönderilip SYN-ACK gelene kadar geçen süre ağ latency’sini gösterir. İstek gönderilip yanıt gelene kadar geçen süre ise uygulama response süresini işaret eder.

.pcap Dosyası Kaydetme ve Wireshark ile Analiz

Bazı durumlarda anlık analiz yeterli olmaz. Uzun süreli yakalama yapıp sonra detaylı inceleme gerekebilir.

# Tüm trafiği dosyaya kaydet, 100MB'tan büyük olmasın
sudo tcpdump -i eth0 -nn -s 0 -w /tmp/traffic.pcap -C 100

# Belirli bir süre sonra otomatik dur
sudo timeout 60 tcpdump -i eth0 -nn -s 0 -w /tmp/traffic.pcap

# Döngüsel kayıt: 10 adet 50MB dosya yaz, eskiyi sil
sudo tcpdump -i eth0 -nn -s 0 -w /tmp/capture-%H%M.pcap -C 50 -W 10

# Kaydedilen dosyayı oku ve analiz et
sudo tcpdump -r /tmp/traffic.pcap -nn -v 'port 443'

Dosyayı alıp yerel makinene kopyalayabilir ve Wireshark ile açabilirsin. Wireshark çok daha güçlü filtreleme ve görselleştirme sunar. Özellikle HTTP konuşmalarını Follow TCP Stream özelliğiyle tek bir akış olarak görmek paha biçilmez.

İleri Seviye Kullanım

Ağ Performansı Sorunlarını Tespit Etmek

# TCP retransmission'ları tespit et (paket kaybı işareti)
sudo tcpdump -i eth0 -nn -v 'tcp' | grep -i "retransmit"

# Büyük paketleri yakala (MTU sorunları için)
sudo tcpdump -i eth0 -nn 'greater 1400'

# Küçük paketleri izle (çok fazla küçük paket performansı düşürür)
sudo tcpdump -i eth0 -nn 'less 64'

ARP Sorunları

ARP sorunları genellikle IP çakışmalarına ya da yanlış MAC-IP eşleşmelerine yol açar:

# Tüm ARP trafiğini izle
sudo tcpdump -i eth0 -nn -e arp

# Belirli bir IP için ARP sorgularını izle
sudo tcpdump -i eth0 -nn -e 'arp and host 192.168.1.50'

Eğer bir IP için iki farklı MAC adresinin ARP yanıtı verdiğini görürsen, IP çakışması var demektir. Bu, ciddi ağ kararsızlığına yol açar.

Birden Fazla Sunucuyu Eş Zamanlı İzleme

Büyük bir sorunu takip ederken hem kaynak hem hedef sunucuda aynı anda tcpdump çalıştırmak çok değerlidir. Bunun için screen ya da tmux ile ayrı oturumlar aç:

# Sunucu A'da (kaynak)
sudo tcpdump -i eth0 -nn -tttt 'host 10.0.0.20 and port 8443' | tee /tmp/source.log

# Sunucu B'de (hedef)
sudo tcpdump -i eth0 -nn -tttt 'host 10.0.0.10 and port 8443' | tee /tmp/dest.log

İki log dosyasını karşılaştırdığında paketin nerede kaybolduğunu, nerede geciktiğini net olarak görebilirsin.

Pratik Filtre Kombinasyonları

Günlük işlerde en çok kullandığım hazır komutlar:

# Tüm HTTPS trafiğini izle, SSH hariç
sudo tcpdump -i eth0 -nn 'port 443 and not port 22'

# Belirli bir subnet'ten gelen trafiği izle
sudo tcpdump -i eth0 -nn 'src net 10.0.0.0/24'

# ICMP ve belirli bir host
sudo tcpdump -i eth0 -nn 'icmp and host 8.8.8.8'

# Broadcast ve multicast paketlerini izle (ağ keşfi sorunları için)
sudo tcpdump -i eth0 -nn 'broadcast or multicast'

# HTTP GET isteklerini göster
sudo tcpdump -i eth0 -nn -A -s 0 'tcp port 80' | grep "GET|POST|HTTP"

tcpdump Çıktısını Okumak

tcpdump çıktısını ilk gördüğünde biraz korkutucu görünebilir. Şu satırı ele alalım:

14:23:45.123456 IP 192.168.1.10.54321 > 10.0.0.1.80: Flags [S], seq 123456789, win 65535, options [mss 1460,sackOK,TS val 123456 ecr 0,nop,wscale 7], length 0

Bu satırı parçalara ayıralım:

  • 14:23:45.123456: Zaman damgası
  • IP: Protokol (IPv4)
  • 192.168.1.10.54321: Kaynak IP ve port
  • >: Yön
  • 10.0.0.1.80: Hedef IP ve port
  • Flags [S]: TCP flag, S = SYN
  • seq 123456789: Sequence numarası
  • win 65535: Window size (buffer)
  • length 0: Payload yok (SYN paketi veri taşımaz)

Flag değerleri:

  • [S]: SYN, yeni bağlantı talebi
  • [S.]: SYN-ACK, bağlantı kabul edildi
  • [.]: ACK, onay paketi
  • [P.]: PSH-ACK, veri gönderiliyor
  • [F.]: FIN-ACK, bağlantı kapatılıyor
  • [R]: RST, bağlantı kesildi veya reddedildi
  • [R.]: RST-ACK

Üç aşamalı TCP el sıkışması şöyle görünür:

14:23:45.100 IP client.54321 > server.80: Flags [S]      # SYN
14:23:45.102 IP server.80 > client.54321: Flags [S.]     # SYN-ACK
14:23:45.104 IP client.54321 > server.80: Flags [.]      # ACK
14:23:45.105 IP client.54321 > server.80: Flags [P.]     # Veri gönderimi

Bu dizinin herhangi bir noktasında kopukluk olursa, sorunun nerede yaşandığını tam olarak söyleyebilirsin.

Güvenlik ve Dikkat Edilmesi Gerekenler

tcpdump güçlü bir araç ama beraberinde sorumluluk getirir:

  • Üretim sistemlerde dikkatli kullan. Yüksek trafikli sistemlerde tcpdump CPU kullanımını artırabilir. -c ile paket sayısını sınırla ya da kısa süreli yakala.
  • Hassas veri içerebilir. Yakaladığın paketlerde şifresiz protokoller (HTTP, FTP, Telnet) üzerinden kullanıcı adı ve şifre geçebilir. .pcap dosyalarını güvenli saklı tut.
  • Log dosyası boyutuna dikkat et. -w ile yakalamaya başlarsan disk dolabilir. -C ve -W parametreleriyle döngüsel kayıt kullan.
  • tcpdump grubuna ekle. Root yerine tcpdump grubuna kullanıcı ekleyerek minimum yetki prensibiyle çalışabilirsin.
# Kullanıcıyı tcpdump grubuna ekle
usermod -aG tcpdump username

# Kernel capability ile root olmadan kullan
setcap cap_net_raw,cap_net_admin=eip /usr/sbin/tcpdump

Sonuç

tcpdump, ağ sorunlarını gidermede elinin altında bulunması gereken en temel araçlardan biri. GUI gerektirmeden, ek servis kurmadan, doğrudan ağ trafiğini görebilmek paha biçilmez bir yetenektir. Özellikle gece 3’te prodüksiyon sunucu yanmışken Wireshark kurmaya vaktinin olmadığı anlarda bu aracı ne kadar iyi bildiğin fark yaratır.

En önemli nokta şu: Paketlerin nereye kadar gittiğini görebilirsen, sorunun tam olarak nerede olduğunu anlarsın. Firewall önce mi düşürüyor, uygulama mı RST gönderiyor, DNS sorgusu yanıtsız mı kalıyor? Bunların hepsi tcpdump çıktısında yazılı.

Birkaç temel filtreyi ezbere bilmek, SYN/RST/FIN paketlerini okuyabilmek ve kaynak-hedef arasındaki trafik akışını takip edebilmek seni birçok sysadmin’den bir adım öne taşır. Gerisi deneyimle gelir.

Benzer Konular

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir