nethogs ile Süreç Bazlı Ağ Bant Genişliği Kullanımını İzleme
Bir gün üretim sunucusunda ağ trafiği aniden fırladı. iftop açtım, toplam bant genişliği kullanımını gördüm ama hangi sürecin bu trafiği yarattığını bir türlü bulamadım. İşte tam o noktada nethogs hayatıma girdi ve o günden beri araç kutumdan hiç çıkmadı.
nethogs Nedir ve Neden Kullanmalısınız?
nethogs, ağ trafiğini süreç bazında izleyen bir komut satırı aracıdır. iftop size arayüz veya IP bazında trafik gösterirken, nethogs hangi PID’nin, hangi programın ne kadar bant genişliği tükettiğini gerçek zamanlı olarak listeler. Bu fark, sorun giderme süreçlerinde inanılmaz büyük bir avantaj sağlar.
Özellikle şu senaryolarda vazgeçilmez oluyor:
- Sunucunuzda beklenmedik bir bant genişliği artışı var ve kaynağı bulmak istiyorsunuz
- Hangi uygulamanın ne kadar veri gönderip aldığını izlemek istiyorsunuz
- Bir backup işleminin veya log gönderim servisinin ağı ne ölçüde meşgul ettiğini anlamak istiyorsunuz
- Geliştirme ortamında bir servisin beklenmedik dış bağlantılar kurduğundan şüpheleniyorsunuz
Kurulum
Çoğu dağıtımda paket depolarında hazır olarak geliyor.
# Debian / Ubuntu
sudo apt install nethogs
# RHEL / CentOS / AlmaLinux / Rocky
sudo dnf install nethogs
# Fedora
sudo dnf install nethogs
# Arch Linux
sudo pacman -S nethogs
# openSUSE
sudo zypper install nethogs
Eğer paket depolarında bulamazsanız kaynak koddan derlemek de mümkün, ancak standart enterprise dağıtımların repolarında genellikle mevcut. AlmaLinux veya Rocky’de EPEL reposunu etkinleştirmeniz gerekebilir:
sudo dnf install epel-release
sudo dnf install nethogs
Temel Kullanım
nethogs çalıştırmak için root yetkisi gerekiyor çünkü ağ arayüzlerine doğrudan erişmesi gerekiyor.
sudo nethogs
Bu komutu verdiğinizde tüm ağ arayüzlerini dinlemeye başlar ve aşağıdaki gibi bir ekranla karşılaşırsınız. Her satırda şu bilgiler yer alır: süreç adı ve PID’si, kullanıcı adı, gönderilen veri hızı (KB/s), alınan veri hızı (KB/s) ve o oturumda toplam aktarılan veri.
Belirli bir ağ arayüzünü izlemek için arayüz adını argüman olarak geçin:
sudo nethogs eth0
sudo nethogs ens3
Birden fazla arayüzü aynı anda izlemek de mümkün:
sudo nethogs eth0 eth1
Parametre Referansı
nethogs görece sade bir araca ama parametrelerini bilmek çok işe yarıyor:
-d: Yenileme aralığını saniye cinsinden belirler. Varsayılan değer 1 saniyedir.
-v: Görüntüleme modunu belirler. 0 = KB/s, 1 = KB, 2 = B, 3 = MB cinsinden gösterim yapar.
-c: Kaç kez yeniledikten sonra çıkacağını belirler. Scripting için kullanışlıdır.
-t: Troff modu, metin tabanlı çıktı üretir, script entegrasyonlarında tercih edin.
-b: Bytes per second yerine bits per second gösterimi için kullanılır.
-p: Karışık mod (promiscuous mode) etkinleştirir, geçen tüm trafiği yakalar.
-s: Gönderme hızına göre sıralar.
-r: Alma hızına göre sıralar (varsayılan davranış bu yönde çalışır).
Örnek olarak 5 saniyede bir yenileyen ve megabyte cinsinden gösteren bir kullanım:
sudo nethogs -d 5 -v 3 eth0
Çalışma Sırasında Klavye Kısayolları
nethogs çalışırken birkaç tuşa basarak davranışını değiştirebilirsiniz:
- m: Gösterim birimini değiştirir. KB/s, KB, B, MB arasında geçiş yapar.
- r: Alınan veri hızına göre sıralar.
- s: Gönderilen veri hızına göre sıralar.
- q: Programdan çıkar.
Gerçek Dünya Senaryosu 1: Anormal Trafik Kaynağını Bulmak
Diyelim ki gece 02:00’de monitoring sisteminizden bir alarm geldi, sunucunuzun bant genişliği kullanımı normalin 3 katına çıkmış. SSH ile bağlandınız ve şunu çalıştırdınız:
sudo nethogs -d 2 ens3
Ekranda bir Python sürecinin saniyede 8 MB veri gönderdiğini gördünüz. PID numarasını not alıp süreci inceliyorsunuz:
ps aux | grep <PID>
ls -la /proc/<PID>/exe
Çıkan sonuç, otomatik bir yedekleme scriptinin yanlış yapılandırılmış cron zamanlaması yüzünden aynı anda birden fazla instance başlatıldığını gösteriyor. Sorun bulundu, çözüme geçiliyor. nethogs olmadan bu tespiti yapmak dakikalar değil belki saatler alabilirdi.
Gerçek Dünya Senaryosu 2: Hangi Servis Ne Kadar Veri Çekiyor?
Bir uygulama sunucusunda birden fazla mikroservis çalışıyor. Hangi servisin dışarıya ne kadar trafik gönderdiğini ölçmek istiyorsunuz. nethogs çıktısını dosyaya yönlendirmek için troff modunu kullanabilirsiniz:
sudo nethogs -t -d 5 ens3 > /tmp/nethogs_output.txt &
sleep 60
kill %1
cat /tmp/nethogs_output.txt
Ya da daha düzgün bir yaklaşım olarak belirli sayıda ölçüm alıp çıkmak:
sudo nethogs -t -d 5 -c 12 ens3 | tee /var/log/bandwidth_audit.log
Bu komut 5 saniyede bir yenilenerek 12 kez ölçüm alır ve toplam 60 saniyelik bir profil çıkarır. -t parametresi sayesinde çıktı parse edilebilir metin formatında gelir.
Gerçek Dünya Senaryosu 3: Backup Penceresini Optimize Etmek
Bir müşterinin sunucusunda gece yedeklemeleri vardı ama tam yedek penceresi boyunca production trafiği de yavaşlıyordu. nethogs ile yedekleme sürecinin bant genişliği profilini çıkardık:
sudo nethogs -d 1 -v 3 bond0 2>/dev/null
rsync sürecinin zirve anlarda 45 MB/s bant genişliği kullandığını gördük. Çözüm olarak rsync‘e bant genişliği limiti ekledik:
rsync --bwlimit=20480 -avz /data/ backup_server:/backups/
nethogs ile doğruladık, bant genişliği kullanımı 20 MB/s’nin altında kaldı ve production trafiği normalleşti.
Script Entegrasyonu ve Otomatik İzleme
nethogs‘ın troff modunu kullanarak basit bir monitoring scripti yazabilirsiniz. Bu script belirli aralıklarla ölçüm alır ve threshold aşıldığında uyarı gönderir:
#!/bin/bash
INTERFACE="ens3"
THRESHOLD_KB=10240 # 10 MB/s
LOG_FILE="/var/log/nethogs_alert.log"
ALERT_EMAIL="[email protected]"
# nethogs'u troff modunda 10 saniye çalıştır
OUTPUT=$(sudo nethogs -t -d 2 -c 5 "$INTERFACE" 2>/dev/null)
# Her satırı işle
echo "$OUTPUT" | while IFS=$'t' read -r prog pid user sent received; do
# Sayısal değer mi kontrol et
if [[ "$sent" =~ ^[0-9]+(.[0-9]+)?$ ]]; then
SENT_KB=$(echo "$sent" | awk '{printf "%d", $1}')
if [ "$SENT_KB" -gt "$THRESHOLD_KB" ]; then
TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
MESSAGE="[$TIMESTAMP] UYARI: $prog (PID: $pid) saniyede ${SENT_KB}KB veri gonderiyor!"
echo "$MESSAGE" >> "$LOG_FILE"
echo "$MESSAGE" | mail -s "Yuksek Bant Genisligi Kullanimi" "$ALERT_EMAIL"
fi
fi
done
Bu scripti cron’a ekleyerek her 5 dakikada bir çalıştırabilirsiniz:
*/5 * * * * /usr/local/bin/nethogs_monitor.sh
nethogs ile Diğer Araçları Birlikte Kullanmak
nethogs tek başına güçlü ama diğer araçlarla birleşince daha da değerli hale geliyor.
PID’den Sürece Ulaşmak
nethogs size PID’yi veriyor, buradan sürece ait tüm bilgilere ulaşabilirsiniz:
# Sürecin tam komut satırını görmek
cat /proc/<PID>/cmdline | tr '' ' '
# Sürecin açık dosya ve soket bağlantılarını görmek
sudo lsof -p <PID>
# Sürecin ağ bağlantılarını görmek
sudo ss -tp | grep <PID>
Uzun Süreli İzleme için Kombinasyon
nethogs anlık izleme için tasarlanmış, uzun vadeli istatistik toplamak için vnstat veya iftop ile kombinasyon kullanmak daha mantıklı:
# Anlık sorun tespiti için nethogs
sudo nethogs eth0
# Günlük/haftalık istatistikler için vnstat
vnstat -h # saatlik istatistikler
vnstat -d # günlük istatistikler
# IP bazlı anlık izleme için iftop
sudo iftop -i eth0
Her araç kendi bağlamında doğru tercih. nethogs‘ı “bu trafiği hangi uygulama yapıyor?” sorusunu yanıtlamak için kullanın.
Güvenlik Perspektifinden nethogs
Bir sızma testi veya incident response senaryosunda nethogs değerli bir bilgi kaynağı olabilir. Tanımadığınız bir sürecin yüksek miktarda dış trafik oluşturduğunu gördüğünüzde hemen şüphelenmeye başlamalısınız.
Örneğin nethogs çıktısında /tmp/ veya /dev/shm/ dizini altında çalışan bir binary görürseniz bu ciddi bir uyarı işareti:
# Şüpheli sürecin daha fazla detayını almak
sudo ls -la /proc/<PID>/exe
sudo cat /proc/<PID>/maps | head -20
sudo strings /proc/<PID>/exe | grep -E "(http|ftp|curl|wget)" | head -20
Tanımadığınız bir süreç yüksek bant genişliği kullanıyorsa:
# Sürecin başlatıldığı zamanı kontrol et
ls -la /proc/<PID>
# Parent process'i kontrol et
cat /proc/<PID>/status | grep PPid
# Sürecin environment variable'larını gör
cat /proc/<PID>/environ | tr '' 'n'
Bu bilgiler incident response sürecinin ilk adımlarında çok kritik.
Yaygın Sorunlar ve Çözümleri
nethogs çalıştırınca “Operation not permitted” hatası alıyorum:
Root yetkisiyle çalıştırmadığınız için oluşuyor. sudo ile deneyin. Eğer sudo ile de sorun yaşıyorsanız, binary’ye CAP_NET_ADMIN ve CAP_NET_RAW capabilityleri verebilirsiniz:
sudo setcap cap_net_admin,cap_net_raw+pe /usr/sbin/nethogs
Bu sayede sudo olmadan normal kullanıcı olarak da çalıştırabilirsiniz. Ancak güvenlik açısından bu yaklaşımı üretim sunucularında dikkatli değerlendirin.
Bazı süreçler “unknown TCP” veya “unknown UDP” olarak görünüyor:
Bu, nethogs‘ın ilgili paketi bir sürece bağlayamadığı anlamına geliyor. Genellikle kısa ömürlü bağlantılarda veya kernel tarafından yönetilen trafikte görülür. ss veya netstat ile detaylı inceleme yapabilirsiniz:
sudo ss -tupn
Yüksek CPU kullanımı görüyorum:
nethogs pcap kütüphanesini kullandığı için yoğun trafik ortamlarında CPU kullanımı artabilir. -d parametresi ile yenileme aralığını artırmak yardımcı olur:
sudo nethogs -d 5 eth0
nethogs’ın Sınırlılıkları
Dürüst olmak gerekirse, nethogs‘ın bazı sınırlamaları var ve bunları bilmek önemli:
- Geçmişe dönük veri yok: Anlık gösterim yapar, geçmiş trafik verisi saklamaz. Monitoring sistemlerinizle entegre etmeniz gerekiyor.
- Şifreli trafik içeriğini göremez: Sadece bant genişliği kullanımını gösterir, paketin içeriğine bakmaz.
- Container trafiğinde limitasyonlar var: Docker veya Kubernetes ortamlarında konteyner içi trafiği tam olarak izlemek için ek konfigürasyon gerekebilir. Konteyner network namespace’ine girerek çalıştırmanız gerekebilir.
- Yüksek trafik hacimlerinde overhead: Saniyede gigabit düzeyinde trafik işleyen sunucularda overhead yaratabilir, bu durumda kernel tarafında çalışan eBPF tabanlı araçlara bakmanızı öneririm.
Container ortamları için bir not: Docker container’ının ağ trafiğini izlemek istiyorsanız:
# Container'ın PID'sini öğren
CONTAINER_PID=$(docker inspect --format '{{.State.Pid}}' container_adi)
# O network namespace'inde nethogs çalıştır
sudo nsenter -t $CONTAINER_PID -n nethogs
Sonuç
nethogs sysadmin araç çantasının vazgeçilmez parçalarından biri. Kurulumu trivial, kullanımı basit ama sağladığı bilgi gerçekten kıymetli. Özellikle “bu bant genişliğini kim yiyor?” sorusuna saniyeler içinde yanıt vermesi, troubleshooting süreçlerini ciddi ölçüde kısaltıyor.
Benim önerim şu: nethogs‘ı sadece sorun çıktığında açılan bir araç olarak değil, periyodik sağlık kontrollerinin parçası olarak kullanın. Haftada bir kez, yoğun iş saatlerinde 5-10 dakika nethogs ile sunucunuzun trafik profiline bakın. Normalin ne olduğunu öğrendiğinizde, anormali çok daha hızlı fark edersiniz.
Diğer araçlarla olan ilişkisine tekrar değineyim: nethogs süreç bazlı trafik için, iftop IP/port bazlı anlık trafik için, vnstat uzun vadeli istatistikler için kullanın. Bu üçlü birlikte, ağ trafiğinizin tam bir resmini çıkarmanızı sağlar.
Son olarak, production ortamında herhangi bir araç çalıştırmadan önce o aracın ne yaptığını ve sistemine etkisini anlayın. nethogs düşük overhead’li bir araç ama yine de yoğun trafik ortamlarında dikkatli kullanın. Test ortamında deneyin, sonra production’a taşıyın.
