tcpdump ile Filtreleme: BPF Kuralları ve Örnekler

Ağ sorunlarını debug ederken ya da güvenlik olaylarını araştırırken elinin altında güvenilir bir araç olması hayat kurtarır. tcpdump, bu noktada tartışmasız en değerli araçlardan biri. Kurulum gerektirmiyor (çoğu distro’da zaten yüklü), hafif, ve en önemlisi Berkeley Packet Filter (BPF) söz dizimiyle son derece esnek filtreler yazmanı sağlıyor. Bu yazıda tcpdump’ın BPF filtre mekanizmasını derinlemesine inceleyeceğiz, gerçek dünya senaryolarıyla desteklenmiş pratik örneklere bakacağız.

BPF Nedir, Neden Önemli?

BPF (Berkeley Packet Filter), kernel seviyesinde çalışan bir paket filtreleme mekanizmasıdır. Kullanıcı alanına paket göndermeden önce kernel’in kendisinde filtreleme yapması demek; bu da gereksiz paketlerin userspace’e kopyalanmaması anlamına gelir. Sonuç olarak hem performans kazanırsın hem de sistemde daha az overhead oluşur.

Pratikte ne demek bu? Diyelim ki saniyede 100.000 paket geçen bir sunucuda sadece SSH trafiğini izliyorsun. BPF olmadan tüm paketler userspace’e kopyalanır, tcpdump her birini kontrol eder. BPF ile kernel sadece port 22 trafiğini geçirir. Fark gecede gündüz gibi.

Yeni kernel’lerde eBPF (extended BPF) çok daha güçlü hale geldi ama tcpdump hala klasik BPF kullanır ve bu öğrenmesi gereken temel bilgi.

Temel Kullanım ve Önemli Parametreler

Filtrelere geçmeden önce sık kullandığım tcpdump parametrelerini hızlıca geçelim:

-i: Dinlenecek interface’i belirtir (eth0, ens3, any gibi) -n: IP adreslerini hostname’e çevirme (DNS sorgusu yapmaz, hız kazanırsın) -nn: IP ve port’ları sayısal göster -v / -vv / -vvv: Verbosity seviyesi, detay miktarını artırır -c: Kaç paket yakalanacağını belirtir -w: Çıktıyı pcap dosyasına yazar -r: pcap dosyasından okur -s: Snap length, paketin kaç byte’ını yakala (0 = tamamı) -A: Paket içeriğini ASCII olarak göster -X: Paket içeriğini hex ve ASCII olarak göster -e: Ethernet header bilgilerini göster -t: Timestamp gösterme -q: Quiet mode, daha az bilgi göster

Temel bir yakalama komutu şöyle görünür:

tcpdump -i eth0 -nn -v -c 100

Bu komut eth0 interface’inde 100 paket yakalar, DNS çözümlemesi yapmaz, verbose modda çalışır.

BPF Filtre Söz Dizimi

BPF filtreleri üç temel primitive üzerine kuruludur:

Tip belirteçleri: host, net, port, portrange Yön belirteçleri: src, dst, src or dst, src and dst Protokol belirteçleri: tcp, udp, icmp, arp, ip, ip6, ether

Bu primitive’leri mantıksal operatörlerle birleştirebilirsin:

and (&&): Her iki koşul da sağlanmalı or (||): Koşullardan biri sağlanmalı not (!): Koşul sağlanmamalı (): Gruplama için parantez kullan (shell’de escape etmeyi unutma)

Host ve IP Filtreleme

En sık kullanılan filtreleme türü belirli bir IP’ye ait trafiği izlemek:

# Tek bir host ile ilgili tüm trafiği yakala
tcpdump -i eth0 -nn host 192.168.1.100

# Sadece bu host'tan gelen trafiği izle
tcpdump -i eth0 -nn src host 192.168.1.100

# Bu host'a giden trafiği izle
tcpdump -i eth0 -nn dst host 192.168.1.100

# İki host arasındaki trafiği izle
tcpdump -i eth0 -nn host 192.168.1.100 and host 192.168.1.200

Subnet bazlı filtreleme de çok işe yarıyor. Özellikle bir network segment’ini izlerken:

# Tüm /24 subnet trafiğini yakala
tcpdump -i eth0 -nn net 192.168.1.0/24

# Bu subnet'ten kaynaklanan trafiği filtrele
tcpdump -i eth0 -nn src net 10.0.0.0/8

# İki subnet arasındaki trafiği izle
tcpdump -i eth0 -nn "net 192.168.1.0/24 and net 10.0.0.0/8"

Port ve Protokol Filtreleme

# Belirli bir port üzerindeki trafiği yakala
tcpdump -i eth0 -nn port 443

# Sadece kaynak port filtresi
tcpdump -i eth0 -nn src port 80

# Port aralığı filtrele
tcpdump -i eth0 -nn portrange 8000-9000

# TCP trafiği
tcpdump -i eth0 -nn tcp

# UDP trafiği
tcpdump -i eth0 -nn udp

# ICMP trafiği (ping debug için çok kullanışlı)
tcpdump -i eth0 -nn icmp

# TCP port 22 trafiği (SSH)
tcpdump -i eth0 -nn tcp port 22

Karmaşık Filtreler ve Gerçek Dünya Senaryoları

Burada işler ilginçleşmeye başlıyor. Birden fazla koşulu birleştirerek çok spesifik trafiği izleyebilirsin.

Senaryo 1: Web sunucusu sorun giderme

Bir web sunucusuna gelen HTTP ve HTTPS trafiğini izlemek istiyorsun ama yönetim SSH trafiğini görmek istemiyorsun:

tcpdump -i eth0 -nn -A 
  "host 203.0.113.50 and (port 80 or port 443) and not port 22"

-A flag’i sayesinde HTTP request ve response header’larını ASCII olarak görebilirsin. SQL injection denemelerini, anormal user-agent’ları ya da beklenmedik endpoint’lere yapılan istekleri doğrudan terminalde okuyabilirsin.

Senaryo 2: DNS sorunlarını debug etme

DNS çözümlemesinde sorun mu var? Hangi sorguların gidip gelmediğini görmek istiyorsun:

tcpdump -i eth0 -nn -v "port 53 and udp"

DNS over TCP de olabilir (büyük yanıtlar için), o yüzden bazen her ikisini de izlemen gerekebilir:

tcpdump -i eth0 -nn -v "port 53"

Senaryo 3: SYN flood saldırısı tespiti

TCP flag’lerine göre filtreleme yapabileceğini biliyor muydun? Bu çok güçlü bir özellik. TCP header’ının 13. byte’ında flag’ler bulunur. SYN paketlerini filtrelemek için:

# Sadece SYN paketleri (SYN flag set, ACK flag clear)
tcpdump -i eth0 -nn "tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack == 0"

Bunu bir adım ileri taşıyalım. SYN flood saldırısını tespit etmek için sadece SYN paketlerini sayarak hangi IP’den ne kadar geldiğini görmek istiyorsan:

tcpdump -i eth0 -nn -c 1000 
  "tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack == 0" 
  | awk '{print $3}' | cut -d. -f1-4 | sort | uniq -c | sort -rn | head -20

Bu kombo tcpdump çıktısını awk ve sort ile işleyerek en çok SYN paketi gönderen IP’leri listeler. Gerçek bir DDoS senaryosunda bu bilgi anında aksiyon almanı sağlar.

Senaryo 4: Şüpheli outbound trafiği araştırma

Bir sunucunun beklenmedik dış IP’lere bağlandığından şüpheleniyorsun. Bilinen servislerin dışında kalan tüm outbound trafiği izle:

tcpdump -i eth0 -nn 
  "src net 192.168.0.0/16 and not (dst port 80 or dst port 443 or dst port 53 or dst port 25)"

Bu filtre iç network’ten kaynaklanan ama HTTP, HTTPS, DNS veya SMTP olmayan tüm trafiği gösterir. Reverse shell bağlantıları, veri sızdırma girişimleri ya da C2 (command and control) trafiği bu şekilde yakalanabilir.

İleri Seviye BPF: Byte Offset Filtreleme

BPF’nin gerçek gücü byte offset filtrelemesinde ortaya çıkıyor. Paketin belirli bir byte’ının değerini kontrol edebilirsin. Söz dizimi şöyle:

