Ağ sorunlarını debug etmek, güvenlik olaylarını incelemek ya da sadece “bu trafik nereye gidiyor?” sorusunu yanıtlamak istediğinde, tcpdump her sysadmin’in baş vuracağı ilk araçlardan biri olmalı. GUI olmadan, sadece terminal ile paket seviyesinde ağı görebilmek inanılmaz güçlü bir beceri. Bu yazıda tcpdump’ı gerçek dünya senaryolarıyla, sıfırdan ileri seviyeye kadar ele alacağız.
tcpdump Nedir ve Neden Önemlidir?
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 hemen hemen tüm Linux dağıtımlarında ya kurulu gelir ya da kolayca kurulabilir.
Wireshark’ı biliyorsunuzdur, tcpdump onun komut satırı kardeşidir. Hatta daha da ileri gidersek, Wireshark da arka planda libpcap kullanır. Sunucuya SSH ile bağlıyken, GUI yokken, sadece bir terminal pencerenden ağda ne döndüğünü anlamak istediğinde tcpdump’ın yerini tutacak başka bir şey yok.
Kurulum oldukça basit:
# Debian/Ubuntu
sudo apt install tcpdump
# RHEL/CentOS/Rocky Linux
sudo dnf install tcpdump
# Arch Linux
sudo pacman -S tcpdump
Kurulumdan sonra hangi arayüzlerin dinlenebileceğini görmek için:
sudo tcpdump -D
Bu komut sana mevcut tüm ağ arayüzlerini listeler. eth0, ens3, bond0, hatta lo (loopback) bile burada görünür.
Temel Kullanım ve En Önemli Parametreler
tcpdump’ı doğrudan çalıştırmak çok fazla çıktı üretir ve terminal hızla dolup taşar. Bu yüzden filtreleri öğrenmeden önce temel parametreleri anlamak gerekiyor.
# En basit kullanım - varsayılan arayüzü dinle
sudo tcpdump
# Belirli bir arayüzü dinle
sudo tcpdump -i eth0
# Daha fazla detay göster (verbose)
sudo tcpdump -v -i eth0
# DNS çözümlemesini devre dışı bırak (daha hızlı çıktı)
sudo tcpdump -n -i eth0
# Port numaralarını servis adına çevirme
sudo tcpdump -nn -i eth0
Sık kullandığım parametreleri listeleyelim:
- -i interface: Hangi ağ arayüzünü dinleyeceğini belirtir (
-i anyile hepsini dinleyebilirsin) - -n: IP adreslerini hostname’e çevirme, böylece DNS sorguları atlanır
- -nn: Hem IP hem de port numaralarını çözümleme
- -v: Verbose mod, daha fazla paket detayı
- -vv: Daha da fazla detay
- -c sayı: Belirtilen sayıda paket yakaladıktan sonra dur
- -w dosya.pcap: Yakalanan paketleri dosyaya yaz
- -r dosya.pcap: Daha önce kaydedilen 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
- -s snap_length: Her paketten ne kadar byte yakalanacağını belirler (0 = tüm paket)
- -e: Ethernet header bilgilerini göster (MAC adresleri)
- -t: Timestamp gösterme
- -tttt: Tam tarih/saat formatında timestamp
BPF Filtreleri ile Hedefli Yakalama
tcpdump’ın gerçek gücü Berkeley Packet Filter (BPF) sözdizimindeki filtrelerde yatıyor. Filtresiz çalıştırdığında her şeyi yakalar, bu da hem performans açısından hem de okunabilirlik açısından kötü.
Host ve Ağ Filtreleri
# Belirli bir IP'den gelen/giden tüm trafiği yakala
sudo tcpdump -n -i eth0 host 192.168.1.100
# Sadece kaynak IP'ye göre filtrele
sudo tcpdump -n -i eth0 src 192.168.1.100
# Sadece hedef IP'ye göre filtrele
sudo tcpdump -n -i eth0 dst 192.168.1.100
# Tüm subnet trafiğini yakala
sudo tcpdump -n -i eth0 net 192.168.1.0/24
Port ve Protokol Filtreleri
# Belirli bir portu izle
sudo tcpdump -n -i eth0 port 443
# Port aralığı
sudo tcpdump -n -i eth0 portrange 8000-8100
# Sadece TCP trafiği
sudo tcpdump -n -i eth0 tcp
# Sadece UDP trafiği
sudo tcpdump -n -i eth0 udp
# ICMP trafiği (ping izleme)
sudo tcpdump -n -i eth0 icmp
Mantıksal Operatörler ile Karmaşık Filtreler
Filtreleri and, or, not operatörleriyle birleştirebilirsin:
# 192.168.1.100'den gelen HTTP veya HTTPS trafiği
sudo tcpdump -n -i eth0 'host 192.168.1.100 and (port 80 or port 443)'
# SSH dışındaki tüm TCP trafiği
sudo tcpdump -n -i eth0 'tcp and not port 22'
# Belirli iki host arasındaki trafik
sudo tcpdump -n -i eth0 'host 10.0.0.1 and host 10.0.0.2'
# Loopback hariç tüm DNS trafiği
sudo tcpdump -n -i any 'port 53 and not host 127.0.0.1'
Gerçek Dünya Senaryosu 1: Web Sunucusu Sorun Giderme
Diyelim ki bir Nginx sunucusunda 502 Bad Gateway hataları alıyorsun ve upstream bağlantısında sorun olduğunu düşünüyorsun. tcpdump bu durumda senin gözlerin olabilir.
# Nginx'in upstream ile konuştuğu trafiği izle
# Upstream sunucu 10.0.0.50:8080 üzerinde çalışıyor
sudo tcpdump -n -i eth0 'host 10.0.0.50 and port 8080' -A -c 100
# TCP flag'lerine bakarak RST paketlerini tespit et
# RST flag'i = bağlantı zorla kapatılmış
sudo tcpdump -n -i eth0 'tcp[tcpflags] & tcp-rst != 0'
# SYN paketlerini say - bağlantı kurulumu başarısız oluyor mu?
sudo tcpdump -n -i eth0 'tcp[tcpflags] == tcp-syn' -c 50
Bu komutlarla RST paketleri görüyorsan, upstream uygulama sunucusunun bağlantıları reddedip reddetmediğini anlayabilirsin. SYN gidip ACK gelmiyorsa güvenlik duvarı veya uygulama sorunu var demektir.
Gerçek Dünya Senaryosu 2: DNS Sorunlarını Debug Etme
DNS sorunları en sinir bozucu problemlerden biridir. Hangi DNS sorgularının yapıldığını ve hangi cevapların döndüğünü görmek için:
# Tüm DNS trafiğini yakala ve içeriğini göster
sudo tcpdump -n -i any -A 'port 53'
# Sadece belirli bir domain için DNS sorgusu izle
sudo tcpdump -n -i any -A 'port 53 and host 8.8.8.8'
# DNS sorgularını daha okunaklı formatta kaydet
sudo tcpdump -n -i any -v 'port 53' -w /tmp/dns_debug.pcap
Sonra bu pcap dosyasını Wireshark ile açabilir ya da tcpdump ile tekrar okuyabilirsin:
sudo tcpdump -n -r /tmp/dns_debug.pcap -v
Paket İçeriklerini Okuma
Bazen paketin içinde ne olduğunu görmek gerekir. HTTP trafiğini incelerken bu çok işe yarar.
# HTTP GET isteklerini göster (şifrelenmemiş trafik)
sudo tcpdump -n -i eth0 -A 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
# Daha basit: sadece port 80 trafiğini ASCII olarak göster
sudo tcpdump -n -i eth0 -A -s 0 'port 80'
# Paket içeriğini hem hex hem ASCII ile göster
sudo tcpdump -n -i eth0 -X -s 0 'port 80' -c 20
Burada -s 0 parametresi çok önemli. Varsayılan olarak tcpdump her paketten sadece 262 byte yakalar. -s 0 ile tüm paket içeriğini yakalamış olursun.
Pcap Dosyasına Kaydetme ve Analiz
Üretim ortamlarında genellikle trafik yakalamayı dosyaya kaydedip sonra analiz edersin. Bunu özellikle güvenlik olaylarında ve karmaşık debug senaryolarında sıkça yaparsın.
# Tüm trafiği dosyaya kaydet
sudo tcpdump -i eth0 -w /tmp/capture.pcap
# Belirli bir süre sonra otomatik dur (-G saniye cinsinden rotasyon)
sudo tcpdump -i eth0 -w /tmp/capture_%Y%m%d_%H%M%S.pcap -G 300 -C 100
# Dosya boyutunu 100MB ile sınırla
sudo tcpdump -i eth0 -w /tmp/capture.pcap -C 100
# Maksimum 5 dosya tut (-W)
sudo tcpdump -i eth0 -w /tmp/cap.pcap -C 50 -W 5
Buradaki parametreler:
- -G saniye: Belirtilen sürede dosyayı döndür (rotate)
- -C boyut_MB: Dosya bu boyuta ulaşınca yeni dosya aç
- -W sayı: Maksimum dosya sayısı, eski dosyaların üzerine yazar
Kaydedilen dosyayı sonradan okumak için:
# Kayıtlı pcap dosyasını oku
sudo tcpdump -r /tmp/capture.pcap
# Filtre uygulayarak oku
sudo tcpdump -r /tmp/capture.pcap 'port 443'
# Sadece belirli IP'leri göster
sudo tcpdump -n -r /tmp/capture.pcap 'host 10.0.0.1'
Gerçek Dünya Senaryosu 3: Güvenlik Olayı Analizi
Bir sunucunun dışarıya olağandışı trafik gönderdiğinden şüpheleniyorsun. Hızlıca ne olduğuna bakmak için:
# Sunucudan dışarıya giden tüm bağlantıları izle
# Kendi IP'n 10.0.0.5 ise
sudo tcpdump -n -i eth0 'src 10.0.0.5 and not (dst net 10.0.0.0/8)'
# Şüpheli portlara bağlantı var mı?
sudo tcpdump -n -i eth0 'src 10.0.0.5 and (dst port 4444 or dst port 6666 or dst port 31337)'
# Büyük hacimli veri transferlerini tespit et
# Sadece 1000 byte'tan büyük paketleri göster
sudo tcpdump -n -i eth0 'src 10.0.0.5 and greater 1000' -c 200
# Tüm outbound trafiği 60 saniye kaydet, sonra analiz et
sudo tcpdump -n -i eth0 -w /tmp/security_incident.pcap 'src 10.0.0.5' -G 60 -W 1
Eğer düzensiz aralıklarla dış IP’lere bağlantı görüyorsan, bu bir C2 (Command & Control) iletişiminin işareti olabilir. pcap dosyasını alıp Wireshark’ta daha detaylı inceleyebilirsin.
Gerçek Dünya Senaryosu 4: Yavaş Uygulama Performans Analizi
Bir uygulama yavaş çalışıyor ve network gecikmesinin mi yoksa uygulama yanıt süresinin mi sorun olduğunu bulmak istiyorsun.
# TCP SYN ve SYN-ACK arasındaki farkı görmek için tüm bağlantı kurulumlarını izle
sudo tcpdump -n -i eth0 -tttt 'tcp[tcpflags] & (tcp-syn|tcp-ack) != 0 and port 5432'
# PostgreSQL bağlantılarını izle (port 5432)
sudo tcpdump -n -i eth0 'host 10.0.0.10 and port 5432' -w /tmp/db_traffic.pcap
# Retransmission'ları tespit et (paket kayıpları)
# TCP retransmission = ağda paket kaybı oluyor demek
sudo tcpdump -n -i eth0 'tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack != 0' -c 50
pcap dosyasını aldıktan sonra tshark (Wireshark’ın komut satırı versiyonu) ile analiz edebilirsin:
# tshark ile TCP RTT değerlerini hesapla
tshark -r /tmp/db_traffic.pcap -T fields -e tcp.analysis.ack_rtt | sort -n | tail -20
Gelişmiş Filtre Teknikleri
BPF filtreleri byte offset ile çok güçlü filtreleme yapmanı sağlar. Biraz daha ileri gidelim:
# TCP SYN paketlerini yakala (yeni bağlantı başlatmaları)
sudo tcpdump -n 'tcp[13] = 2'
# TCP RST paketlerini yakala (zorla kapanan bağlantılar)
sudo tcpdump -n 'tcp[13] & 4 != 0'
# HTTP GET isteklerini yakala (payload'a bakarak)
sudo tcpdump -n -A 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'
# ICMP echo request (ping) paketleri
sudo tcpdump -n 'icmp[icmptype] = icmp-echo'
# TTL değeri 1 olan paketler (traceroute tespiti)
sudo tcpdump -n 'ip[8] = 1'
tcpdump Çıktısını Anlamak
tcpdump çıktısını ilk gördüğünde biraz korkutucu gelebilir. Şöyle bir satır göreceksin:
14:23:45.123456 IP 192.168.1.10.54321 > 93.184.216.34.443: Flags [S], seq 1234567890, win 65535, options [mss 1460,sackOK,TS val 12345 ecr 0,nop,wscale 7], length 0
Bu satırı parçalayalım:
- 14:23:45.123456: Timestamp
- IP: Protokol tipi
- 192.168.1.10.54321: Kaynak IP ve port
- 93.184.216.34.443: Hedef IP ve port
- Flags [S]: TCP flag’leri – S=SYN, A=ACK, F=FIN, R=RST, P=PSH
- seq 1234567890: Sequence numarası
- win 65535: Window size
- length 0: Payload boyutu
TCP flag kombinasyonları:
- [S]: SYN – yeni bağlantı isteği
- [S.]: SYN-ACK – bağlantı kabul edildi
- [.]: ACK – onaylama paketi
- [P.]: PSH-ACK – veri gönderimi
- [F.]: FIN-ACK – bağlantı kapatma
- [R.]: RST-ACK – bağlantı zorla kapatıldı
- [R]: RST – bağlantı reddedildi
Pratik Tek Satır Komutlar
Günlük işlerde işine yarayacak hazır komutlar:
# En çok bağlantı kuran IP'leri bul (tcpdump + awk kombinasyonu)
sudo tcpdump -n -i eth0 'tcp[tcpflags] & tcp-syn != 0' -c 1000 2>/dev/null |
awk '{print $3}' | cut -d. -f1-4 | sort | uniq -c | sort -rn | head -20
# Ağdaki tüm HTTP isteklerinin URL'lerini göster
sudo tcpdump -n -i eth0 -A -s 0 'port 80' 2>/dev/null |
grep -oP 'Host: K[^r]+|GET K[^ ]+|POST K[^ ]+' | head -50
# Belirli bir süre trafik yakala ve istatistik ver
sudo timeout 30 tcpdump -n -i eth0 -w /dev/null 2>&1 | tail -3
# NTP senkronizasyon trafiğini izle
sudo tcpdump -n -i eth0 'port 123' -v
# ARP trafiğini izle (ağdaki yeni cihazları tespit et)
sudo tcpdump -n -i eth0 arp -e
Performans ve En İyi Pratikler
Üretim ortamında tcpdump kullanırken dikkat etmen gereken birkaç önemli nokta var:
Yük altındaki sistemlerde dikkatli ol. tcpdump CPU ve bellek kullanır. Çok yoğun trafik ortamında filtresiz çalıştırırsan sistem üzerinde ciddi yük oluşturabilir.
Buffer boyutunu artır. Paket kaybı yaşıyorsan:
sudo tcpdump -i eth0 -B 4096 -w /tmp/capture.pcap
-B parametresi kernel buffer boyutunu KB cinsinden ayarlar. Varsayılan genellikle 2048KB’tır.
Snap length’i optimize et. Sadece header bilgisi yeterliyse:
# Sadece ilk 96 byte'ı yakala (header bilgisi için yeterli)
sudo tcpdump -i eth0 -s 96 -w /tmp/capture.pcap
Root yerine tcpdump grubuna ekle. Her seferinde sudo kullanmak istemiyorsan:
sudo groupadd pcap
sudo usermod -aG pcap kullanici_adi
sudo chgrp pcap /usr/sbin/tcpdump
sudo chmod 750 /usr/sbin/tcpdump
sudo setcap cap_net_raw,cap_net_admin=eip /usr/sbin/tcpdump
Wireshark ile Entegrasyon
tcpdump ile kaydettiğin pcap dosyalarını Wireshark ile açabilirsin. Hatta uzak sunucudaki trafiği doğrudan kendi makinendeki Wireshark’ta görmek mümkün:
# Uzak sunucudaki trafiği SSH üzerinden yerel Wireshark'a aktar
ssh root@uzak-sunucu "tcpdump -n -i eth0 -w - 'not port 22'" | wireshark -k -i -
Bu komut muhteşem bir kombinasyon. Uzak sunucuda tcpdump çalışır, çıktı SSH tünelinden geçer ve yerel Wireshark’ında canlı görüntülenir. SSH trafiğini hariç tutmayı unutma (not port 22), aksi halde sonsuz döngüye girersin.
Sonuç
tcpdump, sysadmin araç kutusunun vazgeçilmez bir parçası. Öğrenme eğrisi başlangıçta biraz dik görünebilir, özellikle BPF filtreleri ve TCP flag’leri konusunda. Ama bir kez alıştığında, ağda ne döndüğünü anlamak için inanılmaz güçlü bir bakış açısı kazanıyorsun.
Tavsiyem şu: Her gün birkaç dakika bir test ortamında tcpdump ile oyna. Kendi makinende basit bir HTTP isteği yap ve bunu izle. Ping at ve ICMP paketlerini gözlemle. DNS sorgularının nasıl göründüğünü incele. Bu pratik deneyim, gerçek bir sorunla karşılaştığında sana çok şey kazandıracak.
Son olarak, üretim ortamında pcap yakalamayı bir güvenlik politikasına bağlamanı öneririm. Paket yakalama, ağdaki her şeyi görünür kılar ve yanlış ellerde ciddi bir güvenlik riski oluşturabilir. Yakaladığın dosyaları şifreli ortamlarda sakla, işin bitince sil ve her zaman yetkili olduğun sistemlerde kullan.