nethogs ile Uygulama Bazlı Ağ Trafiği İzleme

Sunucunuzda aniden artan bant genişliği kullanımını fark ettiniz, ama hangi uygulamanın suçlu olduğunu bilmiyorsunuz. iftop size toplam trafiği gösteriyor ama süreç bazlı bir görünüm sunmuyor. İşte tam bu noktada nethogs devreye giriyor ve hayatınızı kurtarıyor.

nethogs, Linux üzerinde çalışan ve ağ trafiğini süreç (process) bazında gösteren hafif ama son derece güçlü bir araçtır. top komutu CPU kullanımını süreç bazında nasıl gösteriyorsa, nethogs da bant genişliği kullanımını aynı şekilde gösterir. Özellikle “bu sunucudan kim dışarı veri gönderiyor?” sorusunun cevabını dakikalar içinde bulmanızı sağlar.

nethogs Nedir ve Neden Kullanmalısınız?

Geleneksel ağ izleme araçları genellikle iki kategoriye düşer: arayüz bazlı izleme (iftop, nload) ve akış bazlı izleme (tcpdump, wireshark). Bunların hiçbiri size doğrudan “şu an en çok bant genişliği tüketen uygulama hangisi?” sorusunun cevabını vermez.

nethogs bu boşluğu doldurur. Çalışma prensibi şu şekildedir: /proc dosya sistemini ve Linux’un procfs arayüzünü kullanarak her TCP/UDP bağlantısını ilgili süreçle eşleştirir. Bu sayede hangi PID’in, hangi kullanıcının ve hangi uygulamanın ne kadar bant genişliği kullandığını gerçek zamanlı olarak görebilirsiniz.

Kullanım senaryoları:

  • Anormal veri transferi yapan süreci tespit etme
  • Backup işlemlerinin bant genişliği tüketimini izleme
  • Geliştirici ortamlarında hangi servisin ne kadar trafik ürettiğini anlama
  • Potansiyel veri sızıntısı veya kötü amaçlı yazılım aktivitesi araştırma
  • Servis bazlı bant genişliği planlaması yapma

Kurulum

nethogs çoğu Linux dağıtımının resmi repolarında bulunur.

# Debian/Ubuntu sistemlerde
sudo apt update && sudo apt install nethogs

# RHEL/CentOS/AlmaLinux/Rocky Linux
sudo dnf install nethogs
# veya eski sürümlerde
sudo yum install nethogs

# Fedora
sudo dnf install nethogs

# Arch Linux
sudo pacman -S nethogs

# openSUSE
sudo zypper install nethogs

Kaynak koddan derlemek isterseniz:

sudo apt install build-essential libpcap-dev libncurses5-dev
git clone https://github.com/raboof/nethogs.git
cd nethogs
make
sudo make install

Temel Kullanım

nethogs root yetkisi gerektirir çünkü ağ arayüzlerini dinlemek için özel izinlere ihtiyaç duyar.

# Tüm arayüzleri izle
sudo nethogs

# Belirli bir arayüzü izle
sudo nethogs eth0

# Birden fazla arayüzü izle
sudo nethogs eth0 wlan0

# VPN arayüzünü izle
sudo nethogs tun0

Çalıştırdığınızda karşınıza şuna benzer bir ekran gelir:

NetHogs version 0.8.7

    PID USER     PROGRAM                      DEV        SENT      RECEIVED
  12453 www-data /usr/sbin/apache2            eth0       1.234 KB/s  0.456 KB/s
   8901 postgres /usr/lib/postgresql/14/bin/  eth0       0.123 KB/s  2.341 KB/s
   5678 ubuntu   /usr/bin/rsync               eth0      15.678 KB/s  0.012 KB/s
      ? root     unknown TCP                             0.000 KB/s  0.000 KB/s

Ekranda göreceğiniz sütunlar şu anlama gelir:

  • PID: Sürecin process ID’si
  • USER: Süreci çalıştıran kullanıcı
  • PROGRAM: Çalıştırılabilir dosyanın tam yolu
  • DEV: Hangi ağ arayüzü üzerinden trafik geçtiği
  • SENT: Saniye başına gönderilen veri miktarı
  • RECEIVED: Saniye başına alınan veri miktarı

Parametreler ve Seçenekler

nethogs‘un desteklediği temel parametreler:

  • -d : Yenileme aralığını saniye cinsinden ayarlar, varsayılan 1 saniyedir
  • -v : Görüntüleme modunu ayarlar; 0=KB/s, 1=KB, 2=MB, 3=GB
  • -c : Belirtilen sayıda yenileme sonrası otomatik çıkış yapar
  • -t: Troff (makine okunabilir) modunda çıktı verir, betik yazımı için kullanışlıdır
  • -p: Promiscuous modda dinleme yapar
  • -s: Gönderilen veri miktarına göre sıralar
  • -r: Alınan veri miktarına göre sıralar
  • -b: Saniye başına bit cinsinden gösterir (varsayılan byte’tır)
  • -a: Tüm trafiği gösterir, sadece aktif bağlantıları değil
