vnstat ile Uzun Vadeli Ağ Trafiği İstatistiklerini İzleme ve Raporlama

Bir sunucuyu devraldığınızda ilk yapmanız gereken şeylerden biri, o makinenin ne kadar veri tükettiğini anlamaktır. Fatura geldiğinde “bu ay neden bu kadar bandwidth harcandı?” sorusunu cevaplamak zorunda kalmak istemezsiniz. İşte tam bu noktada vnstat devreye giriyor. Basit görünüşüne aldanmayın; doğru yapılandırıldığında aylık, haftalık, hatta saatlik granülerlikte trafik geçmişi tutabilen, sistem servis olarak arka planda çalışan, son derece az kaynak tüketen bir araçtan bahsediyoruz.

vnstat Nedir ve Neden Tercih Edilmeli

vnstat, kernel’ın /proc/net/dev arayüzünden veri okuyarak çalışan bir ağ trafik monitörüdür. Paket yakalamaz, trafiği analiz etmez; sadece arayüzden geçen byte miktarını sayar. Bu yüzden CPU ve RAM üzerindeki etkisi neredeyse sıfırdır. iftop veya nethogs gibi araçlar anlık trafiği göstermek için harikadır, ancak geçmişe dönük raporlama yapmazlar. vnstat ise tam tersi bir iş yapar: anlık gösterim için değil, uzun vadeli istatistik tutmak için tasarlanmıştır.

Özellikle şu senaryolarda kurtarıcı olur:

  • Barındırma sağlayıcınız aylık trafik limiti koyuyorsa ve limiti aşmamak istiyorsanız
  • Bir müşteriye “bu ay ne kadar veri transferi yaptık” diye rapor vermek zorundaysanız
  • Beklenmedik bir trafik artışının tam olarak hangi gün/saat yaşandığını tespit etmeye çalışıyorsanız
  • Sunucu kaynaklarını yıllık bazda planlamak ve büyüme trendini görmek istiyorsanız

Kurulum

Debian/Ubuntu tabanlı sistemlerde:

sudo apt update
sudo apt install vnstat

RHEL/CentOS/AlmaLinux için:

sudo dnf install vnstat

Arch Linux için:

sudo pacman -S vnstat

Kurulumun ardından servisi başlatmak ve sistem açılışında otomatik çalışmasını sağlamak gerekiyor:

sudo systemctl enable vnstat
sudo systemctl start vnstat
sudo systemctl status vnstat

vnstat 2.x sürümüyle birlikte arayüz veritabanlarını otomatik oluşturma özelliği geldi. Eski sürümlerde vnstat -u -i eth0 gibi komutlarla arayüzü manuel kaydetmeniz gerekiyordu. Yeni sürümlerde daemon başladığında aktif arayüzleri otomatik algılar.

Temel Kullanım

Kurulumdan hemen sonra veri biriktirmesi için biraz beklemeniz gerekir; ilk birkaç dakikada anlamlı bir çıktı göremezsiniz. Sistem yeniyse birkaç saat bekleyip sonra bakmak mantıklıdır. Mevcut arayüzleri listelemek için:

vnstat --iflist

Varsayılan arayüz için özet görüntülemek:

vnstat

Belirli bir arayüz için:

vnstat -i eth0

Çıktı şöyle görünür: günlük, haftalık ve aylık toplam trafik rakamlarını bir bakışta görürsünüz. Bunun yanında tahmini aylık tüketimi de hesaplayarak gösterir; bu özellik özellikle ayın ortasında “bu hızda gidersek limiti aşar mıyız?” sorusunu cevaplamak için çok kullanışlıdır.

Zaman Bazlı Raporlama Seçenekleri

vnstat’ın asıl gücü farklı zaman dilimlerinde raporlama yapabilmesinden geliyor.

Saatlik rapor:

vnstat -h

ya da daha detaylı görsel çubuk grafikli versiyon:

vnstat -hg

Bu çıktı, son 24 saatin trafik dağılımını saat bazında gösterir. Gece 3’te beklenmedik bir trafik artışı gördüğünüzde önce buraya bakın.

Günlük rapor:

vnstat -d

Haftalık rapor:

vnstat -w

Aylık rapor:

vnstat -m

