tcpdump ile Komut Satırından Ağ Trafiği Yakalama
Ağ sorunlarını debug etmek, şüpheli trafiği analiz etmek ya da bir servisin gerçekte ne gönderip ne aldığını görmek istediğinizde, tcpdump her zaman ilk başvurulacak araç olmuştur. GUI’si yoktur, süslü bir arayüzü yoktur ama ne istediğinizi tam olarak biliyorsanız, Wireshark dahil hiçbir araç onun hızına ve esnekliğine yetişemez. Bu yazıda tcpdump‘ı sıfırdan öğrenmek isteyenler için temel kullanımdan başlayıp, gerçek hayatta işinize yarayacak ileri seviye senaryolara kadar her şeyi ele alacağız.
tcpdump Nedir ve Neden Bu Kadar Önemlidir
tcpdump, libpcap kütüphanesini kullanarak ağ arayüzlerinden paket yakalayan bir komut satırı aracıdır. 1988 yılında geliştirilmiş olmasına rağmen bugün hâlâ aktif olarak kullanılıyor. Bunun sebebi basit: işini kusursuz yapıyor.
Bir sistem yöneticisi olarak benim için tcpdump‘ın önemi şuradan geliyor: SSH üzerinden bağlandığınız uzak bir sunucuda bile çalışır. GUI kurmanıza gerek yoktur, X11 forwarding ayarlamanıza gerek yoktur. Sadece terminali açarsınız ve paketi yakalamaya başlarsınız.
Üstelik üretim ortamlarında Wireshark kurmak her zaman mümkün veya uygun olmayabilir. Minimal kurulum yapmış bir sunucuya, bir Docker container’ına veya bir Kubernetes pod’una Wireshark kurmak yerine, tcpdump ile yakaladığınız .pcap dosyasını local makinenize çekip Wireshark’ta analiz edebilirsiniz.
Kurulum
Çoğu Linux dağıtımında tcpdump ya önceden kurulu gelir ya da standart paket deposundan kolayca kurulabilir.
# Debian/Ubuntu
sudo apt update && sudo apt install tcpdump -y
# RHEL/CentOS/Rocky Linux
sudo dnf install tcpdump -y
# Arch Linux
sudo pacman -S tcpdump
# Versiyon kontrolü
tcpdump --version
tcpdump‘ı çalıştırmak için genellikle root yetkisi veya CAP_NET_RAW capability’si gerekir. Eğer sudo kullanmadan çalıştırmak isterseniz, kullanıcınızı pcap grubuna ekleyebilirsiniz:
sudo groupadd pcap
sudo usermod -aG pcap $USER
sudo chgrp pcap /usr/sbin/tcpdump
sudo chmod 750 /usr/sbin/tcpdump
sudo setcap cap_net_raw,cap_net_admin=eip /usr/sbin/tcpdump
Temel Parametreler ve Kullanım
tcpdump‘ın onlarca parametresi var ama günlük işlerde en çok kullandıklarımı şöyle sıralayabilirim:
- -i: Dinlenecek ağ arayüzünü belirtir (
-i eth0,-i any) - -n: IP adreslerini hostname’e çözümleme yapmaz, daha hızlı çalışır
- -nn: IP adresleri ve port numaralarını çözümleme yapmaz
- -v: Verbose mod, daha fazla bilgi gösterir
- -vv: Daha da fazla detay
- -c: Belirtilen sayıda paket yakalandıktan sonra durur
- -w: Yakalanan paketleri dosyaya yazar (pcap formatı)
- -r: Daha önce kaydedilmiş pcap dosyasını okur
- -A: Paket içeriğini ASCII olarak gösterir
- -X: Paket içeriğini hem hex hem ASCII olarak gösterir
- -s: Snap length, kaç byte yakalanacağını belirler (0 = tam paket)
- -e: Ethernet header bilgilerini de gösterir
- -l: Çıktıyı line-buffered yapar, pipe ile kullanımda işe yarar
- -q: Daha az protokol bilgisi gösterir, özet çıktı
- -D: Mevcut ağ arayüzlerini listeler
Kullanılabilir arayüzleri görmek için:
sudo tcpdump -D
# ya da
ip link show
İlk Yakalamalar: Basit Örnekler
En temel kullanım, bir arayüzdeki tüm trafiği yakalamaktır. Ama dikkatli olun, yoğun bir sunucuda bu çok fazla çıktı üretir.
# eth0 üzerindeki tüm trafiği yakala
sudo tcpdump -i eth0
# Tüm arayüzleri dinle
sudo tcpdump -i any
# Hostname çözümlemesi yapma, ilk 100 paketi yakala
sudo tcpdump -i eth0 -nn -c 100
# Trafiği verbose modda yakala ve dosyaya yaz
sudo tcpdump -i eth0 -nn -v -w /tmp/capture.pcap
# Kaydedilmiş dosyayı oku
sudo tcpdump -r /tmp/capture.pcap
Filtreler: tcpdump’ın Asıl Gücü
tcpdump‘ı güçlü kılan şey BPF (Berkeley Packet Filter) filtrelerdir. Bu filtreler sayesinde sadece ilgilendiğiniz trafiği yakalayabilirsiniz.
Host ve Ağ Filtreleri
# Belirli bir IP ile olan tüm trafiği yakala
sudo tcpdump -i eth0 -nn host 192.168.1.100
# Belirli bir IP'den gelen trafiği yakala
sudo tcpdump -i eth0 -nn src 192.168.1.100
# Belirli bir IP'ye giden trafiği yakala
sudo tcpdump -i eth0 -nn dst 192.168.1.100
# Belirli bir subnet'teki trafiği yakala
sudo tcpdump -i eth0 -nn net 192.168.1.0/24
# Birden fazla host (OR mantığı)
sudo tcpdump -i eth0 -nn host 192.168.1.100 or host 192.168.1.101
# Belirli bir host'u hariç tut (NOT mantığı)
sudo tcpdump -i eth0 -nn not host 192.168.1.1
Port ve Protokol Filtreleri
# Sadece HTTP trafiğini yakala
sudo tcpdump -i eth0 -nn port 80
# Belirli portları hariç tut (SSH trafiğini exclude et)
sudo tcpdump -i eth0 -nn not port 22
# Port aralığı
sudo tcpdump -i eth0 -nn portrange 8000-9000
# Sadece TCP trafiği
sudo tcpdump -i eth0 -nn tcp
# Sadece UDP trafiği
sudo tcpdump -i eth0 -nn udp
# ICMP trafiği (ping)
sudo tcpdump -i eth0 -nn icmp
# DNS trafiği (UDP 53)
sudo tcpdump -i eth0 -nn udp port 53
Kombinasyon Filtreleri: Gerçek Hayat Senaryoları
İşte burada işler gerçekten ilginç olmaya başlıyor. Birden fazla filtreyi and, or, not operatörleriyle birleştirebilirsiniz.
# 192.168.1.100'den gelen HTTP veya HTTPS trafiği
sudo tcpdump -i eth0 -nn src host 192.168.1.100 and (port 80 or port 443)
# Belirli bir sunucuya giden HTTPS trafiği, SSH hariç
sudo tcpdump -i eth0 -nn dst host 10.0.0.50 and tcp and not port 22
# DNS sorguları ve yanıtları (küçük UDP paketleri)
sudo tcpdump -i eth0 -nn udp port 53 and udp[10] & 0x80 = 0
Gerçek Hayat Senaryoları
Senaryo 1: Web Sunucusu Debug
Bir web uygulaması beklenmedik davranışlar sergiliyyor ve HTTP isteklerini/yanıtlarını görmek istiyorsunuz.
# HTTP trafiğini ASCII olarak göster, içerikleri de yakala
sudo tcpdump -i eth0 -nn -A -s 0 port 80
# Daha da detaylı, hem hex hem ASCII
sudo tcpdump -i eth0 -nn -X -s 0 port 80 and host 192.168.1.100
# Sadece GET isteklerini yakala (payload içinde arama)
sudo tcpdump -i eth0 -nn -A -s 0 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'
Bu son filtre biraz karmaşık görünüyor ama aslında TCP payload’ının ilk 4 byte’ının “GET ” (0x47455420) olup olmadığını kontrol ediyor.
Senaryo 2: Şüpheli Trafik Analizi
Bir sunucunuzun beklenmedik dış bağlantılar kurduğundan şüpheleniyorsunuz.
# Sunucudan dışarıya yapılan tüm bağlantıları yakala
# (Kendi subnet'iniz dışına giden trafik)
sudo tcpdump -i eth0 -nn src net 10.0.0.0/8 and not dst net 10.0.0.0/8
# Uzun süreli yakalama için dosyaya yaz, her 100MB'da yeni dosya aç
sudo tcpdump -i eth0 -nn -w /tmp/suspicious_%Y%m%d_%H%M%S.pcap
-G 3600 -C 100 not port 22
# Yakalama sırasında anlık port istatistikleri için
sudo tcpdump -i eth0 -nn -q | awk '{print $5}' |
grep -oP '[d.]+.Kd+' | sort | uniq -c | sort -rn | head -20
Senaryo 3: Database Bağlantı Sorunları
MySQL veya PostgreSQL bağlantılarında sorun yaşanıyor.
# MySQL trafiğini izle (port 3306)
sudo tcpdump -i eth0 -nn -A -s 0 port 3306
# PostgreSQL trafiği (port 5432)
sudo tcpdump -i eth0 -nn -A -s 0 port 5432
# Uygulama sunucusundan DB sunucusuna giden trafik
sudo tcpdump -i eth0 -nn src host 10.0.0.10 and dst host 10.0.0.20 and port 3306
Senaryo 4: DNS Sorunlarını Çözmek
DNS çözümleme yavaş mı? Yanlış DNS sunucusu mu kullanılıyor?
# Tüm DNS sorgularını izle
sudo tcpdump -i eth0 -nn -v udp port 53
# Hangi domainlerin sorgulandığını görmek için
sudo tcpdump -i eth0 -nn udp port 53 -A | grep -E "A? |AAAA?"
# DNS yanıt sürelerini analiz etmek için (query ve response eşleştirme)
sudo tcpdump -i eth0 -nn udp port 53 -w /tmp/dns_capture.pcap
Senaryo 5: SYN Flood Tespiti
Bir DDoS saldırısından şüpheleniyorsunuz.
# Sadece SYN paketlerini yakala (connection attempt)
sudo tcpdump -i eth0 -nn 'tcp[tcpflags] & (tcp-syn) != 0 and tcp[tcpflags] & (tcp-ack) == 0'
# SYN paketlerinin kaynak IP'lerini say
sudo tcpdump -i eth0 -nn -c 1000 'tcp[tcpflags] == tcp-syn' |
awk '{print $3}' | cut -d. -f1-4 | sort | uniq -c | sort -rn | head -20
# RST bayraklı paketleri izle (reddedilen bağlantılar)
sudo tcpdump -i eth0 -nn 'tcp[tcpflags] & (tcp-rst) != 0'
Uzak Sunucuda Yakalama, Wireshark’ta Analiz
Bu benim en sevdiğim workflow’lardan biri. Uzak sunucuda tcpdump ile yakalayıp, yerel makinede Wireshark ile analiz etmek.
# SSH üzerinden gerçek zamanlı yakalama ve yerel Wireshark'a gönderme
ssh kullanici@uzak-sunucu "sudo tcpdump -i eth0 -nn -s 0 -w - port 80" |
wireshark -k -i -
# Veya önce dosyaya kaydet, sonra çek
ssh kullanici@uzak-sunucu "sudo tcpdump -i eth0 -nn -s 0 -c 10000 -w /tmp/capture.pcap port 443"
scp kullanici@uzak-sunucu:/tmp/capture.pcap ~/Desktop/
# Yerel Wireshark ile aç
wireshark ~/Desktop/capture.pcap
Bu yöntem özellikle şifreli trafiği analiz ederken veya uzun süreli yakalamalar yaparken çok işe yarar.
Çıktıyı Okumak
tcpdump çıktısını ilk gördüğünüzde biraz korkutucu gelebilir. Tipik bir çıktı satırı şöyle görünür:
14:23:45.123456 IP 192.168.1.100.54321 > 93.184.216.34.80: Flags [S], seq 1234567890, win 65535, options [mss 1460,sackOK,TS val 123456 ecr 0,nop,wscale 7], length 0
Bu satırı şöyle okuyabilirsiniz:
- 14:23:45.123456: Paket zamanı (mikrosaniye hassasiyetle)
- IP: Protokol türü
- 192.168.1.100.54321: Kaynak IP ve port
- 93.184.216.34.80: Hedef IP ve port
- Flags [S]: TCP flag’leri (S=SYN, A=ACK, F=FIN, R=RST, P=PUSH)
- seq: Sequence numarası
- win: Window size
- length: Payload uzunluğu
TCP bayraklarını tanımak önemli:
- [S]: SYN, yeni bağlantı başlatma
- [S.]: SYN-ACK, bağlantı kabul
- [.]: ACK, onay
- [P.]: PSH-ACK, veri gönderimi
- [F.]: FIN-ACK, bağlantı kapatma
- [R]: RST, bağlantıyı zorla kes
- [R.]: RST-ACK
İleri Seviye: tcpdump ile Scripting
tcpdump‘ı shell scriptleriyle birleştirdiğinizde gerçekten güçlü araçlar elde edebilirsiniz.
#!/bin/bash
# Belirli bir IP'den gelen trafiği izle ve alert üret
# Kullanım: ./monitor.sh 192.168.1.100
TARGET_IP=$1
LOG_FILE="/var/log/traffic_monitor.log"
ALERT_THRESHOLD=100 # 60 saniyede bu kadar paketten fazlası alert üretir
echo "$(date): Monitoring started for $TARGET_IP" >> $LOG_FILE
sudo tcpdump -i eth0 -nn -l host $TARGET_IP 2>/dev/null |
while read line; do
echo "$(date +%H:%M:%S) $line" >> $LOG_FILE
# Son 60 saniyedeki paket sayısını kontrol et
RECENT=$(grep -c "$(date +%H:%M)" $LOG_FILE 2>/dev/null)
if [ "$RECENT" -gt "$ALERT_THRESHOLD" ]; then
echo "ALERT: High traffic from $TARGET_IP - $RECENT packets/min" |
mail -s "Traffic Alert" [email protected]
fi
done
# Belirli aralıklarla otomatik pcap dosyası rotasyonu
sudo tcpdump -i eth0 -nn
-w "/var/log/pcap/capture_%Y%m%d_%H%M%S.pcap"
-G 300
-C 50
not port 22
# -G 300: Her 300 saniyede (5 dakikada) yeni dosya aç
# -C 50: Her 50MB'da yeni dosya aç
Performans İpuçları
Yoğun trafik olan ortamlarda tcpdump kullanırken bazı noktalara dikkat etmeniz gerekiyor:
Snap length’i ayarlayın: Tam paket içeriğine ihtiyaç duymuyorsanız sadece header kısmını yakalayın.
# Sadece ilk 96 byte'ı yakala (header bilgileri için genellikle yeterli)
sudo tcpdump -i eth0 -nn -s 96 -w /tmp/capture.pcap
# Tam paket için
sudo tcpdump -i eth0 -nn -s 0 -w /tmp/capture.pcap
Buffer boyutunu artırın: Yoğun trafikte paket kaybını önlemek için:
# Buffer boyutunu 8MB yap (default 2MB)
sudo tcpdump -i eth0 -nn -B 8192 -w /tmp/capture.pcap
Mümkün olduğunca spesifik filtre kullanın: Ne kadar spesifik filtre yazarsanız, sistem üzerindeki yük o kadar az olur. “Tüm trafiği yakala” yerine sadece analiz etmek istediğiniz trafiği hedefleyin.
Timestamp formatını ayarlayın:
# Unix timestamp kullan (daha hızlı)
sudo tcpdump -i eth0 -nn -tt
# Mutlak timestamp
sudo tcpdump -i eth0 -nn -ttt
# Tarih ve saat birlikte
sudo tcpdump -i eth0 -nn -tttt
Güvenlik Notları
tcpdump güçlü bir araç olduğu için dikkatli kullanılması gerekiyor:
tcpdump‘ı çalıştırmak içinrootveya yüksek yetki gerektiği için, yakaladığınız paketlerde şifreler dahil her türlü veri görünebilir. Yakaladığınız pcap dosyalarını güvenli bir şekilde saklayın.
- Yasal ve etik sınırlar içinde kalın. Sadece yetkili olduğunuz ağlarda trafik yakalayın.
- Uzun süreli yakalamalar disk dolmasına neden olabilir.
-Cve-Gparametreleriyle dosya boyutunu ve rotasyonu kontrol edin.
- Pcap dosyalarında hassas veri bulunabilir.
chmod 600ile sadece root’un okuyabileceği şekilde koruyun.
# Yakalama bitince dosyayı güvenli hale getir
sudo tcpdump -i eth0 -nn -w /var/log/capture.pcap port 80
sudo chmod 600 /var/log/capture.pcap
Faydalı Alias’lar
.bashrc veya .zshrc dosyanıza ekleyebileceğiniz pratik alias’lar:
# Hızlı HTTP izleme
alias tcphttp='sudo tcpdump -i any -nn -A -s 0 port 80'
# DNS izleme
alias tcpdns='sudo tcpdump -i any -nn udp port 53'
# Belirli IP izleme (kullanım: tcpip 192.168.1.100)
alias tcpip='sudo tcpdump -i any -nn host'
# SYN paketleri (connection attempt'ler)
alias tcpsyn='sudo tcpdump -i any -nn "tcp[tcpflags] == tcp-syn"'
# ICMP (ping)
alias tcpping='sudo tcpdump -i any -nn icmp'
Sonuç
tcpdump, bir sistem yöneticisinin toolbox’ında olmazsa olmaz araçlardan biridir. Öğrenmesi biraz zaman alabilir, özellikle BPF filtre sözdizimine alışmak başlangıçta zorlayıcı gelebilir. Ama bir kez bu filtreleri özümsediğinizde, ağ sorunlarına yaklaşımınız tamamen değişiyor.
Ben şahsen tcpdump‘ı en çok üç durumda kullanıyorum: Bir servis beklenmedik davranış gösterdiğinde gerçekte ne gönderip aldığını görmek için, güvenlik olaylarında şüpheli trafiği belgelemek için ve yeni bir sistem kurarken her şeyin doğru çalışıp çalışmadığını doğrulamak için.
Eğer tcpdump çıktısını görsel olarak analiz etmek istiyorsanız, yakaladığınız .pcap dosyalarını Wireshark ile açabilirsiniz. Bu iki aracı birlikte kullanmak, özellikle karmaşık sorunları çözme konusunda inanılmaz derecede etkili oluyor.
Son olarak şunu söyleyeyim: tcpdump‘ı öğremenin en iyi yolu kullanmaktır. Test ortamınızda deney yapın, farklı filtreler deneyin, çıktıları okumaya alışın. Birkaç hafta içinde ağ sorunlarına bakış açınızın tamamen değiştiğini fark edeceksiniz.
