Windows’ta Network Bant Genişliği Kullanımını İzleme ve Analiz Etme

Ağ trafiğini izlemek, sistem yöneticiliğinin en kritik görevlerinden biri. Özellikle Windows sunucularında bant genişliği kullanımını anlamak, hem performans sorunlarını çözmek hem de güvenlik anomalilerini tespit etmek açısından hayati önem taşıyor. “Sunucu yavaşladı” şikayeti aldığınızda ilk bakmanız gereken yerlerden biri ağ katmanı. Bu yazıda Windows ortamında bant genişliği izleme ve analizini, gerçek dünya senaryolarıyla birlikte ele alacağız.

Neden Bant Genişliği İzleme Bu Kadar Önemli?

Düşünün ki sabah 09:00’da şirketin ERP sistemi yavaşlamaya başladı. Sunucuya bağlandınız, CPU normal, RAM yeterli. Peki ağ trafiği nasıl? İşte tam bu noktada bant genişliği izleme devreye giriyor.

Gerçek hayattan bir senaryo: Bir müşterimizin Windows Server 2019 üzerinde çalışan dosya sunucusu, iş günlerinin ortasında düzenli olarak yavaşlıyordu. CPU ve bellek metrikleri normaldi. Ağ trafiğine baktığımızda gördük ki bir backup yazılımı öğle saatlerinde yüksek bant genişliği tüketiyordu ve bu da kullanıcıların dosya erişimini olumsuz etkiliyordu. Çözüm basitti: Backup zamanlamasını gece saatlerine almak. Ama bunu görmek için doğru araçlara ihtiyaç vardı.

Windows Performans Monitörü ile Temel İzleme

Windows’un yerleşik aracı Performance Monitor (perfmon), bant genişliği izleme için güçlü bir başlangıç noktası. Komut satırından şöyle başlatabilirsiniz:

perfmon /sys

Ancak asıl güç, komut satırı araçlarında yatıyor. typeperf komutu ile ağ arayüzü verilerini gerçek zamanlı olarak toplayabilirsiniz:

typeperf "Network Interface(*)Bytes Total/sec" -si 5 -sc 60 -o C:logsnetwork_monitor.csv

Bu komut şunu yapar:

  • Network Interface(*)Bytes Total/sec: Tüm ağ arayüzlerindeki toplam byte/saniye değerini alır
  • -si 5: Her 5 saniyede bir örnekleme yapar
  • -sc 60: 60 örnek toplar (5 dakikalık veri)
  • -o: Çıktıyı CSV dosyasına yazar

Daha spesifik metrikleri izlemek için:

typeperf "Network Interface(*)Bytes Sent/sec" "Network Interface(*)Bytes Received/sec" "Network Interface(*)Current Bandwidth" -si 10 -sc 120 -o C:logsnet_detailed.csv

PowerShell ile Bant Genişliği İzleme

PowerShell, Windows ağ izlemesinde gerçek bir güç aracı. Get-NetAdapterStatistics cmdlet’i ile anlık istatistiklere ulaşabilirsiniz:

Get-NetAdapterStatistics | Select-Object Name, ReceivedBytes, SentBytes, ReceivedUnicastPackets, SentUnicastPackets | Format-Table -AutoSize

Ancak anlık değerler çoğu zaman yeterli değil. Aşağıdaki script, belirli bir süre boyunca bant genişliği kullanımını ölçer ve Mbps cinsinden gösterir:

$adapter = "Ethernet"
$interval = 2

while ($true) {
    $stats1 = Get-NetAdapterStatistics -Name $adapter
    Start-Sleep -Seconds $interval
    $stats2 = Get-NetAdapterStatistics -Name $adapter

    $receivedMbps = [math]::Round((($stats2.ReceivedBytes - $stats1.ReceivedBytes) * 8 / $interval) / 1MB, 2)
    $sentMbps = [math]::Round((($stats2.SentBytes - $stats1.SentBytes) * 8 / $interval) / 1MB, 2)

    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    Write-Host "[$timestamp] Alinan: $receivedMbps Mbps | Gonderilen: $sentMbps Mbps"

    Add-Content -Path "C:logsbandwidth_log.txt" -Value "[$timestamp] RX: $receivedMbps Mbps | TX: $sentMbps Mbps"
}

