Ağ yönetimi konusunda Windows Server ortamlarında çalışan sysadmin’lerin en çok vakit kaybettiği alanlardan biri, adaptör konfigürasyonu ve bağlantı sorunlarıyla uğraşmaktır. GUI üzerinden her seferinde aynı adımları tekrarlamak, özellikle onlarca sunucunun olduğu ortamlarda gerçek bir kabus haline gelir. PowerShell bu noktada hayat kurtarıcı oluyor. Hem hızlı hem tekrarlanabilir hem de scriptlenebilir bir yapı sunuyor. Bu yazıda ağ adaptörü yönetimini PowerShell ile nasıl yapacağınızı, gerçek dünya senaryoları eşliğinde detaylıca anlatacağım.
Ağ Adaptörlerini Listelemek ve Bilgi Almak
Her şeyden önce sisteminizde hangi adaptörlerin olduğunu görmeniz gerekiyor. Get-NetAdapter komutu bu iş için temel başlangıç noktanızdır.
# Tüm ağ adaptörlerini listele
Get-NetAdapter
# Sadece aktif (Up durumundaki) adaptörleri listele
Get-NetAdapter | Where-Object {$_.Status -eq "Up"}
# Belirli bir adaptörün detaylı bilgisini al
Get-NetAdapter -Name "Ethernet0" | Format-List *
Bu komutun çıktısında Name, InterfaceDescription, Status, MacAddress ve LinkSpeed gibi temel bilgileri görürsünüz. Özellikle Format-List * ekleyince adaptöre dair neredeyse her şeyi döküyor.
Daha detaylı ağ istatistiklerine bakmak istediğinizde Get-NetAdapterStatistics devreye giriyor:
# Adaptör istatistiklerini görüntüle
Get-NetAdapterStatistics -Name "Ethernet0"
# Tüm adaptörlerin istatistiklerini al ve sırala
Get-NetAdapterStatistics | Sort-Object ReceivedBytes -Descending
Bu komut ile hangi adaptörden ne kadar trafik geçtiğini, kaç paket alındığını ve kaç paket gönderildiğini görebilirsiniz. Örneğin bir sunucuda beklenmedik yüksek trafik varsa bu komut ile hangi adaptörün yoğun olduğunu hemen anlarsınız.
IP Adresi Konfigürasyonu
IP adresi atama ve yönetimi, günlük işlerin büyük bir kısmını oluşturuyor. PowerShell ile bu işlemleri hem hızlı hem de hata yapmadan yapabilirsiniz.
# Mevcut IP konfigürasyonunu görüntüle
Get-NetIPAddress
# Sadece IPv4 adreslerini görüntüle
Get-NetIPAddress -AddressFamily IPv4
# Belirli bir adaptörün IP bilgilerini al
Get-NetIPAddress -InterfaceAlias "Ethernet0"
# Statik IP adresi ata
New-NetIPAddress -InterfaceAlias "Ethernet0" `
-IPAddress "192.168.1.100" `
-PrefixLength 24 `
-DefaultGateway "192.168.1.1"
# Mevcut IP adresini kaldır
Remove-NetIPAddress -InterfaceAlias "Ethernet0" -IPAddress "192.168.1.100" -Confirm:$false
-PrefixLength parametresi subnet mask yerine kullanılan CIDR notasyonudur. 24 değeri 255.255.255.0 anlamına gelir. Bu ayrımı aklınızda tutun çünkü eski netsh komutlarına alışkın olanlar bazen burada kafası karışıyor.
DNS Sunucusu Atama
IP atadıktan sonra DNS konfigürasyonu da gerekiyor. Özellikle domain ortamlarında doğru DNS sunucusunu atamak kritik önem taşıyor.
# DNS sunucularını görüntüle
Get-DnsClientServerAddress
# DNS sunucusu ata (tek sunucu)
Set-DnsClientServerAddress -InterfaceAlias "Ethernet0" -ServerAddresses "192.168.1.10"
# Birden fazla DNS sunucusu ata
Set-DnsClientServerAddress -InterfaceAlias "Ethernet0" `
-ServerAddresses ("192.168.1.10", "192.168.1.11")
# DNS sunucusunu DHCP'ye bırak (temizle)
Set-DnsClientServerAddress -InterfaceAlias "Ethernet0" -ResetServerAddresses
Gerçek dünya senaryosunda bir domain controller kuruyorsunuz diyelim. DC’yi kurduktan sonra sunucunun kendi IP adresini primary DNS olarak göstermesi gerekiyor. Bu komutları bir kurulum scriptine ekleyerek otomatikleştirebilirsiniz.
DHCP ve Statik IP Geçişi
Özellikle yeni kurulan sunucularda başlangıçta DHCP ile geliyor, sonradan statik IP vermeniz gerekiyor. Bu geçişi PowerShell ile temiz bir şekilde yapabilirsiniz.
# Adaptörü DHCP'ye al
Set-NetIPInterface -InterfaceAlias "Ethernet0" -Dhcp Enabled
# DHCP'den statik IP'ye geçiş scripti
$InterfaceName = "Ethernet0"
$NewIP = "10.10.10.50"
$PrefixLength = 24
$Gateway = "10.10.10.1"
$DNS = @("10.10.10.5", "10.10.10.6")
# Önce DHCP'yi kapat
Set-NetIPInterface -InterfaceAlias $InterfaceName -Dhcp Disabled
# Mevcut IP varsa temizle
$ExistingIP = Get-NetIPAddress -InterfaceAlias $InterfaceName -AddressFamily IPv4 -ErrorAction SilentlyContinue
if ($ExistingIP) {
Remove-NetIPAddress -InterfaceAlias $InterfaceName -AddressFamily IPv4 -Confirm:$false
}
# Mevcut gateway'i temizle
$ExistingRoute = Get-NetRoute -InterfaceAlias $InterfaceName -DestinationPrefix "0.0.0.0/0" -ErrorAction SilentlyContinue
if ($ExistingRoute) {
Remove-NetRoute -InterfaceAlias $InterfaceName -DestinationPrefix "0.0.0.0/0" -Confirm:$false
}
# Yeni IP ve gateway ata
New-NetIPAddress -InterfaceAlias $InterfaceName `
-IPAddress $NewIP `
-PrefixLength $PrefixLength `
-DefaultGateway $Gateway
# DNS ata
Set-DnsClientServerAddress -InterfaceAlias $InterfaceName -ServerAddresses $DNS
Write-Host "IP konfigürasyonu tamamlandı: $NewIP" -ForegroundColor Green
Bu script özellikle toplu sunucu konfigürasyonu yapılırken işe yarıyor. Değişkenleri parametre olarak da alacak şekilde düzenleyebilirsiniz.
Adaptör Özellikleri ve Performans Ayarları
Ağ adaptörünün performansını etkileyen birçok ayar var. Jumbo frame, flow control, RSS (Receive Side Scaling) gibi özellikler PowerShell üzerinden yönetilebilir.
# Adaptörün gelişmiş özelliklerini listele
Get-NetAdapterAdvancedProperty -Name "Ethernet0"
# Jumbo Packet ayarını görüntüle
Get-NetAdapterAdvancedProperty -Name "Ethernet0" -RegistryKeyword "JumboPacket"
# Jumbo Frame'i etkinleştir (9000 byte)
Set-NetAdapterAdvancedProperty -Name "Ethernet0" `
-RegistryKeyword "JumboPacket" `
-RegistryValue 9014
# RSS ayarlarını görüntüle
Get-NetAdapterRss -Name "Ethernet0"
# RSS'i etkinleştir
Enable-NetAdapterRss -Name "Ethernet0"
# Flow Control'ü devre dışı bırak (bazen performans için gerekli)
Set-NetAdapterAdvancedProperty -Name "Ethernet0" `
-RegistryKeyword "*FlowControl" `
-RegistryValue 0
Jumbo Frame konusunda bir not: Eğer storage trafiği (iSCSI gibi) için ayrı bir adaptör kullanıyorsanız ve switch tarafında da jumbo frame aktifse bunu kesinlikle etkinleştirmelisiniz. Performans farkı ciddi oluyor. Ancak dikkat edin, hem sunucu hem de switch hem de hedef taraf bu ayarı desteklemeli, yoksa paket kayıpları yaşanır.
NIC Teaming (LBFO)
Yüksek erişilebilirlik ve yük dengeleme için NIC teaming kritik bir özellik. PowerShell ile bu işlemi yapmak GUI’den çok daha hızlı.
# Mevcut team'leri listele
Get-NetLbfoTeam
# Yeni bir NIC team oluştur
New-NetLbfoTeam -Name "ServerTeam" `
-TeamMembers "Ethernet0", "Ethernet1" `
-TeamingMode SwitchIndependent `
-LoadBalancingAlgorithm Dynamic
# Team'e adaptör ekle
Add-NetLbfoTeamMember -Name "Ethernet2" -Team "ServerTeam"
# Team üyelerini görüntüle
Get-NetLbfoTeamMember -Team "ServerTeam"
# Team'i kaldır
Remove-NetLbfoTeam -Name "ServerTeam" -Confirm:$false
-TeamingMode için seçenekler:
- SwitchIndependent: Switch konfigürasyonu gerektirmez, en yaygın kullanım
- Lacp: IEEE 802.3ad LACP protokolü, switch desteği gerektirir
- Static: Manuel konfigürasyon, switch desteği gerektirir
-LoadBalancingAlgorithm için seçenekler:
- Dynamic: Windows Server 2012 R2 ve üzeri için önerilen, en iyi performans
- HyperVPort: Hyper-V ortamlarında sanal makineler için
- TransportPorts: Kaynak/hedef port bazlı dağıtım
- IPAddresses: IP adresi bazlı dağıtım
- MacAddresses: MAC adresi bazlı dağıtım
Firewall ve Bağlantı Kontrolleri
Ağ bağlantısı sorunlarında PowerShell ile hızlı teşhis yapabilirsiniz. Test-NetConnection bu konuda en değerli araçlardan biri.
# Temel ping testi
Test-NetConnection -ComputerName "google.com"
# Belirli bir porta bağlantı testi
Test-NetConnection -ComputerName "192.168.1.100" -Port 443
# Traceroute benzeri detaylı test
Test-NetConnection -ComputerName "8.8.8.8" -TraceRoute
# Birden fazla sunucuya port testi (toplu kontrol)
$Servers = @("web01", "web02", "web03", "db01")
$Port = 80
foreach ($Server in $Servers) {
$Result = Test-NetConnection -ComputerName $Server -Port $Port -WarningAction SilentlyContinue
$Status = if ($Result.TcpTestSucceeded) { "AÇIK" } else { "KAPALI/ERİŞİLEMEZ" }
Write-Host "$Server`:$Port - $Status" -ForegroundColor $(if ($Result.TcpTestSucceeded) {"Green"} else {"Red"})
}
Bu toplu port kontrol scripti özellikle maintenance window öncesinde veya yeni bir deployment sonrasında tüm servislerin ayakta olup olmadığını hızlıca kontrol etmek için mükemmel. Ben bunu her deployment sonrası çalıştırıyorum.
Routing Tablosu Yönetimi
Birden fazla ağ segmenti olan ortamlarda routing tablosunu yönetmek önemli. PowerShell ile bunu kolayca yapabilirsiniz.
# Routing tablosunu görüntüle
Get-NetRoute
# Sadece IPv4 route'larını göster
Get-NetRoute -AddressFamily IPv4
# Belirli bir interface'in route'larını göster
Get-NetRoute -InterfaceAlias "Ethernet0"
# Yeni route ekle (örnek: 10.20.0.0/16 ağı için gateway)
New-NetRoute -InterfaceAlias "Ethernet0" `
-DestinationPrefix "10.20.0.0/16" `
-NextHop "192.168.1.254" `
-RouteMetric 100
# Route kaldır
Remove-NetRoute -InterfaceAlias "Ethernet0" `
-DestinationPrefix "10.20.0.0/16" `
-Confirm:$false
# Tüm interface'ler için metric değerlerini görüntüle
Get-NetIPInterface | Select-Object InterfaceAlias, InterfaceMetric, AddressFamily
RouteMetric değerini düşük tutmak o route’un öncelikli seçileceği anlamına gelir. Birden fazla yol varsa en düşük metric değerine sahip olan tercih edilir.
Gerçek Dünya Senaryosu: Yeni Sunucu Kurulum Scripti
Şimdi tüm bu komutları birleştirerek gerçekçi bir senaryo yaratalım. Yeni bir Windows Server 2022 kurulumu yapıyorsunuz ve ağ konfigürasyonunu otomatize etmek istiyorsunuz:
# Yeni sunucu ağ konfigürasyon scripti
# Kullanım: .Configure-NetworkSetup.ps1 -ServerRole "WebServer"
param(
[Parameter(Mandatory=$true)]
[ValidateSet("WebServer", "DBServer", "DCServer")]
[string]$ServerRole
)
# Role göre konfigürasyon
switch ($ServerRole) {
"WebServer" {
$Config = @{
InterfaceName = "Ethernet0"
IPAddress = "10.10.1.50"
PrefixLength = 24
Gateway = "10.10.1.1"
DNS = @("10.10.0.10", "10.10.0.11")
}
}
"DBServer" {
$Config = @{
InterfaceName = "Ethernet0"
IPAddress = "10.10.2.50"
PrefixLength = 24
Gateway = "10.10.2.1"
DNS = @("10.10.0.10", "10.10.0.11")
}
}
"DCServer" {
$Config = @{
InterfaceName = "Ethernet0"
IPAddress = "10.10.0.10"
PrefixLength = 24
Gateway = "10.10.0.1"
DNS = @("127.0.0.1", "10.10.0.11")
}
}
}
Write-Host "[$ServerRole] için ağ konfigürasyonu başlıyor..." -ForegroundColor Yellow
# DHCP'yi kapat
Set-NetIPInterface -InterfaceAlias $Config.InterfaceName -Dhcp Disabled
# Mevcut IP konfigürasyonunu temizle
Get-NetIPAddress -InterfaceAlias $Config.InterfaceName -AddressFamily IPv4 -ErrorAction SilentlyContinue |
Remove-NetIPAddress -Confirm:$false
Get-NetRoute -InterfaceAlias $Config.InterfaceName -DestinationPrefix "0.0.0.0/0" -ErrorAction SilentlyContinue |
Remove-NetRoute -Confirm:$false
# Yeni konfigürasyonu uygula
New-NetIPAddress -InterfaceAlias $Config.InterfaceName `
-IPAddress $Config.IPAddress `
-PrefixLength $Config.PrefixLength `
-DefaultGateway $Config.Gateway
Set-DnsClientServerAddress -InterfaceAlias $Config.InterfaceName `
-ServerAddresses $Config.DNS
# DNS önbelleğini temizle
Clear-DnsClientCache
# Konfigürasyonu doğrula
Write-Host "`nKonfigürasyon Özeti:" -ForegroundColor Cyan
Get-NetIPAddress -InterfaceAlias $Config.InterfaceName -AddressFamily IPv4 |
Select-Object InterfaceAlias, IPAddress, PrefixLength
# Gateway testi
$GwTest = Test-NetConnection -ComputerName $Config.Gateway -WarningAction SilentlyContinue
if ($GwTest.PingSucceeded) {
Write-Host "Gateway erişimi: BAŞARILI" -ForegroundColor Green
} else {
Write-Host "UYARI: Gateway'e erişilemiyor!" -ForegroundColor Red
}
Bu script özellikle hazır şablonlar kullanarak onlarca sunucuyu standart bir şekilde konfigüre etmenizi sağlıyor. Parametreyi değiştirerek farklı role’ler için farklı ağ ayarları uygulayabilirsiniz.
DNS Önbelleği ve Bağlantı Sorunlarının Giderilmesi
Ağ sorunlarında DNS önbelleği çoğunlukla gözden kaçan bir konu. Sorun yaşandığında şu adımları izleyebilirsiniz:
# DNS önbelleğini görüntüle
Get-DnsClientCache
# DNS önbelleğini temizle
Clear-DnsClientCache
# Ağ adaptörünü yeniden başlat
Restart-NetAdapter -Name "Ethernet0"
# Tüm ağ adaptörlerini yeniden başlat (dikkatli kullanın!)
Get-NetAdapter | Restart-NetAdapter
# IP konfigürasyonunu yenile (DHCP için)
# ipconfig /release ve /renew karşılığı
$Interface = Get-NetAdapter -Name "Ethernet0"
$Interface | Set-NetIPInterface -Dhcp Enabled
Invoke-Expression "ipconfig /release '$($Interface.Name)'"
Start-Sleep -Seconds 2
Invoke-Expression "ipconfig /renew '$($Interface.Name)'"
# Netstat benzeri aktif bağlantıları listele
Get-NetTCPConnection | Where-Object {$_.State -eq "Established"} |
Select-Object LocalAddress, LocalPort, RemoteAddress, RemotePort, State |
Sort-Object RemoteAddress
Get-NetTCPConnection komutu özellikle güvenlik incelemelerinde çok işe yarıyor. Sunucudan kimlerle bağlantı kurulduğunu, hangi portların dinlendiğini görmek için ideal. Bir sysadmin olarak şüpheli bağlantı görürseniz bu komut ilk başvurulacak noktalardan biri olmalı.
Toplu Sunucu Yönetiminde Uzak Bağlantı
Birden fazla sunucuda aynı ağ değişikliğini yapmak gerektiğinde PowerShell Remoting devreye giriyor:
# Birden fazla sunucuda DNS güncelleme
$Servers = @("SRV01", "SRV02", "SRV03", "SRV04")
$NewDNS = @("10.10.0.10", "10.10.0.11")
Invoke-Command -ComputerName $Servers -ScriptBlock {
param($DNS)
$Adapters = Get-NetAdapter | Where-Object {$_.Status -eq "Up"}
foreach ($Adapter in $Adapters) {
Set-DnsClientServerAddress -InterfaceAlias $Adapter.Name `
-ServerAddresses $DNS
Write-Host "$env:COMPUTERNAME - $($Adapter.Name): DNS güncellendi"
}
Clear-DnsClientCache
} -ArgumentList $NewDNS
Write-Host "Tüm sunucularda DNS güncelleme tamamlandı." -ForegroundColor Green
Bu script ile DNS sunucunuzu değiştirdiğinizde tüm sunucularda güncelleme yapmanız saatler yerine dakikalar alıyor. Bence bu PowerShell’in en büyük gücü, tekrarlayan işleri bir kez yazıp defalarca kullanabilmek.
Ağ Performansı İzleme Scripti
Sürekli ağ performansı izlemek için basit ama etkili bir script:
# Ağ bant genişliği izleme scripti
param(
[string]$AdapterName = "Ethernet0",
[int]$IntervalSeconds = 5,
[int]$SampleCount = 12
)
Write-Host "Ağ performansı izleniyor: $AdapterName" -ForegroundColor Cyan
Write-Host "Örnek aralığı: $IntervalSeconds saniye, Toplam: $SampleCount örnek`n"
$PreviousStats = Get-NetAdapterStatistics -Name $AdapterName
for ($i = 1; $i -le $SampleCount; $i++) {
Start-Sleep -Seconds $IntervalSeconds
$CurrentStats = Get-NetAdapterStatistics -Name $AdapterName
$ReceivedBps = ($CurrentStats.ReceivedBytes - $PreviousStats.ReceivedBytes) / $IntervalSeconds
$SentBps = ($CurrentStats.SentBytes - $PreviousStats.SentBytes) / $IntervalSeconds
$ReceivedMbps = [math]::Round($ReceivedBps * 8 / 1MB, 2)
$SentMbps = [math]::Round($SentBps * 8 / 1MB, 2)
$Timestamp = Get-Date -Format "HH:mm:ss"
Write-Host "[$Timestamp] Alınan: $ReceivedMbps Mbps | Gönderilen: $SentMbps Mbps"
$PreviousStats = $CurrentStats
}
Bu scripti kullanarak belirli bir adaptörün gerçek zamanlı bant genişliği kullanımını izleyebilirsiniz. Özellikle yoğun yükleme veya transfer işlemleri sırasında ne kadar bant genişliği tüketildiğini görmek için pratik.
Sık Yapılan Hatalar ve Dikkat Edilecek Noktalar
Yıllar içinde gördüğüm yaygın hatalar şunlar:
- IP kaldırmadan yeni IP eklemeye çalışmak:
New-NetIPAddressçalıştırmadan önce mevcut statik IP varsa temizlemek gerekiyor, aksi halde hata alırsınız - Gateway’i adaptör metric’i ile karıştırmak: Birden fazla adaptör varsa ve ikisinde de default gateway tanımlıysa metric değerlerine dikkat edin
- DNS değişikliği sonrası önbellek temizlemeyi unutmak:
Clear-DnsClientCacheher DNS değişikliği sonrasında çalıştırılmalı - Uzaktan bağlıyken IP değiştirmek: RDP veya WinRM üzerinden bağlıyken IP değiştirirseniz bağlantınızı kesebilirsiniz, scriptinize yedek erişim planı ekleyin
- Jumbo Frame’i sadece sunucuda aktifleştirmek: Uçtan uca tüm ekipmanın desteklemesi gerekiyor
Sonuç
PowerShell ile ağ yönetimi başlangıçta karmaşık görünse de komutlara alıştıkça GUI’ye hiç ihtiyaç duymadığınızı fark edeceksiniz. Get-NetAdapter, New-NetIPAddress, Set-DnsClientServerAddress ve Test-NetConnection gibi temel cmdlet’leri öğrenmek günlük işlerinizin büyük bir kısmını karşılıyor.
En önemli tavsiyem şu: Her ağ konfigürasyon işlemi için script yazın ve bu scriptleri bir git repository’sinde saklayın. Hem kendiniz için bir referans oluşturmuş olursunuz hem de aynı işlemi tekrar yapmanız gerektiğinde sıfırdan başlamazsınız. Ayrıca değişiklik öncesinde mevcut konfigürasyonu kaydetmeyi alışkanlık haline getirin, geri alma prosedürü her zaman hazır olsun.
Ağ sorunları genellikle gece yarısı geldiği için bu komutları ezberlemek yerine anlamak çok daha değerli. Neyi neden çalıştırdığınızı bilirseniz, karşılaştığınız yeni durumda da doğru komutu bulursunuz.