proto[offset:size] operatör değer

proto: Hangi protokol header’ı içinde bak (tcp, udp, ip, ether) offset: Byte offset (0’dan başlar) size: Kaç byte oku (1, 2 veya 4)

TCP Flag’leri ile Detaylı Filtreleme

TCP flag byte’ı tcp[13] şeklinde okunur. Flag değerleri:

FIN: 0x01 (1) SYN: 0x02 (2) RST: 0x04 (4) PSH: 0x08 (8) ACK: 0x10 (16) URG: 0x20 (32)

# RST paketlerini yakala (bağlantı red/kesme sorunları için)
tcpdump -i eth0 -nn "tcp[13] & 4 != 0"

# FIN paketlerini izle
tcpdump -i eth0 -nn "tcp[13] & 1 != 0"

# PSH+ACK kombinasyonu (gerçek veri transferi)
tcpdump -i eth0 -nn "tcp[13] = 24"

# Tüm flag'leri set edilmiş paketler (XMAS scan tespiti)
tcpdump -i eth0 -nn "tcp[13] = 63"

# NULL scan tespiti (tüm flaglar sıfır)
tcpdump -i eth0 -nn "tcp[13] = 0"

Bu filtreler port scan tespitinde çok değerlidir. Nmap’in çeşitli scan tipleri karakteristik TCP flag kombinasyonları üretir ve bunları BPF ile yakalayabilirsin.

IP Protokol Alanı Filtreleme

IP header’ının 9. byte’ı (offset 9) üst katman protokolü belirtir:

# GRE tünellerini izle (protokol numarası 47)
tcpdump -i eth0 -nn "ip[9] = 47"

# OSPF trafiğini yakala (protokol numarası 89)
tcpdump -i eth0 -nn "ip[9] = 89"

# IP fragmentation sorunlarını debug et
tcpdump -i eth0 -nn "ip[6:2] & 0x1fff != 0"

Pcap Dosyalarıyla Çalışma

Canlı sistemde uzun süre izleme yapacaksan ya da sonradan analiz etmek üzere kayıt alman gerekiyorsa pcap formatına yazmak en doğrusu.

# Trafiği dosyaya kaydet
tcpdump -i eth0 -nn -w /tmp/capture.pcap

# Dosya boyutunu sınırlandır ve döngüsel kayıt yap (100MB, 5 dosya)
tcpdump -i eth0 -nn -w /tmp/capture-%Y%m%d-%H%M%S.pcap 
  -C 100 -W 5

# Kayıtlı pcap'i oku ve filtre uygula
tcpdump -r /tmp/capture.pcap -nn "port 443"

# Pcap'i oku ve Wireshark için yeni bir pcap yaz
tcpdump -r /tmp/capture.pcap -nn -w /tmp/filtered.pcap "host 10.0.0.1"

Önemli bir pratik bilgi: Production sunucularda capture alırken disk dolmasın diye -C ve -W parametrelerini mutlaka kullan. Yeterli disk alanı olmadan tcpdump başlatıp gece sabaha kadar sunucuyu doldurduğunu fark etmek hiç eğlenceli değil.

IPv6 Filtreleme

IPv6 trafiği artık görmezden gelinemez. Çoğu modern sistem dual-stack çalışıyor:

# Sadece IPv6 trafiği
tcpdump -i eth0 -nn ip6

# IPv6 üzerinden ICMPv6 (komşu keşif, router advertisement vs.)
tcpdump -i eth0 -nn "ip6 and icmp6"

# Belirli bir IPv6 host
tcpdump -i eth0 -nn "host 2001:db8::1"

# IPv6 ve IPv4 trafiğini aynı anda izle
tcpdump -i eth0 -nn "(ip or ip6) and port 443"

Pratik Güvenlik Senaryoları

ARP Spoofing Tespiti

ARP spoofing saldırılarında aynı IP için birden fazla MAC adresi cevap verir:

tcpdump -i eth0 -nn -e arp

-e parametresi Ethernet header’ını da gösterir, böylece MAC adresleri görünür hale gelir. ARP reply’larını izleyerek aynı IP için farklı MAC’ler görürsen spoofing var demektir.

Cleartext Parola Tespiti

Ağda hala telnet, FTP veya HTTP basic auth kullanan sistemler varsa:

# Telnet trafiğini ASCII olarak izle
tcpdump -i eth0 -nn -A "port 23"

# FTP trafiği
tcpdump -i eth0 -nn -A "port 21"

# HTTP basic auth içeren paketleri ara
tcpdump -i eth0 -nn -A "port 80" | grep -i "authorization:"

Bu tür testleri tabii ki sadece kendi sistemlerinde ve yetkiyle yapıyorsun. Ama bir pentest ya da güvenlik denetimi sırasında bu komutlar ağda cleartext credential dolaşıp dolaşmadığını anında ortaya koyar.

Brute Force Saldırısı İzleme

SSH’a brute force geldiğini düşünüyorsun:

# SSH trafiğini izle ve bağlantı denemelerini say
tcpdump -i eth0 -nn -c 500 
  "tcp[tcpflags] & tcp-syn != 0 and dst port 22" 
  | awk '{print $3}' | cut -d. -f1-4 | sort | uniq -c | sort -rn

Tek bir IP’den saniyede onlarca SYN paketi geliyorsa brute force kuvvetle muhtemel.

Performans ve Dikkat Edilmesi Gerekenler

Yüksek trafikli ortamlarda tcpdump kullanırken şunlara dikkat et:

Snap length optimizasyonu: Sadece header’lara ihtiyacın varsa full paket yakalamak yerine ilk 100 byte’ı al:

tcpdump -i eth0 -nn -s 100 "port 80"

Buffer boyutu: Paket kaybını önlemek için buffer boyutunu artırabilirsin (Linux’ta):

tcpdump -i eth0 -nn -B 65536 "port 443"

Interface seçimi: any interface’i kullanmak tüm interface’leri dinler ama daha yüksek CPU kullanır. Mümkünse spesifik interface belirt.

Yazma hızı: pcap yazarken SSD yerine network storage kullanıyorsan yazma hızı bottleneck olabilir. /tmp veya yerel disk her zaman daha güvenli.

Bir de şunu söyleyeyim: Production’da tcpdump çalıştırırken her zaman -c ile paket limitini koy ya da timeout komutuyla sarmalayarak otomatik sonlanmasını sağla. Aksi takdirde bağlantı kesilirse process arka planda sonsuza kadar çalışmaya devam edebilir:

# 60 saniye sonra otomatik dur
timeout 60 tcpdump -i eth0 -nn -w /tmp/capture.pcap "port 443"

Filtre Doğrulama

Yazdığın filtrenin sözdizimi doğru mu bilmek istiyorsun:

# Filtreyi test et, paket yakalamadan sadece syntax kontrolü yap
tcpdump -i eth0 -d "host 192.168.1.1 and port 80"

-d parametresi BPF bytecode’unu insan okunabilir formatta gösterir. Filtre geçerliyse hata almadan bytecode göreceksin, geçersizse hata mesajı alırsın.

Sonuç

tcpdump ve BPF filtreleri, ağ sorunlarını ve güvenlik olaylarını araştırmak için gerçekten vazgeçilmez araçlar. Basit host ve port filtrelerinden başlayıp byte offset manipülasyonuna, TCP flag analitiklerine uzanan geniş bir yelpazede çalışabiliyorsun.

Pratik yapmak için kendi lab ortamında başla: bir VM kur, farklı servisler çalıştır ve bu yazıdaki örnekleri uygula. Wireshark ile aynı pcap dosyasını aç, tcpdump çıktısını Wireshark’ta görsel olarak doğrula. Zamanla hangi filtrenin hangi senaryoya uygun olduğunu içgüdüsel olarak bilir hale gelirsin.

Son olarak şunu vurgulayayım: Bu araçları sadece reaktif değil, proaktif olarak kullan. Periyodik olarak kısa süreli capture alıp ağında ne olduğunu anlamaya çalışmak, bir sorun çıkmadan önce anomalileri fark etmeni sağlar. Ağını tanıyan sysadmin, krizi yönetmek zorunda kalan değil, krizi önleyen kişidir.

Yorum yapın