# 5 saniyelik yenileme aralığı ile izle
sudo nethogs -d 5 eth0

# MB/s cinsinden göster
sudo nethogs -v 2 eth0

# 10 yenileme sonra otomatik çık (script kullanımı için ideal)
sudo nethogs -c 10 -t eth0

Ekran İçi Kısayollar

nethogs çalışırken klavye kısayollarıyla etkileşime girebilirsiniz:

  • m: Ölçüm birimini değiştirir (KB/s, KB, MB, GB arasında geçiş)
  • r: Alınan veri miktarına göre sıralar
  • s: Gönderilen veri miktarına göre sıralar
  • q: Programdan çıkar
  • ?: Yardım ekranını gösterir

Gerçek Dünya Senaryosu 1: Sunucudan Şüpheli Veri Çıkışı

Sabah 3’te NOC ekibinden mesaj geldi: “Prod sunucunuzdan gece boyunca alışılmadık miktarda çıkış trafiği var.” Monitoring sistemleri sadece toplam bant genişliği değerlerini gösteriyor, hangi uygulamanın sorumlu olduğunu değil.

# Önce genel görünüme bakalım
sudo nethogs -d 2 eth0

# Eğer çok fazla süreç varsa ve loglamak istiyorsak
sudo nethogs -t -d 5 eth0 | tee /tmp/nethogs_$(date +%Y%m%d_%H%M%S).log

Diyelim ki çıktıda şunu gördünüz:

12345  root  /usr/bin/python3 /opt/scripts/data_collector.py  eth0  45.2 KB/s  0.1 KB/s

Bu noktada süreç hakkında daha fazla bilgi almak için:

# Sürecin tam komut satırını görme
cat /proc/12345/cmdline | tr '' ' '

# Sürecin açık dosyalarını ve bağlantılarını kontrol etme
ls -la /proc/12345/fd
ss -tnp | grep 12345

# Sürecin başlatılma zamanını kontrol etme
ps -p 12345 -o lstart,cmd

# Bağlandığı uzak IP'yi tespit etme
ss -tnp | grep 12345 | awk '{print $5}'

Tespit edilen IP’yi araştırın:

# IP hakkında whois bilgisi
whois 203.0.113.45

# Coğrafi konum
curl -s "https://ipinfo.io/203.0.113.45/json"

# DNS reverse lookup
dig -x 203.0.113.45

Gerçek Dünya Senaryosu 2: Web Sunucusu Bant Genişliği Planlaması

Birden fazla web uygulaması barındıran bir sunucuda, hangi uygulamanın ne kadar bant genişliği tükettiğini anlamak istiyorsunuz. Bu bilgi kapasite planlaması için kritik.

# Apache/Nginx worker'larının trafik dağılımını görmek için
sudo nethogs -d 3 -v 1 eth0

# Belirli bir süre boyunca ortalama almak için özel betik
sudo nethogs -t -d 1 -c 60 eth0 > /tmp/webserver_traffic_60s.log

Toplu analiz için basit bir betik yazabilirsiniz:

#!/bin/bash
# nethogs_analyze.sh - 60 saniyelik trafik analizi

LOGFILE="/tmp/nethogs_analysis_$(date +%Y%m%d_%H%M%S).log"
DURATION=60
INTERFACE=${1:-eth0}

echo "Ağ trafiği $DURATION saniye boyunca kaydediliyor..."
echo "Arayüz: $INTERFACE"
echo "Log dosyası: $LOGFILE"

sudo nethogs -t -d 1 -c $DURATION $INTERFACE 2>/dev/null | grep -v "^$|Refreshing|PID" > $LOGFILE

echo ""
echo "=== En Fazla Gönderen Süreçler ==="
sort -k5 -rn $LOGFILE | head -10 | awk '{printf "PID: %-8s User: %-12s Program: %-40s Sent: %s KB/sn", $1, $2, $3, $5}'

echo ""
echo "=== En Fazla Alan Süreçler ==="
sort -k6 -rn $LOGFILE | head -10 | awk '{printf "PID: %-8s User: %-12s Program: %-40s Recv: %s KB/sn", $1, $2, $3, $6}'

Gerçek Dünya Senaryosu 3: Docker Container Trafik İzleme

Container ortamlarında nethogs kullanımı biraz farklıdır. Docker sanal ağ arayüzleri oluşturduğu için her birini ayrı ayrı izleyebilirsiniz.

