tcpflow ile TCP Bağlantılarını Oturum Bazında Yakalama ve Yeniden Birleştirme
Ağ sorunlarını debug ederken bazen tcpdump yetmez. Paketleri yakalarsın, hex dump’a bakarsın, ama “bu HTTP isteğinde tam olarak ne gönderildi?” sorusuna net cevap bulmak için saatler harcarsın. İşte tam bu noktada tcpflow devreye giriyor. TCP akışlarını oturum bazında yeniden birleştiren, ham veriyi okunabilir formata döken bu araç, özellikle uygulama katmanı protokollerini analiz ederken hayat kurtarıcı oluyor.
Ben bu aracı ilk kez bir prodüksiyon sorunu sırasında ciddiye aldım. Uygulama aralıklı olarak timeout veriyordu, load balancer logları temizdi, uygulama logları da. Araya girip TCP akışlarını oturum bazında izlediğimde sorunun nerede olduğu saniyeler içinde netleşti. O günden beri ağ analiz araç setimin vazgeçilmez parçası oldu.
tcpflow Nedir, tcpdump’tan Farkı Ne?
tcpdump paketleri yakalar ve gösterir. Çok güçlü bir araçtır, ama temel işlevi paket düzeyinde çalışmaktır. TCP bir akış protokolüdür; veriler parçalara bölünür, sıra dışı gelebilir, yeniden iletimler olabilir. tcpdump bunu sizin için birleştirmez.
tcpflow ise farklı bir felsefeden hareket eder. Her TCP bağlantısını ayrı bir oturum olarak ele alır ve o bağlantı boyunca akan tüm veriyi tek bir dosyada veya akışta yeniden birleştirir. Client’tan server’a giden veri bir dosyaya, server’dan client’a gelen veri başka bir dosyaya yazılır. Sonuçta elinizde ham protokol verisi vardır, TCP’nin getirdiği karmaşıklık yoktur.
Kurulum çoğu dağıtımda oldukça basittir:
# Ubuntu/Debian
sudo apt-get install tcpflow
# RHEL/CentOS/Rocky Linux
sudo yum install tcpflow
# veya
sudo dnf install tcpflow
# Arch Linux
sudo pacman -S tcpflow
Temel Kullanım ve İlk Adımlar
En basit kullanım senaryosuyla başlayalım. Bir network interface üzerindeki HTTP trafiğini yakalayalım:
sudo tcpflow -i eth0 port 80
Bu komut çalıştırıldığında, port 80 üzerindeki her TCP bağlantısı için otomatik olarak dosyalar oluşturulur. Dosya adları şu formatta olur:
192.168.001.100.45231-192.168.001.10.00080
Kaynak IP, kaynak port, hedef IP, hedef port bilgisini içerir. Bu isimlendirme sayesinde hangi dosyanın hangi yönde aktığını anlık görebilirsiniz.
Belirli bir dizine kaydetmek için:
sudo tcpflow -i eth0 -o /tmp/capture port 80
/tmp/capture dizini yoksa tcpflow oluşturur. Analiz sonrası temizlik için böyle bir yapı kurmak çok daha pratik.
Önemli Parametreler
-i interface: Dinlenecek ağ arayüzünü belirtir. any yazarsanız tüm arayüzleri dinler.
-o dizin: Yakalanan akışların yazılacağı dizin.
-r dosya: Canlı yakalama yerine mevcut bir pcap dosyasını okur. tcpdump ile aldığınız kayıtları sonradan analiz etmek için kullanışlıdır.
-c: Dosyaya yazmak yerine terminal ekranına basar. Hızlı debug için idealdir.
-C: Konsola basar ama renkli çıktı olmadan, pipe ile başka araçlara göndermek için uygundur.
-a: Gzip ile sıkıştırılmış HTTP içeriğini otomatik olarak açar. Gerçek içeriği görmek istiyorsanız şart.
-e: HTTP başlıklarını ve içeriği ayrıştırır, daha okunabilir format sağlar.
-b boyut: Her dosya için maksimum bayt sınırı koyar. Disk dolmasın diye büyük akışları sınırlamak gerektiğinde.
-F format: Dosya adlandırma formatını değiştirmenizi sağlar.
-T: Her akış için zaman damgası ekler.
-v: Verbose mod, yakalama süreci hakkında daha fazla bilgi verir.
-D: IP adreslerini çözümlemeye çalışır.
-p: Promiscuous modunu devre dışı bırakır.
Gerçek Dünya Senaryosu 1: HTTP API Sorunlarını Debug Etmek
Prodüksiyonda bir servis, harici bir API’ye istekler atıyor ve aralıklı 500 hatası alıyordu. Uygulama geliştiricisi “bizim tarafımız temiz” diyordu, API sağlayıcısı da “bizim tarafımız temiz” diyordu. İki taraf birbirine bakıyor, sorun ortada.
sudo tcpflow -i eth0 -a -o /tmp/api-debug 'host api.example.com and port 443'
HTTPS için doğrudan içeriği göremezsiniz tabii, ama TLS termination yapan bir proxy varsa ya da iç ağda plain HTTP kullanıyorsanız bu işe yarar. İç servislerin birbirleriyle plain HTTP konuştuğu ortamlarda bu yaklaşım çok değerli.
Eğer TLS yoksa ve hata üretilirken yakalamak istiyorsanız:
sudo tcpflow -i any -c -a 'host 10.0.1.50 and port 8080' | grep -A 20 "HTTP/1"
-c parametresi sayesinde terminal ekranında akıcı şekilde takip edebilirsiniz, grep ile sadece HTTP yanıtlarını süzebilirsiniz.
Gerçek Dünya Senaryosu 2: Veritabanı Sorgularını Analiz Etmek
Bu senaryoyu bir performans sorununda kullandım. Uygulama, MySQL’e beklenmedik şekilde çok sorgu gönderiyordu ve ORM katmanında bir N+1 problemi olduğundan şüpheleniyorduk. Uygulama logları sorgu içermiyordu, MySQL slow query log da yetmiyordu çünkü tek tek sorgular hızlıydı, sayıları fazlaydı.
sudo tcpflow -i lo -o /tmp/mysql-traffic 'port 3306'
Loopback arayüzü üzerinden MySQL trafiğini yakaladık. Sonra oluşan dosyaları inceledik:
ls -la /tmp/mysql-traffic/
cat /tmp/mysql-traffic/127.000.000.001.* | strings | grep -i "SELECT"
strings komutu binary içinden okunabilir stringleri çekiyor. MySQL protokolü binary olmakla birlikte sorgu metinleri plaintext geçer. Bu sayede hangi sorgular, kaç kez, hangi sırayla atılıyor görebildik. N+1 problemi anında ortaya çıktı.
Gerçek Dünya Senaryosu 3: Pcap Dosyasını Sonradan Analiz Etmek
Çoğu zaman prodüksiyonda anlık müdahale yapamayız. Sorun olduğunda tcpdump ile ham yakalama alır, sonra ofiste analiz ederiz.
# Önce tcpdump ile yakala
sudo tcpdump -i eth0 -w /tmp/capture.pcap 'port 8080' -C 100 -W 5
-C 100 her 100MB’da yeni dosya açar, -W 5 en fazla 5 dosya tutar, yani 500MB’lık döngüsel buffer oluşturur. Sorun oluştuğu anda durdurup analize geçersiniz.
Sonra tcpflow ile parse edin:
tcpflow -r /tmp/capture.pcap -o /tmp/analyzed
# Oluşan dosyaları boyuta göre sırala
ls -lhS /tmp/analyzed/
# En büyük akışın içeriğine bak
cat /tmp/analyzed/$(ls -S /tmp/analyzed/ | head -1)
Bu kombinasyon, tcpdump + tcpflow ikilisi, ağ analizinin çok güçlü bir yoludur. tcpdump‘ın esnekliği ile tcpflow‘un oturum birleştirme kapasitesini bir arada kullanırsınız.
HTTP Analizi için Gelişmiş Kullanım
tcpflow‘un -e http ve -a kombinasyonu gerçekten güçlü. HTTP trafiğini analiz ederken:
sudo tcpflow -i eth0 -e http -a -o /tmp/http-flows 'port 80 or port 8080'
Bu komut hem HTTP başlıklarını ayrıştırır hem de gzip sıkıştırmasını açar. Oluşan dosyaları incelediğinizde request/response çiftlerini net bir şekilde görebilirsiniz.
Belirli bir host’a giden trafiği filtreleyin ve anlık terminalde takip edin:
sudo tcpflow -i eth0 -c -a -e http 'host 192.168.1.100 and port 80'
Bunu bir pipeline’a ekleyip sadece POST isteklerini filtreleyebilirsiniz:
sudo tcpflow -i eth0 -c -a 'port 80' 2>/dev/null | grep -B 5 -A 50 "POST /"
BPF Filtreleri ile Hedefli Yakalama
tcpflow Berkeley Packet Filter (BPF) sözdizimini kullanır, tcpdump ile aynı filter syntax’ı geçerlidir. Bu çok önemli bir detay çünkü disk dolmaması ve analizi kolaylaştırmak için mümkün olduğunca dar filtreler kullanmalısınız.
# Sadece belirli iki host arasındaki trafiği yakala
sudo tcpflow -i eth0 -o /tmp/debug 'host 10.0.1.10 and host 10.0.1.20'
# Belirli bir port aralığı
sudo tcpflow -i eth0 -o /tmp/debug 'portrange 8000-8100'
# Belirli bir host'tan gelen veya giden, ama loopback hariç
sudo tcpflow -i eth0 -o /tmp/debug 'host 10.0.1.10 and not port 22'
# Sadece SYN paketleri değil, veri taşıyan akışları hedeflemek
sudo tcpflow -i eth0 -o /tmp/debug 'tcp and host 10.0.1.50 and not port 22 and not port 443'
Dosya Adlandırma ve Organizasyon
Yoğun trafikte /tmp/capture dizini onlarca, yüzlerce dosyayla dolabilir. Bunu yönetmek için birkaç yaklaşım var.
Zaman damgalı bir dizin yapısı oluşturmak:
CAPDIR="/tmp/capture_$(date +%Y%m%d_%H%M%S)"
mkdir -p "$CAPDIR"
sudo tcpflow -i eth0 -o "$CAPDIR" -T 'port 8080'
Belirli bir süre yakaladıktan sonra durdurmak için timeout kullanabilirsiniz:
sudo timeout 60 tcpflow -i eth0 -o /tmp/capture 'port 80'
60 saniye sonra otomatik durur. Script içinde çok kullanışlı.
Yakalama sonrası dosyaları hızlıca özetlemek için:
# Kaç adet akış yakalandı
ls /tmp/capture/ | wc -l
# En büyük akışlar
du -sh /tmp/capture/* | sort -rh | head -10
# Tüm akışları tek dosyada birleştir (analiz için)
cat /tmp/capture/* > /tmp/all-flows.txt
Gerçek Dünya Senaryosu 4: Redis Trafiğini İzlemek
Redis protokolü (RESP) metin tabanlıdır ve tcpflow ile kolayca okunabilir. Hangi komutların hangi sıklıkla atıldığını görmek için:
sudo tcpflow -i lo -c 'port 6379' 2>/dev/null | grep -E "^*|^$|^[A-Z]"
Redis RESP protokolünde * satır sayısını, $ string uzunluğunu belirtir. Bu çıktıyı parse ederek hangi komutların en çok kullanıldığını anlayabilirsiniz:
sudo tcpflow -i lo -o /tmp/redis-capture 'port 6379'
# Sonra analiz
strings /tmp/redis-capture/* | grep -E "^(GET|SET|HGET|HSET|LPUSH|RPOP|EXPIRE)" | sort | uniq -c | sort -rn | head -20
Bu çıktı size uygulama Redis’i nasıl kullanıyor sorusuna somut cevap verir. Beklenmedik miktarda KEYS * komutu görüyorsanız ciddi bir performans sorunu kaynağı tespit etmiş olursunuz.
tcpflow’u Script İçinde Kullanmak
Monitoring ve otomatik teşhis scriptlerinde tcpflow‘u kullanmak mümkün. Basit bir örnek:
#!/bin/bash
# Belirli bir servis için kısa süreli trafik analizi
SERVICE_IP="10.0.1.50"
SERVICE_PORT="8080"
DURATION=30
CAPDIR="/tmp/svc_capture_$$"
mkdir -p "$CAPDIR"
echo "Yakalama başlıyor: $DURATION saniye..."
sudo timeout "$DURATION" tcpflow -i any -o "$CAPDIR"
"host $SERVICE_IP and port $SERVICE_PORT" 2>/dev/null
echo "Yakalama tamamlandı."
echo "Akış sayısı: $(ls $CAPDIR | wc -l)"
echo "Toplam veri: $(du -sh $CAPDIR | cut -f1)"
echo ""
echo "En büyük akışlar:"
du -sh "$CAPDIR"/* 2>/dev/null | sort -rh | head -5
echo ""
echo "HTTP durum kodları:"
grep -h "HTTP/1." "$CAPDIR"/* 2>/dev/null | grep -oE "HTTP/1.[01] [0-9]{3}" | sort | uniq -c | sort -rn
Bu script prodüksiyon sistemlerde anlık snapshot almak için kullanılabilir. Çıktısını bir ticket’a veya monitoring sistemine göndermek işleri hızlandırır.
Dikkat Edilmesi Gereken Noktalar
Disk kullanımı: Yüksek trafikli bir interface’de tcpflow disk’i hızla doldurabilir. -o ile belirttiğiniz dizini izleyin ya da timeout ile yakalama süresini sınırlayın. -b parametresi ile akış başına boyut sınırı koyun.
Şifreli trafik: TLS/SSL trafiğinde yalnızca handshake ve şifreli payload’ı görürsünüz. İçerik analizi için TLS termination point’inde çalışmanız, application-level logging açmanız ya da test ortamında TLS’i devre dışı bırakmanız gerekir.
Yasal ve etik boyut: tcpflow güçlü bir araç. Kendi sistemlerinizde ve yetkili olduğunuz networklerde kullanın. Kullanıcı verisi içeren akışları yakaladığınızda KVKK ve kurumsal gizlilik politikalarını gözetin. Log retention politikalarınıza uygun hareket edin.
Root yetkisi: tcpflow çalıştırmak için root ya da CAP_NET_RAW yetkisi gerekir. Prodüksiyonda bu yetkinin kime verildiğini dikkatle yönetin.
Performans etkisi: Yüksek trafikli sistemlerde tcpflow CPU ve disk I/O tüketir. Mümkünse dar BPF filtreleri kullanın ve gereksiz yere geniş yakalamalardan kaçının.
Wireshark ile Entegrasyon
tcpflow ile aldığınız pcap dosyalarını Wireshark ile açabilirsiniz. Öte yandan tersi de mümkün: Wireshark’ta yakaladığınız pcap’i tcpflow -r ile analiz edebilirsiniz. Bu ikili çalışma özellikle GUI üzerinde genel tablo görmek, ardından terminal üzerinde ayrıntılı analiz yapmak istediğinizde çok işe yarıyor.
# tcpdump ile yakala, hem tcpflow hem Wireshark için kullan
sudo tcpdump -i eth0 -w /tmp/raw.pcap 'port 8080'
# tcpflow ile akış bazında analiz
tcpflow -r /tmp/raw.pcap -o /tmp/flows/
# Wireshark ile görsel analiz
wireshark /tmp/raw.pcap
Sonuç
tcpflow sysadmin’in ve DevOps mühendisinin cephane çantasında tutması gereken araçlardan biri. Özellikle uygulama katmanı sorunlarını debug ederken tcpdump‘ın ham paket çıktısıyla boğuşmak yerine, TCP akışlarını doğrudan okunabilir form da görmek zaman kazandırıyor.
Benim için en değerli olduğu senaryolar şunlar: Microservice’ler arası beklenmedik davranışları izlemek, veritabanı bağlantılarında neler döndüğünü anlamak, “uygulama mı hatalı API mı?” gibi soruları elle tutulan kanıtla yanıtlamak ve performans sorunlarının gerçek kaynağını bulmak.
Aracı öğrenmenin en iyi yolu bir test ortamında denemek. Bir HTTP servisi ayağa kaldırın, birkaç istek atın, tcpflow ile yakalayın, dosyalara bakın. Ne gördüğünüzü anladığınız an, bir sonraki prodüksiyon sorununda bu araca ne zaman başvurmanız gerektiğini de anlıyorsunuz.