Son 5 dakikalık aralıklarla anlık trafik (canlı izleme):

vnstat -l -i eth0

Bu son komut iftop‘a benzer şekilde anlık MB/s değerlerini gösterir ancak daha minimal bir çıktıyla. Kısa süreli trafik artışlarını gözlemlemek için kullanışlıdır.

Yapılandırma Dosyası ile İnce Ayar

vnstat’ın davranışını /etc/vnstat.conf dosyasından özelleştirebilirsiniz. Bu dosyayı bir kez düzenleyip geçmek yerine, anlayan biri olarak düzenli olarak gözden geçirmenizi öneririm. Çünkü varsayılan değerler her ortam için ideal değil.

Dikkat etmeniz gereken başlıca parametreler:

  • Interface: Varsayılan arayüzü belirtir; birden fazla NIC olan sunucularda önemli
  • DatabaseDir: Veritabanı dosyalarının tutulduğu dizin, varsayılan /var/lib/vnstat
  • MaxBandwidth: Arayüz kapasitesini tanımlar; 0 devre dışı bırakır. Yanlış set edilirse anlık trafik hesaplamalarında hata çıkabilir
  • SaveInterval: Veritabanına kayıt sıklığı (dakika cinsinden), varsayılan 5 dakika
  • HourlyDays: Saatlik verinin kaç günlük tutulacağı
  • DailyDays: Günlük verinin kaç gün saklanacağı
  • MonthlyMonths: Aylık verinin kaç ay tutulacağı, varsayılan 25 ay

Özellikle MonthlyMonths değeri çok önemli. Sunucuda iki yılı aşkın veri tutmak istiyorsanız bu değeri artırın:

sudo nano /etc/vnstat.conf
MonthlyMonths 36
DailyDays 90
HourlyDays 30

Değişiklik sonrasında servisi yeniden başlatın:

sudo systemctl restart vnstat

JSON Çıktısı ile Otomasyon

vnstat 2.6 ve üzeri sürümlerde JSON çıktısı desteği geldi. Bu özellik, monitoring sistemlerinize ya da kendi yazdığınız script’lere veri beslemek için son derece kullanışlı.

vnstat --json

Belirli bir periyot için:

vnstat --json m

Bu komut aylık veriyi JSON formatında döker. m yerine d (günlük), h (saatlik), w (haftalık), y (yıllık) kullanabilirsiniz.

Örnek bir otomasyon senaryosu: her gün gece yarısı çalışan ve aylık tüketimi kontrol eden bir script yazalım. Eğer belirlediğimiz eşiği aşarsa mail atsın:

#!/bin/bash
# /usr/local/bin/check_bandwidth.sh

INTERFACE="eth0"
LIMIT_GB=800
ALERT_EMAIL="[email protected]"