# Docker ağ arayüzlerini listele
ip link show | grep -E "docker|veth|br-"

# Docker bridge arayüzünü izle
sudo nethogs docker0

# Belirli bir container'ın veth arayüzünü bul
CONTAINER_ID="abc123def456"
PID=$(docker inspect --format '{{.State.Pid}}' $CONTAINER_ID)
echo "Container PID: $PID"

# Container'ın ağ namespace'indeki arayüzü bul
nsenter -t $PID -n ip link show

# Tüm sanal arayüzleri tek seferde izle
VETH_INTERFACES=$(ip link show | grep veth | awk -F': ' '{print $2}' | tr 'n' ' ')
sudo nethogs $VETH_INTERFACES
# Compose stack'indeki tüm servislerin trafiğini izlemek için
docker network ls --format "{{.Name}}" | while read network; do
    BRIDGE=$(docker network inspect $network --format '{{.Options}}' | grep -o 'com.docker.network.bridge.name:[^ ]*' | cut -d: -f2)
    if [ ! -z "$BRIDGE" ]; then
        echo "Network: $network -> Bridge: $BRIDGE"
    fi
done

nethogs ile Otomasyon ve Monitoring Entegrasyonu

nethogs‘u sadece interaktif kullanmak zorunda değilsiniz. -t (troff) modu ile çıktısını parse edip monitoring sistemlerinize entegre edebilirsiniz.

#!/bin/bash
# nethogs_alert.sh - Belirli bir eşik aşıldığında uyarı gönder

THRESHOLD=1024  # KB/s cinsinden uyarı eşiği
INTERFACE=${1:-eth0}
ALERT_EMAIL="[email protected]"
LOGFILE="/var/log/nethogs_alerts.log"

# 30 saniyelik anlık ölçüm al
SNAPSHOT=$(sudo nethogs -t -d 1 -c 30 $INTERFACE 2>/dev/null | grep -v "^$|Refreshing|PID")

# Eşiği aşan süreçleri bul
while IFS= read -r line; do
    if [ -z "$line" ]; then continue; fi
    
    PID=$(echo $line | awk '{print $1}')
    USER=$(echo $line | awk '{print $2}')
    PROGRAM=$(echo $line | awk '{print $3}')
    SENT=$(echo $line | awk '{print $5}' | cut -d. -f1)
    RECV=$(echo $line | awk '{print $6}' | cut -d. -f1)
    
    if [ ! -z "$SENT" ] && [ "$SENT" -gt "$THRESHOLD" ] 2>/dev/null; then
        TIMESTAMP=$(date '+%Y-%m-%d %H:%M:%S')
        MSG="[$TIMESTAMP] UYARI: Yüksek çıkış trafiği! PID=$PID User=$USER Program=$PROGRAM Sent=${SENT}KB/s"
        echo $MSG | tee -a $LOGFILE
        echo $MSG | mail -s "Yüksek Ağ Trafiği Uyarısı - $INTERFACE" $ALERT_EMAIL 2>/dev/null
    fi
done <<< "$SNAPSHOT"

Bu betiği cron ile çalıştırabilirsiniz:

# Her 5 dakikada bir kontrol et
*/5 * * * * /usr/local/bin/nethogs_alert.sh eth0 >> /var/log/nethogs_cron.log 2>&1

nethogs ile Diğer Araçları Kombinlemek

nethogs tek başına güçlüdür ama diğer araçlarla birlikte kullanıldığında çok daha etkili olur.

# nethogs bir süreç tespit etti, ss ile bağlantı detaylarına bak
# Örnek: PID 5432 şüpheli görünüyor
sudo ss -tnp | grep "pid=5432"

# lsof ile bu sürecin açık ağ bağlantılarını görme
sudo lsof -p 5432 -i

# Sürecin sisteme nasıl geldiğini anlama (audit log)
sudo ausearch -p 5432 2>/dev/null

# strace ile sürecin sistem çağrılarını izleme (dikkatli kullanın!)
sudo strace -p 5432 -e trace=network -s 256 2>&1 | head -50

# tcpdump ile bu sürecin trafiğini yakalama
# Önce ss ile remote IP'yi bulun
REMOTE_IP=$(sudo ss -tnp | grep "pid=5432" | awk '{print $5}' | cut -d: -f1)
sudo tcpdump -i eth0 -w /tmp/suspicious_traffic.pcap host $REMOTE_IP &

Performans ve Dikkat Edilmesi Gerekenler

nethogs son derece hafif bir araçtır ve normal şartlarda sisteme kayda değer bir yük bindirmez. Ancak yüksek trafik ortamlarında dikkat edilmesi gereken noktalar var.