Bu script’i Task Scheduler ile otomatik çalıştırabilir, saatlik raporlar oluşturabilirsiniz.

netstat ile Bağlantı Analizi

Hangi süreçlerin ağı kullandığını görmek istiyorsanız netstat vazgeçilmez araçlardan biri:

netstat -ano | findstr ESTABLISHED

Parametre açıklamaları:

  • -a: Tüm aktif bağlantıları ve dinleyen portları gösterir
  • -n: Sayısal format, DNS çözümlemesi yapmaz (hızlı çalışır)
  • -o: Her bağlantı için PID (Process ID) gösterir

PID’yi bulduktan sonra hangi sürecin ağı kullandığını öğrenmek için:

tasklist /FI "PID eq 4832" /FO LIST

Daha kapsamlı bir analiz için şu PowerShell komutunu kullanabilirsiniz:

Get-NetTCPConnection -State Established | 
    Select-Object LocalAddress, LocalPort, RemoteAddress, RemotePort, OwningProcess |
    ForEach-Object {
        $proc = Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue
        [PSCustomObject]@{
            LocalAddress  = $_.LocalAddress
            LocalPort     = $_.LocalPort
            RemoteAddress = $_.RemoteAddress
            RemotePort    = $_.RemotePort
            ProcessName   = $proc.Name
            PID           = $_.OwningProcess
        }
    } | Sort-Object ProcessName | Format-Table -AutoSize

Bu komut size hangi sürecin hangi uzak adrese bağlandığını net bir şekilde gösterir. Beklenmedik bir dış IP adresine bağlantı görürseniz, bu güvenlik açısından da önemli bir sinyal.

Resource Monitor ile Görsel Analiz

Komut satırı her zaman yeterli olmayabilir. Windows’un yerleşik Resource Monitor aracı, ağ kullanımını süreç bazında görsel olarak sunar:

resmon.exe

Resource Monitor’ün Network sekmesinde şunları görebilirsiniz:

  • Processes with Network Activity: Ağ kullanan süreçler ve byte/saniye değerleri
  • Network Activity: Aktif bağlantılar ve trafik detayları
  • TCP Connections: Tüm TCP bağlantıları
  • Listening Ports: Dinleyen portlar

Gerçek dünya senaryosu: Bir Windows sunucusunda anti-virüs yazılımının gece 02:00’de imza güncellemesi yapması sırasında bant genişliğinin %80’ini kullandığını Resource Monitor sayesinde tespit ettik. Bu bilgiyle güncelleme saatini daha uygun bir zaman dilimine aldık.

WMI ile Özelleştirilmiş İzleme

Windows Management Instrumentation (WMI), sistem bilgilerine programatik erişim için güçlü bir arayüz sunar. Ağ adaptörü istatistiklerini WMI üzerinden çekmek için:

Get-WmiObject -Class Win32_PerfFormattedData_Tcpip_NetworkInterface | 
    Select-Object Name, BytesReceivedPersec, BytesSentPersec, CurrentBandwidth |
    ForEach-Object {
        $rxMbps = [math]::Round($_.BytesReceivedPersec * 8 / 1MB, 3)
        $txMbps = [math]::Round($_.BytesSentPersec * 8 / 1MB, 3)
        $totalBwMbps = [math]::Round($_.CurrentBandwidth / 1MB, 0)
        
        Write-Host "Arayuz: $($_.Name)"
        Write-Host "  Alinan: $rxMbps Mbps"
        Write-Host "  Gonderilen: $txMbps Mbps"
        Write-Host "  Toplam Kapasite: $totalBwMbps Mbps"
        Write-Host "---"
    }

Bu script, sisteminizdeki tüm ağ adaptörlerinin anlık kullanımını Mbps cinsinden gösterir.

Uyarı Sistemi Kurma

