tshark ile Komut Satırından Ağ Trafiği Yakalama ve Protokol Analizi
Wireshark’ı açıp GUI’ye tıklamak güzel, ama sunucuda ne yapacaksın? SSH üzerinden bağlı olduğun bir production makinesinde paket yakalamak gerektiğinde, tshark tam da o boşluğu dolduran araç. Yıllar içinde pek çok “neden bu servis çalışmıyor?” sorusunun cevabını tshark çıktısına bakarak buldum. Gelin, bu aracı gerçekten verimli kullanmak için neye ihtiyaç duyduğunuzu anlatalım.
tshark Nedir ve Neden Kullanmalısınız?
tshark, Wireshark’ın terminal arayüzüdür. Aynı dissector motorunu, aynı filtreleme dilini, aynı protokol analizini kullanır; ama ekran gerektirmez. Bu özelliği onu şu senaryolarda vazgeçilmez kılar:
- Headless sunucularda paket yakalama
- Uzaktan SSH oturumlarında anlık trafik inceleme
- Cron job veya script ile otomatik yakalama
- Uzun süreli capture dosyaları oluşturma
- Pipeline ile başka araçlara veri besleme
tcpdump ile karşılaştırıldığında tshark çok daha zengin protokol analizi sunar. TCP handshake’i görmek için tcpdump yeterli olabilir, ama HTTP header’larını parse etmek, DNS sorgularının cevap sürelerini ölçmek ya da TLS versiyonlarını listelemek istiyorsanız tshark farklı bir seviyede çalışır.
Kurulum
Çoğu dağıtımda tshark, wireshark paketinin bir parçası olarak gelir ya da ayrı bir paket olarak mevcuttur:
# Debian/Ubuntu
sudo apt install tshark
# RHEL/CentOS/AlmaLinux
sudo dnf install wireshark-cli
# Arch Linux
sudo pacman -S wireshark-cli
Kurulum sırasında “Should non-superusers be able to capture packets?” sorusu gelirse, bunu dikkatli değerlendirin. Production ortamında bu yetkiyi açmak yerine, capture işlemlerini sudo ile çalıştırmak daha güvenli bir alışkanlık.
Eğer sudo kullanmak istemiyorsanız, kullanıcınızı wireshark grubuna ekleyebilirsiniz:
sudo usermod -aG wireshark $USER
# Ardından yeniden login olun
Temel Kullanım ve Önemli Parametreler
tshark’ın sözdizimi basit, ama parametre sayısı fazla. Sık kullandığım ve gerçekten işe yarayan olanları şöyle sıralayabilirim:
-i: Hangi ağ arayüzünü dinleyeceğinizi belirtir. any diyerek tüm arayüzleri dinleyebilirsiniz.
-f: BPF (Berkeley Packet Filter) filtresi, capture seviyesinde çalışır ve performans açısından kritiktir.
-Y: Display filter, yakalandıktan sonra uygulanan Wireshark filtresi.
-w: Çıktıyı pcap dosyasına yazar.
-r: Mevcut bir pcap dosyasını okur.
-c: Kaç paket yakalayacağını sınırlar.
-a: Otomatik durdurma koşulları (süre, dosya boyutu, paket sayısı).
-b: Ring buffer, döngüsel dosya yazma.
-T: Çıktı formatını belirler (fields, json, pdml, text).
-e: Hangi alanları yazdıracağınızı seçer.
-z: İstatistik ve analiz işlemleri.
-V: Verbose, tüm protokol detaylarını gösterir.
-q: Sessiz mod, sadece istatistikleri gösterir.
-n: DNS çözümlemesi yapma, daha hızlı çalışır.
-N: Belirli isim çözümlemelerini devre dışı bırakır.
-t: Zaman damgası formatı (ad, a, r, d, dd, e).
İlk Yakalamalar: Temel Senaryolar
Hangi arayüzlerin mevcut olduğunu görmek için:
tshark -D
Belirli bir arayüzde trafiği izlemeye başlamak:
sudo tshark -i eth0
Sadece HTTP trafiğini yakalamak ve ekrana basmak:
sudo tshark -i eth0 -Y "http" -n
Burada -n parametresini neredeyse her zaman ekliyorum. DNS çözümlemesi yapmadan çalışmak hem daha hızlı hem de capture sırasında ek DNS sorguları oluşturmuyor.
Belirli bir IP adresine giden/gelen trafiği yakalamak:
sudo tshark -i eth0 -f "host 192.168.1.100" -n
Alan Seçimi ile Temiz Çıktı Üretme
tshark’ın en güçlü yanlarından biri, tam olarak hangi alanları görmek istediğinizi belirleyebilmeniz. -T fields ve -e kombinasyonu bu konuda inanılmaz esneklik sağlıyor.
DNS sorgularını ve cevaplarını temiz bir şekilde listelemek:
sudo tshark -i eth0
-Y "dns"
-T fields
-e frame.time
-e ip.src
-e ip.dst
-e dns.qry.name
-e dns.resp.addr
-n
Bu çıktıyı bir log dosyasına yönlendirerek “sunucu hangi adreslere DNS sorgusu yapıyor?” sorusunu dakikalar içinde cevaplayabilirsiniz. Geçen yıl bir müşteride beklenmedik outbound trafiği bu yöntemle tespit ettik; bir uygulama her 30 saniyede bir şüpheli bir domain’e sorgu yapıyordu.
HTTP isteklerini analiz etmek için:
sudo tshark -i eth0
-Y "http.request"
-T fields
-e http.time
-e ip.src
-e http.request.method
-e http.host
-e http.request.uri
-E separator="|"
-n
-E separator="|" ile sütunları pipe ile ayırırsanız, çıktıyı awk veya başka araçlarla işlemek kolaylaşır.
Gerçek Dünya Senaryosu 1: Yavaş Uygulama Tespiti
Bir web uygulaması yavaş diye şikayet geldi. Backend’de ne olduğunu anlamak için TCP akışlarını incelemeye başladım. tshark’ın tcp.time_delta alanı, iki paket arasındaki süreyi gösterir ve gecikme analizi için mükemmeldir:
sudo tshark -i eth0
-f "tcp port 8080"
-Y "tcp.time_delta > 0.5"
-T fields
-e frame.number
-e frame.time_delta
-e ip.src
-e ip.dst
-e tcp.srcport
-e tcp.dstport
-e tcp.flags
-n
Bu komut, 500ms’den uzun süren TCP gecikmelerini listeler. İlk birkaç dakikada, database bağlantısı üzerinde periyodik 2-3 saniyelik gecikmeleri yakaladık. Sorun connection pool tükenmesiydi.
Pcap Dosyalarına Kaydetme ve Ring Buffer
Uzun süreli izleme için tüm trafiği diske yazmak gerekebilir. Özellikle intermittent sorunlarda “tam o an ne oluyordu” sorusunu cevaplamak için:
sudo tshark -i eth0
-f "not port 22"
-b filesize:102400
-b files:10
-w /var/captures/traffic.pcap
Bu komut 10 adet 100MB’lık dosya oluşturur ve ring buffer mantığıyla döner. Yani toplam 1GB capture alanınız var ve en eski dosyanın üzerine yazar. SSH trafiğini -f "not port 22" ile dışarıda bırakıyorum, yoksa kendi oturumunuzun trafiği capture’ı gereksiz şişirir.
Daha gelişmiş otomatik durdurma:
sudo tshark -i eth0
-a duration:3600
-a filesize:51200
-w /var/captures/hourly.pcap
1 saat ya da 50MB dolunca otomatik durur.
Gerçek Dünya Senaryosu 2: TLS Versiyon Denetimi
Eski TLS versiyonlarını kullanan client’ları tespit etmek, özellikle compliance gereksinimleri olan ortamlarda önemli. tshark bunu gayet güzel çözüyor:
sudo tshark -i eth0
-Y "ssl.handshake.type == 1"
-T fields
-e frame.time
-e ip.src
-e ssl.handshake.version
-e ssl.handshake.ciphersuite
-n 2>/dev/null | grep -v "^$"
TLS 1.0 veya 1.1 kullanan client’ları filtrelemek için:
sudo tshark -i eth0
-Y "tls.handshake.type == 1 && (tls.handshake.version == 0x0301 || tls.handshake.version == 0x0302)"
-T fields
-e ip.src
-e tls.handshake.version
-n
Bu komutu çalıştırdığınızda, hala TLS 1.0 kullanan eski Java uygulamalarını veya cihazları anında görebilirsiniz. Bir bankacılık projesinde bu yöntemle 3 farklı legacy servisi tespit ettik.
İstatistik Modları: -z Parametresinin Gücü
tshark’ın -z parametresi, yakalanan trafikten anlık istatistikler üretir. Bu özelliği yeterince kullanmayan pek çok sysadmin gördüm.
Protokol hiyerarşisini görmek:
sudo tshark -i eth0
-a duration:30
-q
-z io,phs
30 saniye sonra hangi protokollerin ne kadar bant genişliği kullandığını temiz bir ağaç yapısında gösterir.
Konuşmalar (conversations) analizi:
sudo tshark -i eth0
-a duration:60
-q
-z conv,tcp
60 saniyede hangi IP çiftleri arasında ne kadar TCP trafiği aktı? Bant genişliği kullananı bulmak için biçilmiş kaftan.
HTTP istek/cevap istatistikleri:
sudo tshark -r capture.pcap
-q
-z http,tree
Bir pcap dosyasındaki tüm HTTP metodlarını, cevap kodlarını ve dağılımlarını gösterir.
Mevcut Pcap Dosyalarını Analiz Etme
Capture, inceleme işinden ayrı tutulabilir. Bir sunucuda trafik yakalayıp pcap dosyasını indirip kendi makinenizde analiz edebilirsiniz.
Bir pcap’taki tüm HTTP 500 hatalarını bulmak:
tshark -r traffic.pcap
-Y "http.response.code >= 500"
-T fields
-e frame.time
-e ip.src
-e ip.dst
-e http.response.code
-e http.response.phrase
TCP RST paketlerini analiz etmek, ani bağlantı kopuşlarını tespit etmek için:
tshark -r traffic.pcap
-Y "tcp.flags.reset == 1"
-T fields
-e frame.time
-e ip.src
-e ip.dst
-e tcp.srcport
-e tcp.dstport
| sort | uniq -c | sort -rn | head -20
Gerçek Dünya Senaryosu 3: ICMP ve ARP Analizi
Ağda intermittent bağlantı sorunları yaşanıyor, ama nerede olduğu bilinmiyor. ARP ve ICMP trafiğine bakmak iyi bir başlangıç noktası:
sudo tshark -i eth0
-f "arp or icmp"
-T fields
-e frame.time
-e eth.src
-e eth.dst
-e arp.src.proto_ipv4
-e arp.dst.proto_ipv4
-e arp.opcode
-n
ARP flood’u veya duplicate IP sorununu bu çıktıdan çok hızlı tespit edebilirsiniz. Eğer aynı IP için farklı MAC adresleri görüyorsanız, ya IP çakışması var ya da ARP spoofing yaşanıyordur.
ICMP unreachable paketlerini takip etmek:
sudo tshark -i eth0
-Y "icmp.type == 3"
-T fields
-e frame.time
-e ip.src
-e ip.dst
-e icmp.code
-n
SSH Üzerinden Uzaktan Capture
Favorilerimden biri bu: remote sunucudaki trafiği yerel Wireshark’ta açmak. Bunu iki şekilde yapabilirsiniz.
Anlık streaming:
ssh [email protected]
"tshark -i eth0 -f 'not port 22' -w - 2>/dev/null"
| wireshark -k -i -
Önce kaydet, sonra indir:
ssh [email protected]
"sudo tshark -i eth0 -a duration:120 -w /tmp/capture.pcap -f 'not port 22' 2>/dev/null"
scp [email protected]:/tmp/capture.pcap ./
wireshark capture.pcap
İkinci yöntem daha güvenilir, özellikle unstable bağlantılarda.
JSON Çıktısı ve Loglama Entegrasyonu
Modern log yönetim sistemleriyle entegrasyon için JSON formatı kullanabilirsiniz:
sudo tshark -i eth0
-Y "http.request or http.response"
-T json
-e http.request.method
-e http.host
-e http.request.uri
-e http.response.code
-n
| jq -c '.[]'
>> /var/log/http_traffic.jsonl
Bu çıktıyı Elasticsearch, Loki veya herhangi bir JSONL destekleyen sisteme besleyebilirsiniz. Tabii production’da bunu bir servis olarak çalıştırmak, log rotation’a bağlamak ve boyutu kontrol altında tutmak gerekiyor.
Performans ve Güvenlik Notları
Birkaç önemli noktaya dikkat çekmek istiyorum:
Capture filter vs display filter: -f parametresi kernel seviyesinde çalışır ve gereksiz paketlerin userspace’e gelmesini engeller. -Y ise tüm paketleri yakalar, sonra filtreler. Yüksek trafikli ortamlarda mümkün olduğunca -f kullanın.
Yüksek trafik altında paket kaybı: tshark %X dropped uyarısı vermeye başlarsa, capture buffer’ını artırabilirsiniz. Ama bu genellikle capture ettiğiniz her şeyi işlemekten değil, filtrelemenin yetersiz olmasından kaynaklanır.
Yasal boyut: Capture işlemi ciddi bir müdahaledir. Başkasına ait bir ağda ya da yetkisiz sistemlerde yapmak yasal sorun yaratır. Kurumsal ortamlarda her zaman yazılı onay alın.
Sensitive data: Parolalar, token’lar, kişisel veriler pcap dosyalarına düşebilir. Bu dosyaları güvenli saklayın, şifreleyin ve gereksiz yere paylaşmayın.
CPU ve bellek: Yoğun trafik altında tshark ciddi kaynak tüketebilir. Capture süresini ve dosya boyutunu her zaman -a parametresiyle sınırlayın.
Sonuç
tshark, terminal ortamında ağ sorunlarını debug ederken gerçekten fark yaratan bir araç. GUI olmadan Wireshark’ın tüm gücüne erişmek, scripting ve otomasyon ile entegre etmek, uzak sunucularda çalışmak… Bunların hepsi tshark’ın doğal habitat’ı.
Birkaç yıl önce “tcpdump yeterli zaten” diye düşünürdüm. Sonra ilk kez HTTP yanıt sürelerini alan bazında ölçmek gerekti, sonra TLS versiyonlarını otomatik raporlamak gerekti, sonra DNS sorgularını bir SIEM’e beslemek gerekti. Her seferinde tshark’ı bir adım daha ileri götürdüm.
Araçları gerçek sorunlarla tanımak en iyi öğrenme yöntemi. Bir sonraki ağ sorununda, Wireshark’ı açmadan önce tshark ile terminal’den bir tur atmayı deneyin; muhtemelen çok daha hızlı cevaba ulaştığınızı göreceksiniz.