CPU etkisi: Çok sayıda bağlantı olan yoğun sunucularda (binlerce eş zamanlı bağlantı gibi durumlarda) nethogs‘un CPU kullanımı fark edilebilir şekilde artabilir. Bu tür ortamlarda -d parametresiyle yenileme aralığını artırın.

# Yüksek trafikli sunucularda daha az sık yenile
sudo nethogs -d 10 eth0

# Sadece belirli arayüzleri izle, gereksiz arayüzleri ekleme
sudo nethogs eth0  # tüm arayüzler yerine sadece ilgili olanı

Bilinmesi gereken kısıtlamalar:

  • nethogs UDP trafiğini bazı durumlarda doğru eşleştiremeyebilir
  • IPv6 desteği daha sonraki versiyonlarda iyileştirilmiştir, kullandığınız versiyona göre davranış değişebilir
  • Kernel namespace içindeki süreçler (bazı container senaryoları) doğru görünmeyebilir
  • unknown TCP olarak görünen bağlantılar, nethogs‘un sahipliğini tespit edemediği trafiği gösterir
# Versiyon kontrolü
nethogs --version

# unknown TCP bağlantılarını araştırmak için
sudo ss -tnp | grep -v "users"
sudo netstat -tnp | grep -v "PID"

Güvenlik Perspektifinden nethogs

Bir sysadmin olarak nethogs‘u güvenlik perspektifinden düzenli kullanmak, birçok potansiyel sorunu erken tespit etmenize yardımcı olur.

Dikkat edilmesi gereken örüntüler:

  • Bilmediğiniz bir süresin sürekli yüksek çıkış trafiği üretmesi
  • /tmp, /dev/shm gibi geçici dizinlerden çalışan süreçlerin ağ trafiği
  • nobody veya www-data kullanıcısının alışılmadık düzeyde trafik oluşturması
  • Gece geç saatlerde veya bakım penceresi dışında yoğun trafik görülmesi
# Şüpheli dizinlerden çalışan süreçlerin ağ trafiğini izleme
# Önce bu dizinlerden çalışan süreçleri bul
sudo lsof +D /tmp | awk '{print $2}' | sort -u | grep -v PID > /tmp/suspicious_pids.txt

# Ardından nethogs çıktısını bu PID'lerle karşılaştır
sudo nethogs -t -d 2 -c 30 eth0 2>/dev/null | while read line; do
    PID=$(echo $line | awk '{print $1}')
    if grep -q "^$PID$" /tmp/suspicious_pids.txt 2>/dev/null; then
        echo "ŞÜPHELI: $line"
    fi
done

nethogs Alternatifleri ve Karşılaştırma

nethogs her zaman tek seçeneğiniz değil. Duruma göre farklı araçlar daha uygun olabilir.

  • iftop: IP ve port çiftleri bazında trafik gösterir, süreç bilgisi vermez ama bağlantı analizi için mükemmeldir
  • bmon: Arayüz bazlı detaylı istatistikler sunar, süreç bilgisi yok ama görsel olarak zengindir
  • vnstat: Uzun vadeli trafik istatistikleri için idealdir, geçmişe dönük analiz yapabilirsiniz
  • iptraf-ng: Çok daha detaylı protokol bazlı istatistikler sunar, öğrenme eğrisi daha diktir
  • ss ve netstat: Süreç-bağlantı ilişkisini gösterir ama gerçek zamanlı bant genişliği bilgisi vermez

nethogs‘un en büyük avantajı bu araçların hiçbirinin tam olarak karşılamadığı “hangi uygulama ne kadar bant genişliği kullanıyor” sorusuna anlık cevap vermesidir.

Sonuç

nethogs, her Linux sistem yöneticisinin araç kutusunda bulunması gereken, kurulumu ve kullanımı son derece basit ama gücü yüksek bir izleme aracıdır. Özellikle şu üç durumda vazgeçilmezdir: anormal trafik kaynaklarını tespit etmek, çok uygulamalı sunucularda bant genişliği planlaması yapmak ve olası güvenlik ihlallerini araştırmak.

Günlük kullanımda sudo nethogs eth0 kadar basit bir komutla çalışabilirken, betikler ve otomasyon ile çok daha kapsamlı bir monitoring altyapısının parçası haline getirebilirsiniz. -t modu sayesinde çıktısını parse edip kendi alerting sistemlerinize entegre etmek de oldukça kolaydır.

Sonuç olarak, ağ trafiği sorunlarını çözerken her zaman katmanlı düşünün: önce nethogs ile hangi sürecin sorumlu olduğunu bulun, ardından ss veya tcpdump ile detaylara inin. Bu üçlü kombinasyon, ağ kaynaklı sorunların büyük çoğunluğunu dakikalar içinde çözmenizi sağlayacaktır.

Yorum yapın