İzleme yapmak yeterli değil, anormal durumlarda uyarı almanız gerekiyor. Aşağıdaki script, bant genişliği kullanımı belirli bir eşiği aştığında e-posta gönderir:

param(
    [string]$AdapterName = "Ethernet",
    [double]$ThresholdMbps = 800,
    [string]$SmtpServer = "mail.sirket.local",
    [string]$AlertEmail = "[email protected]"
)

function Get-BandwidthMbps {
    param([string]$Adapter, [int]$IntervalSec = 3)
    
    $s1 = Get-NetAdapterStatistics -Name $Adapter
    Start-Sleep -Seconds $IntervalSec
    $s2 = Get-NetAdapterStatistics -Name $Adapter
    
    $totalBytes = ($s2.ReceivedBytes - $s1.ReceivedBytes) + ($s2.SentBytes - $s1.SentBytes)
    return [math]::Round(($totalBytes * 8 / $IntervalSec) / 1MB, 2)
}

while ($true) {
    $currentMbps = Get-BandwidthMbps -Adapter $AdapterName
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    
    Write-Host "[$timestamp] Bant genisligi kullanimi: $currentMbps Mbps"
    
    if ($currentMbps -gt $ThresholdMbps) {
        $subject = "UYARI: Yuksek Bant Genisligi Kullanimi - $env:COMPUTERNAME"
        $body = "Sunucu: $env:COMPUTERNAME`nZaman: $timestamp`nKullanim: $currentMbps Mbps`nEsik: $ThresholdMbps Mbps"
        
        Send-MailMessage -SmtpServer $SmtpServer -From "[email protected]" `
            -To $AlertEmail -Subject $subject -Body $body
        
        Write-Warning "Uyari emaili gonderildi! Kullanim: $currentMbps Mbps"
    }
    
    Start-Sleep -Seconds 30
}

Bu script’i bir Windows Service olarak veya Task Scheduler üzerinden çalıştırabilirsiniz.

Wireshark ile Derin Paket Analizi

Bazen sadece “ne kadar bant genişliği kullanılıyor” yetmez, “hangi trafik bu bant genişliğini kullanıyor” sorusunun cevabını da ararsınız. Wireshark bu noktada devreye girer. GUI aracı olmasına rağmen, tshark adlı komut satırı versiyonu sunucularda çok kullanışlı:

tshark -i "Ethernet" -a duration:60 -q -z io,stat,10,"ip" 2>&1

Parametre açıklamaları:

  • -i “Ethernet”: İzlenecek ağ arayüzü
  • -a duration:60: 60 saniye sonra otomatik durdur
  • -q: Sessiz mod, sadece istatistikleri göster
  • -z io,stat,10: 10 saniyelik aralıklarla I/O istatistikleri

Belirli bir IP adresinin trafiğini analiz etmek için:

tshark -i "Ethernet" -f "host 192.168.1.50" -a duration:120 -w C:captureshost_capture.pcap

Bu yakalama dosyasını daha sonra Wireshark GUI’de açıp detaylı analiz yapabilirsiniz.

Windows Server’da Yerleşik Ağ İzleme Araçları

NIC Teaming İzleme

Sunucunuzda NIC Teaming kullanıyorsanız, her bir fiziksel adaptörün yükünü izlemek önemli:

Get-NetLbfoTeamMember | ForEach-Object {
    $stats = Get-NetAdapterStatistics -Name $_.Name
    Write-Host "Uye: $($_.Name) | RX: $($stats.ReceivedBytes) bytes | TX: $($stats.SentBytes) bytes"
}

DNS ve DHCP Sunucu Trafik Analizi

Windows Server’ın DNS veya DHCP sunucusu rolü varsa, bu servislerin trafik yükünü de izlemelisiniz:

$dnsCounters = Get-Counter -Counter "DNSTotal Query Received/sec","DNSTotal Response Sent/sec" -SampleInterval 5 -MaxSamples 12

$dnsCounters.CounterSamples | ForEach-Object {
    Write-Host "$($_.Path): $([math]::Round($_.CookedValue, 2))"
}

Log Tabanlı Uzun Vadeli Analiz

Kısa vadeli izleme anlık sorunları çözer, ancak trend analizi için uzun vadeli log toplamaya ihtiyaç duyarsınız. Aşağıdaki script saatlik bant genişliği raporları oluşturur:

$logPath = "C:NetworkLogs"
$reportFile = Join-Path $logPath "hourly_report_$(Get-Date -Format 'yyyyMMdd_HH').csv"

if (-not (Test-Path $logPath)) {
    New-Item -ItemType Directory -Path $logPath | Out-Null
}

$results = @()
$adapters = Get-NetAdapter | Where-Object { $_.Status -eq "Up" }

foreach ($adapter in $adapters) {
    $samples = @()
    
    for ($i = 0; $i -lt 12; $i++) {
        $s1 = Get-NetAdapterStatistics -Name $adapter.Name
        Start-Sleep -Seconds 5
        $s2 = Get-NetAdapterStatistics -Name $adapter.Name
        
        $rxMbps = [math]::Round((($s2.ReceivedBytes - $s1.ReceivedBytes) * 8 / 5) / 1MB, 2)
        $txMbps = [math]::Round((($s2.SentBytes - $s1.SentBytes) * 8 / 5) / 1MB, 2)
        $samples += ($rxMbps + $txMbps)
    }
    
    $avgMbps = [math]::Round(($samples | Measure-Object -Average).Average, 2)
    $maxMbps = [math]::Round(($samples | Measure-Object -Maximum).Maximum, 2)
    
    $results += [PSCustomObject]@{
        Timestamp   = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
        AdapterName = $adapter.Name
        AvgMbps     = $avgMbps
        MaxMbps     = $maxMbps
        LinkSpeed   = "$([math]::Round($adapter.LinkSpeed / 1GB, 0)) Gbps"
    }
}

$results | Export-Csv -Path $reportFile -NoTypeInformation -Encoding UTF8
Write-Host "Rapor olusturuldu: $reportFile"

Bu script’i Task Scheduler ile her saat çalışacak şekilde ayarlarsanız, aylık trafik trendlerini Excel’de analiz edebilirsiniz.

Üçüncü Parti Araçlar

Yerleşik araçlar güçlü olsa da bazı durumlarda daha kapsamlı çözümler gerekebilir:

  • PRTG Network Monitor: Kurumsal ortamlar için kapsamlı izleme, ücretsiz sürümde 100 sensöre kadar izin veriyor
  • SolarWinds Network Performance Monitor: Büyük ağlar için güçlü ama maliyetli
  • Nagios/Zabbix: Açık kaynak, Windows agent ile mükemmel entegrasyon
  • Grafana + Prometheus + windows_exporter: Modern yaklaşım, dashboard oluşturma konusunda çok esnek
  • NetFlow Analyzer: NetFlow protokolü destekleyen switch/router varsa trafik analizi için ideal

PRTG veya Zabbix tercih ettiğimde genellikle şu metrikleri izliyorum:

  • Bandwidth utilization: 5 dakikalık ortalama
  • Packet loss rate: %1 üzeri kritik
  • Network error rate: Interface hatalarının artışı
  • Top talkers: En çok bant genişliği kullanan IP adresleri

Güvenlik Perspektifinden Ağ İzleme

Bant genişliği izleme sadece performans meselesi değil, güvenlik açısından da kritik. Anormal trafik örüntüleri şunlara işaret edebilir:

  • Gece saatlerinde yüksek outbound trafik: Veri sızıntısı veya botnet aktivitesi
  • Broadcast storm: Ağ döngüsü veya yanlış yapılandırılmış cihaz
  • Ani trafik artışları: DDoS saldırısı veya kötü amaçlı yazılım yayılması
  • Bilinmeyen dış IP bağlantıları: Zararlı yazılım C2 iletişimi

Şüpheli bir durumda hızlıca hangi sürecin hangi dış adrese bağlandığını görmek için:

$connections = Get-NetTCPConnection -State Established | 
    Where-Object { $_.RemoteAddress -notlike "10.*" -and 
                   $_.RemoteAddress -notlike "192.168.*" -and 
                   $_.RemoteAddress -notlike "172.16.*" -and
                   $_.RemoteAddress -ne "127.0.0.1" }

$connections | ForEach-Object {
    $proc = Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue
    Write-Host "Proses: $($proc.Name) (PID: $($_.OwningProcess)) -> $($_.RemoteAddress):$($_.RemotePort)"
}

Bu komut, yerel ağ dışındaki tüm aktif bağlantıları ve bunları oluşturan süreçleri listeler. Tanımadığınız bir süreç beklenmedik bir dış adrese bağlanıyorsa, bu acil müdahale gerektiren bir durum olabilir.

Performans Temel Çizgisi Oluşturma

İyi bir izleme altyapısı için önce normalin ne olduğunu bilmeniz gerekir. Baseline (temel çizgi) oluşturmak bu yüzden önemli. Birkaç hafta boyunca saatlik veri toplayın ve şu değerleri belirleyin:

  • İş saatleri ortalaması (08:00-18:00)
  • Gece ortalaması (18:00-08:00)
  • Haftalık peak değerleri
  • Maksimum gözlemlenen kullanım

Bu baseline’ı belirledikten sonra uyarı eşiklerinizi şöyle ayarlayabilirsiniz:

  • Uyarı: Baseline peak değerinin %150’si
  • Kritik: Baseline peak değerinin %200’si veya link kapasitesinin %85’i

Sorun Giderme Senaryoları

Senaryo 1: Yavaş dosya transferleri

Kullanıcılar dosya kopyalamanın yavaş olduğundan şikayet ediyor. Önce adaptör hızını kontrol edin:

Get-NetAdapter | Select-Object Name, Status, LinkSpeed, FullDuplex

Duplex mismatch (yarı/tam çift yönlü uyumsuzluğu) en sık karşılaşılan sorunlardan biri. Adaptör full-duplex iken switch half-duplex çalışıyorsa veya tam tersi, ciddi performans kaybı yaşanır.

Senaryo 2: Intermittent bağlantı sorunları

Aralıklı bağlantı sorunlarında paket kaybını izleyin:

$target = "8.8.8.8"
1..100 | ForEach-Object {
    $result = Test-Connection -ComputerName $target -Count 1 -ErrorAction SilentlyContinue
    if ($result) {
        Write-Host "Basarili - RTT: $($result.ResponseTime)ms"
    } else {
        Write-Warning "Paket kaybi tespit edildi! ($_. deneme)"
    }
    Start-Sleep -Milliseconds 500
}

Sonuç

Windows’ta ağ bant genişliği izleme ve analizi, hem yerleşik araçları hem de özelleştirilmiş scriptleri kapsayan çok katmanlı bir süreç. typeperf ve netstat ile hızlı anlık analizler yapabilirken, PowerShell scriptleri ile otomatik raporlama ve uyarı sistemleri kurabilirsiniz. Wireshark ve tshark ise derin paket analizine ihtiyaç duyduğunuzda devreye giriyor.

Önemli olan sadece araçları bilmek değil, doğru soruları sormak. “Sunucu neden yavaş?” sorusunun cevabını çoğu zaman ağ trafiği verisinde bulursunuz. Baseline oluşturmak, düzenli raporlama yapmak ve anormal durumlarda otomatik uyarı almak, proaktif sistem yönetiminin temel taşları. Güvenlik perspektifini de unutmamalısınız: Anormal outbound trafik bazen bir performans sorunundan çok daha ciddi bir soruna işaret edebilir.

Ağ izleme konusunda kasları geliştirmenin en iyi yolu pratik yapmak. Ortamınızda bu scriptleri çalıştırın, kendi baseline değerlerinizi oluşturun ve zamanla hangi örüntülerin normal, hangilerinin anormal olduğunu öğrenin. Bu bilgi birikimi, bir sonraki ağ sorununu çözerken size ciddi zaman kazandıracak.

Bir yanıt yazın

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