# Aylık tüketimi GB cinsinden hesapla
CURRENT_MONTH=$(vnstat --json m -i $INTERFACE | python3 -c "
import json, sys
data = json.load(sys.stdin)
months = data['interfaces'][0]['traffic']['month']
latest = months[-1]
rx_gb = latest['rx'] / (1024**3)
tx_gb = latest['tx'] / (1024**3)
total_gb = rx_gb + tx_gb
print(f'{total_gb:.2f}')
")

echo "Bu ay kullanılan bandwidth: ${CURRENT_MONTH} GB"

if (( $(echo "$CURRENT_MONTH > $LIMIT_GB" | bc -l) )); then
    echo "UYARI: Bandwidth limiti aşılıyor!" | mail -s "Bandwidth Uyarisi: ${CURRENT_MONTH}GB / ${LIMIT_GB}GB" $ALERT_EMAIL
fi

Bunu crontab’a ekleyin:

0 8 * * * /usr/local/bin/check_bandwidth.sh

Çoklu Arayüz İzleme

Bir sunucuda birden fazla NIC veya sanal arayüz olabilir: eth0, eth1, bond0, ens3, docker0 gibi. Her birini ayrı ayrı izleyebilirsiniz.

Tüm arayüzlerin özetini görmek için:

vnstat --short

ya da daha ayrıntılı karşılaştırmalı görünüm:

vnstat --oneline b

Bu komut her arayüz için tek satırda byte cinsinden veri verir; script içinde parse etmek için idealdir.

Docker veya LXC kullanıyorsanız sanal bridge arayüzlerinin (docker0, virbr0 gibi) trafiği ana arayüzle çift sayılabileceğini unutmayın. Bu nedenle toplam tüketimi raporlarken sadece fiziksel veya WAN arayüzüne odaklanmak daha doğru sonuç verir.

Grafiksel Raporlama: vnstati

vnstat paketinin bir parçası olan vnstati, PNG formatında grafik çıktısı üretebilir. Özellikle raporları bir web sayfasına gömmek ya da müşteriye mail olarak PDF içinde sunmak istediğinizde işe yarar.

sudo apt install vnstat
# vnstati genellikle vnstat ile birlikte gelir

Aylık grafik oluşturmak için:

vnstati -m -i eth0 -o /tmp/monthly_traffic.png

Günlük saatlik grafiği oluşturmak için:

vnstati -hg -i eth0 -o /tmp/hourly_traffic.png

Başlık ekleyebilirsiniz:

vnstati -m -i eth0 --headertext "Sunucu-01 Aylik Trafik Raporu" -o /var/www/html/traffic.png

Bu PNG dosyasını bir nginx ile serve ederek basit bir monitoring dashboard’u oluşturabilirsiniz. Özellikle müşterilerinize erişim verdiğiniz bir panel yoksa ve hızlıca “bir şeyler göstermeniz” gerekiyorsa bu yöntem hayat kurtarır.

Gerçek Dünya Senaryosu: Aylık Rapor Otomasyonu

Diyelim ki 10 sunucunuz var ve her ay başında önceki aya ait trafik raporunu toplu olarak çekmek istiyorsunuz. Bunun için şöyle bir script işinizi görür:

#!/bin/bash
# /usr/local/bin/monthly_traffic_report.sh
# Her ayın 1'inde crontab ile çalıştırılır

REPORT_DIR="/var/reports/traffic"
REPORT_DATE=$(date -d "last month" +%Y-%m)
REPORT_FILE="${REPORT_DIR}/traffic_report_${REPORT_DATE}.txt"

mkdir -p $REPORT_DIR

echo "===============================" > $REPORT_FILE
echo "Aylik Trafik Raporu: $REPORT_DATE" >> $REPORT_FILE
echo "Rapor Tarihi: $(date '+%d.%m.%Y %H:%M')" >> $REPORT_FILE
echo "===============================" >> $REPORT_FILE
echo "" >> $REPORT_FILE

for IFACE in $(vnstat --iflist 2>/dev/null | grep -oP '(?<=Available interfaces: ).*' | tr ',' ' '); do
    echo "--- Arayuz: $IFACE ---" >> $REPORT_FILE
    vnstat -m -i $IFACE | tail -5 >> $REPORT_FILE
    echo "" >> $REPORT_FILE
done

# Raporu mail olarak gonder
if command -v mail &> /dev/null; then
    mail -s "Aylik Trafik Raporu - $(hostname) - $REPORT_DATE" [email protected] < $REPORT_FILE
fi

echo "Rapor olusturuldu: $REPORT_FILE"

Crontab girişi:

0 9 1 * * /usr/local/bin/monthly_traffic_report.sh

Veri Tabanı Bakımı ve Sorun Giderme

vnstat veritabanları /var/lib/vnstat/ dizininde tutulur. Her arayüz için ayrı bir dosya oluşturulur. Zaman zaman bu veritabanlarının bozulduğunu görebilirsiniz, özellikle sunucu ani kapanmışsa.

Veritabanı durumunu kontrol etmek için:

vnstat --dbiflist

Eğer bir arayüz için veri toplamak istemiyorsanız (örneğin lo veya Docker sanal arayüzleri):

sudo vnstat --delete -i lo
sudo systemctl restart vnstat

Veritabanının sağlıklı olup olmadığını kontrol etmek ve varsa bozuk kayıtları temizlemek için:

sudo vnstat --rebuildtotals -i eth0

Sunucu saat dilimini değiştirdikten sonra vnstat raporlarında kayma yaşayabilirsiniz. Bu durumda veritabanını yeniden oluşturmak yerine zaman damgalarını kontrol edin ve gerekirse backup alıp veritabanını reset edin:

sudo cp -r /var/lib/vnstat /var/lib/vnstat.bak
sudo systemctl stop vnstat
sudo rm /var/lib/vnstat/eth0
sudo systemctl start vnstat

Prometheus ile Entegrasyon

Modern altyapılarda Prometheus + Grafana stack’i kullanıyorsanız vnstat verilerini bu sistemle entegre edebilirsiniz. vnstat_exporter adında bir community exporter mevcut; ancak basit bir shell exporter yazmak da o kadar zor değil:

#!/bin/bash
# /usr/local/bin/vnstat_metrics.sh
# Prometheus textfile collector icin

OUTPUT_FILE="/var/lib/node_exporter/textfile_collector/vnstat.prom"

for IFACE in $(ls /var/lib/vnstat/); do
    # JSON ciktisindan degerler cek
    DATA=$(vnstat --json d -i $IFACE 2>/dev/null)
    if [ $? -eq 0 ]; then
        RX=$(echo $DATA | python3 -c "import json,sys; d=json.load(sys.stdin); print(d['interfaces'][0]['traffic']['day'][-1]['rx'])" 2>/dev/null || echo 0)
        TX=$(echo $DATA | python3 -c "import json,sys; d=json.load(sys.stdin); print(d['interfaces'][0]['traffic']['day'][-1]['tx'])" 2>/dev/null || echo 0)
        echo "vnstat_rx_bytes_today{interface="$IFACE"} $RX" >> $OUTPUT_FILE.tmp
        echo "vnstat_tx_bytes_today{interface="$IFACE"} $TX" >> $OUTPUT_FILE.tmp
    fi
done

mv $OUTPUT_FILE.tmp $OUTPUT_FILE

Bu script’i 5 dakikada bir crontab ile çalıştırırsanız node_exporter üzerinden Prometheus’a veri akışı sağlarsınız.

Pratik Öneriler ve Dikkat Edilmesi Gerekenler

Yıllar içinde vnstat kullanırken birkaç şeyi zor yoldan öğrendim:

  • Sunucu yeniden kurulduğunda /var/lib/vnstat dizinini yedeklemeyi unutmayın. Tüm geçmiş verileriniz orada. Yeni kurulumda bu dizini restore ederseniz istatistikleriniz kaybolmaz.
  • Bazı cloud sağlayıcılar (özellikle AWS, GCP) ağ arayüz isimlerini değiştirir. Snapshot’tan restore ettiğinizde arayüz adı farklı olabilir; bu durumda vnstat eski arayüzü görmez, yenisini yeni arayüz olarak başlatır. /etc/vnstat.conf içindeki Interface parametresini güncellemeyi unutmayın.
  • vnstat sadece arayüz üzerinden geçen trafiği sayar. Eğer aynı VLAN içindeki iki VM birbirleriyle konuşuyorsa bu trafik fiziksel NIC’ten geçmez ve vnstat tarafından görülmez. Gerçek external trafik için doğru arayüzü izlediğinizden emin olun.
  • Çok yoğun trafikli sunucularda (örneğin CDN edge node’ları) SaveInterval değerini 1 dakikaya çekebilirsiniz. Bu daha granüler veri sağlar ancak disk yazma işlemini artırır. SSD’li sistemlerde bu sorun değil ama eski HDD’li sunucularda dikkatli olun.

Sonuç

vnstat görkemli bir araç değil, gösterişsiz ve güvenilir bir araçtır. Yıllarca arka planda sessizce çalışır, sormadığınız sürece ses çıkarmaz; sorduğunuzda ise aylarca öncesine ait veriyi karşınıza serer. Sysadmin araç kutusunda bu tür “quiet professionals” her zaman olmalı.

İlk adım olarak bugün yönettiğiniz sunuculara vnstat kurun, servisi aktif edin ve yapılandırma dosyasını ihtiyacınıza göre düzenleyin. Birkaç hafta sonra geriye dönüp baktığınızda, o verinin ne kadar değerli olduğunu anlayacaksınız; özellikle bir gece beklenmedik trafik artışı yaşandığında ve “ne zaman başladı, ne kadar sürdü” sorusunu saniyeler içinde cevaplamanız gerektiğinde.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir