Kurumsal ağlarda güvenlik ihlallerinin büyük çoğunluğu, düz (flat) ağ yapılarından kaynaklanır. Bir saldırgan ya da zararlı yazılım, flat ağda herhangi bir cihaza erişim sağladığında tüm ağda serbestçe hareket edebilir. İşte bu yüzden ağ segmentasyonu ve VLAN yapılandırması, modern altyapı güvenliğinin temel taşlarından biridir. Windows Server ortamlarında bu yapıyı doğru kurmak hem ağ performansını artırır hem de olası bir ihlalde “blast radius”u minimize eder. Bu yazıda gerçek dünya senaryoları eşliğinde Windows Server üzerinde VLAN yapılandırmasını ve ağ segmentasyonunu adım adım ele alacağız.
Ağ Segmentasyonu Neden Bu Kadar Önemli?
Düşün: Muhasebe departmanının mali verileri, üretim hatlarındaki SCADA sistemleri ve misafir Wi-Fi ağı aynı broadcast domain’de çalışıyor. Birisi misafir ağından içeri sızsa ne olur? Lateral movement ile saniyeler içinde muhasebe sunucusuna ulaşabilir.
Ağ segmentasyonu bu senaryoyu engeller çünkü:
- Broadcast trafiğini sınırlar: Her VLAN kendi broadcast domain’ini oluşturur, ağ gürültüsü azalır
- Erişim kontrolünü kolaylaştırır: Segmentler arası trafiği firewall veya ACL ile kontrol edebilirsin
- Uyumluluk gereksinimlerini karşılar: PCI-DSS, HIPAA gibi standartlar segmentasyon zorunlu kılar
- Lateral movement’i engeller: Bir segmentteki ihlal diğer segmentlere yayılmaz
Tipik bir kurumsal ortamda şu segmentleri görürüz:
- VLAN 10: Yönetim (Management) – Sunucular, switch yönetim arayüzleri
- VLAN 20: Sunucu (Server) – Uygulama ve veritabanı sunucuları
- VLAN 30: Kullanıcı (User) – İş istasyonları
- VLAN 40: DMZ – İnternet’e açık servisler
- VLAN 50: Misafir (Guest) – Ziyaretçi Wi-Fi
- VLAN 60: IoT/OT – Yazıcılar, kameralar, SCADA
Windows Server’da NIC Takım Yapılandırması (NIC Teaming)
VLAN yapılandırmasına geçmeden önce, özellikle üretim ortamlarında NIC Teaming kurmanı öneririm. Bu hem redundancy hem de VLAN tagging için sağlam bir temel oluşturur.
# Mevcut ağ adaptörlerini listele
Get-NetAdapter | Select-Object Name, InterfaceDescription, Status, LinkSpeed
# NIC Teaming için yeni takım oluştur
New-NetLbfoTeam -Name "ServerTeam" `
-TeamMembers "Ethernet0", "Ethernet1" `
-TeamingMode SwitchIndependent `
-LoadBalancingAlgorithm Dynamic `
-Confirm:$false
# Takım durumunu kontrol et
Get-NetLbfoTeam -Name "ServerTeam" | Select-Object *
Takım oluşturulduktan sonra durum “Up” olarak görünmeli. Eğer “Degraded” görüyorsan fiziksel bağlantıları kontrol et.
Hyper-V Ortamında Virtual Switch ve VLAN Yapılandırması
Windows Server’ın en yaygın kullanım senaryolarından biri Hyper-V üzerinde sanal makine barındırmaktır. Bu ortamda VLAN yapılandırması Virtual Switch üzerinden yapılır.
Virtual Switch Oluşturma
# Mevcut sanal switch'leri listele
Get-VMSwitch | Select-Object Name, SwitchType, NetAdapterInterfaceName
# External Virtual Switch oluştur (NIC Teaming ile)
New-VMSwitch -Name "Production-vSwitch" `
-NetAdapterName "ServerTeam" `
-AllowManagementOS $true `
-Notes "Uretim ortami icin harici sanal switch"
# Internal Virtual Switch oluştur (izole segment için)
New-VMSwitch -Name "Isolated-vSwitch" `
-SwitchType Internal `
-Notes "Izole test ortami"
AllowManagementOS: $true olarak ayarlanırsa host işletim sistemi de bu switch üzerinden ağa erişebilir. Yönetim VLAN’ı için bunu açık bırakman gerekir.
VM’lere VLAN Atama
# Belirli bir VM'nin ağ adaptörüne VLAN ID ata
Set-VMNetworkAdapterVlan `
-VMName "WebServer01" `
-VlanId 40 `
-Access
# Birden fazla VM için toplu VLAN atama
$serverVMs = @("AppServer01", "AppServer02", "AppServer03")
foreach ($vm in $serverVMs) {
Set-VMNetworkAdapterVlan `
-VMName $vm `
-VlanId 20 `
-Access
Write-Host "$vm - VLAN 20 atandi" -ForegroundColor Green
}
# VLAN yapılandırmasını doğrula
Get-VMNetworkAdapterVlan -VMName "WebServer01"
-Access: Bu parametre, adaptörü access port modunda yapılandırır. Tek bir VLAN’a üyelik için kullanılır.
Trunk Port Yapılandırması
Bazı durumlarda bir VM’nin birden fazla VLAN’a erişmesi gerekir. Örneğin, bir firewall VM’si veya multi-tenant ortamı yönetiyor olabilirsin.
# Trunk port yapılandırması - birden fazla VLAN için
Set-VMNetworkAdapterVlan `
-VMName "FirewallVM" `
-Trunk `
-AllowedVlanIdList "10,20,30,40,50,60" `
-NativeVlanId 10
# Yapılandırmayı kontrol et
Get-VMNetworkAdapterVlan -VMName "FirewallVM" | `
Select-Object OperationMode, AllowedVlanIdList, NativeVlanId
Host İşletim Sisteminde VLAN Interface Oluşturma
Bazen Windows Server’ın kendisinin birden fazla VLAN’a doğrudan erişmesi gerekir. Bu özellikle yönetim ve izleme araçları çalıştıran sunucularda karşına çıkar.
# Mevcut Virtual Switch'e yeni VLAN interface ekle
Add-VMNetworkAdapter `
-ManagementOS `
-Name "VLAN20-Servers" `
-SwitchName "Production-vSwitch"
# Yeni adaptöre VLAN ID ata
Set-VMNetworkAdapterVlan `
-ManagementOS `
-VMNetworkAdapterName "VLAN20-Servers" `
-VlanId 20 `
-Access
# IP adresi ata
New-NetIPAddress `
-InterfaceAlias "vEthernet (VLAN20-Servers)" `
-IPAddress "10.20.0.10" `
-PrefixLength 24 `
-DefaultGateway "10.20.0.1"
# DNS sunucusu ayarla
Set-DnsClientServerAddress `
-InterfaceAlias "vEthernet (VLAN20-Servers)" `
-ServerAddresses "10.10.0.53", "10.10.0.54"
Bir uyarı: Management OS’a birden fazla VLAN interface eklediğinde routing tablosunu dikkatli yönet. Yanlış default gateway yapılandırması tüm ağ trafiğini bozabilir.
Windows Firewall ile Segmentler Arası Trafik Kontrolü
VLAN yapılandırması tek başına yeterli değil. Segmentler arası trafiği kontrol etmek için Windows Firewall kuralları da yazman gerekiyor. Özellikle router üzerinde inter-VLAN routing açıksa bu kurallar kritik önem taşır.
# Sadece belirli VLAN'dan yönetim erişimine izin ver
New-NetFirewallRule `
-DisplayName "Allow RDP from Management VLAN" `
-Direction Inbound `
-Protocol TCP `
-LocalPort 3389 `
-RemoteAddress "10.10.0.0/24" `
-Action Allow `
-Profile Domain, Private
# Sunucu VLAN'ından gelen SMB trafiğini engelle (Guest VLAN koruması)
New-NetFirewallRule `
-DisplayName "Block SMB from Guest VLAN" `
-Direction Inbound `
-Protocol TCP `
-LocalPort 445 `
-RemoteAddress "10.50.0.0/24" `
-Action Block `
-Profile Any
# Mevcut firewall kurallarını listele
Get-NetFirewallRule | `
Where-Object {$_.DisplayName -like "*VLAN*"} | `
Select-Object DisplayName, Direction, Action, Enabled
-RemoteAddress: Bu parametre ile kaynak IP aralığını belirtiyoruz. VLAN subnet’ini buraya yazarak sadece o segment’ten gelen trafiği filtreleyebilirsin.
-Profile: Domain, Private veya Public olarak ayarlanabilir. Kurumsal ortamlarda Domain profilini kullanmak en mantıklısı.
Gerçek Dünya Senaryosu: Üretim Ortamı Segmentasyonu
Orta ölçekli bir üretim şirketinde çalıştığını düşün. 3 Hyper-V host’un var, üzerlerinde ERP sistemi, web uygulaması, veritabanı ve yönetim araçları çalışıyor. Şu anki yapı tamamen flat. Bunu nasıl segmente edersin?
Önce mevcut durumu belgele:
# Tüm VM'leri ve ağ yapılandırmalarını raporla
$report = Get-VM | ForEach-Object {
$vm = $_
$adapters = Get-VMNetworkAdapter -VMName $vm.Name
$vlanInfo = Get-VMNetworkAdapterVlan -VMName $vm.Name
[PSCustomObject]@{
VMName = $vm.Name
State = $vm.State
Adapters = $adapters.Count
VlanId = $vlanInfo.AccessVlanId
Switch = $adapters.SwitchName
}
}
$report | Format-Table -AutoSize
$report | Export-Csv -Path "C:ReportsVM-Network-Inventory.csv" -NoTypeInformation
Sonra segmentleri oluştur ve VM’leri taşı:
# ERP ve veritabanı sunucularını Server VLAN'a al
$erpServers = @("ERP-App01", "ERP-DB01", "ERP-DB02")
foreach ($server in $erpServers) {
# Önce VM'yi durdur (production'da maintenance window gerekli!)
# Stop-VM -Name $server
Set-VMNetworkAdapterVlan `
-VMName $server `
-VlanId 20 `
-Access
Write-Host "$server VLAN 20'ye tasinadi" -ForegroundColor Cyan
}
# Web sunucularını DMZ VLAN'a al
$webServers = @("Web01", "Web02", "ReverseProxy01")
foreach ($server in $webServers) {
Set-VMNetworkAdapterVlan `
-VMName $server `
-VlanId 40 `
-Access
Write-Host "$server VLAN 40'a tasinadi" -ForegroundColor Yellow
}
# Değişiklikleri doğrula
foreach ($server in ($erpServers + $webServers)) {
$vlan = Get-VMNetworkAdapterVlan -VMName $server
Write-Host "$server - VLAN: $($vlan.AccessVlanId)"
}
Bu işlemi maintenance window’da yap. VLAN değişikliği VM yeniden başlatılmadan da uygulanabilir, ancak guest OS içinde IP’yi de güncellemeyi unutma.
DHCP Server ile VLAN Entegrasyonu
Her VLAN kendi IP aralığına sahip olmalı. Windows Server DHCP’yi VLAN’larla entegre etmek için DHCP Server üzerinde scope’lar oluşturman gerekiyor.
# Her VLAN için ayrı DHCP scope oluştur
# VLAN 20 - Sunucular (genellikle statik ama bazı sistemler DHCP kullanır)
Add-DhcpServerv4Scope `
-Name "VLAN20-Servers" `
-StartRange "10.20.0.100" `
-EndRange "10.20.0.200" `
-SubnetMask "255.255.255.0" `
-Description "Sunucu VLAN DHCP Scope" `
-State Active
# VLAN 30 - Kullanıcılar
Add-DhcpServerv4Scope `
-Name "VLAN30-Users" `
-StartRange "10.30.0.10" `
-EndRange "10.30.0.250" `
-SubnetMask "255.255.255.0" `
-Description "Kullanici VLAN DHCP Scope" `
-State Active
# Scope seçeneklerini yapılandır
Set-DhcpServerv4OptionValue `
-ScopeId "10.30.0.0" `
-Router "10.30.0.1" `
-DnsServer "10.10.0.53", "10.10.0.54" `
-DnsDomain "corp.example.com"
# VLAN 50 - Misafir (DNS olarak sadece public DNS ver)
Add-DhcpServerv4Scope `
-Name "VLAN50-Guest" `
-StartRange "10.50.0.10" `
-EndRange "10.50.0.250" `
-SubnetMask "255.255.255.0" `
-Description "Misafir VLAN - Internet erisimi sadece" `
-State Active
Set-DhcpServerv4OptionValue `
-ScopeId "10.50.0.0" `
-Router "10.50.0.1" `
-DnsServer "8.8.8.8", "8.8.4.4"
# Tüm scope'ları listele
Get-DhcpServerv4Scope | Select-Object Name, ScopeId, StartRange, EndRange, State
Misafir VLAN’ı için kritik bir nokta: DNS olarak iç DNS sunucunu verme. Böylece misafirler iç network yapını keşfedemez.
Ağ Segmentasyonunu Test Etme ve Doğrulama
Yapılandırmayı tamamladıktan sonra test etmek şart. “Çalışıyor gibi görünüyor” diyerek geçme.
# Connectivity test - segmentler arası erişimi doğrula
# Bu scripti farklı VLAN'lardaki makinelerde çalıştır
$testTargets = @{
"Management VLAN" = "10.10.0.1"
"Server VLAN Gateway" = "10.20.0.1"
"User VLAN Gateway" = "10.30.0.1"
"DMZ Gateway" = "10.40.0.1"
"Guest VLAN Gateway" = "10.50.0.1"
"Internet" = "8.8.8.8"
}
foreach ($target in $testTargets.GetEnumerator()) {
$result = Test-NetConnection -ComputerName $target.Value -InformationLevel Quiet
$status = if ($result) { "ERISEBILIR" } else { "ENGELLENDI" }
$color = if ($result) { "Green" } else { "Red" }
Write-Host "$($target.Key) ($($target.Value)): $status" -ForegroundColor $color
}
# Port bazlı test
Test-NetConnection -ComputerName "10.20.0.50" -Port 445 -InformationLevel Detailed
Beklenen sonuçlar segmentasyon politikana göre değişir. Örneğin Guest VLAN’dan Server VLAN’a erişilememesi başarılı bir segmentasyonun göstergesidir.
Sık Yapılan Hatalar ve Çözümleri
Yıllarca bu işi yapınca bazı tuzaklara defalarca düştüm. Seni uyarayım:
Management VLAN’ı ihmal etme: Pek çok sysadmin sunucu VLAN’ını yapılandırıp yönetim trafiğini ayrı bir segment’e almayı unutur. Tüm yönetim trafiği (RDP, WinRM, SSH) ayrı bir VLAN üzerinden gitmelidir.
Inter-VLAN routing’i kontrolsüz bırakma: Router üzerinde “ip routing” açıkken tüm VLAN’lar birbirini görüyorsa segmentasyon anlamını kaybeder. ACL veya firewall kuralları mutlaka gerekli.
DHCP relay’i unutma: DHCP Discover broadcast mesajıdır ve VLAN sınırlarını geçemez. DHCP sunucun farklı bir VLAN’daysa switch üzerinde IP Helper (DHCP Relay) yapılandırması şart.
Trunk port’ları açık bırakma: Switch trunk portlarında sadece ihtiyaç duyulan VLAN’lara izin ver. “Allowed VLAN all” yapılandırması güvenlik açığıdır.
Test etmeden canlıya alma: Her zaman lab ortamında test et. Production’da VLAN yapılandırması değişikliği bağlantı kesintisine neden olabilir.
Windows Admin Center ile VLAN Yönetimi
Komut satırı sevmiyorsan Windows Admin Center, Hyper-V ağ yapılandırması için kullanışlı bir GUI sunuyor. Ancak şunu bil: WAC üzerinden yapabileceğin işlemler PowerShell kadar esnek değil. Özellikle trunk port yapılandırması ve toplu işlemler için PowerShell kaçınılmaz.
WAC üzerinden VLAN yapılandırması için:
- Virtual Machines > [VM adı] > Networks sekmesine git
- Ağ adaptörünü seç ve Edit butonuna tıkla
- VLAN seçeneğini etkinleştir ve VLAN ID gir
- Değişiklikleri kaydet
Ancak önemli bir not: WAC sadece Access mod VLAN’ı destekler. Trunk yapılandırması için mutlaka PowerShell kullan.
Monitoring ve Log Yönetimi
Segmentasyonu kurman yetmez, sürekli izlemen gerekir. Özellikle segmentler arası başarısız bağlantı girişimleri bir saldırı göstergesi olabilir.
# Windows Firewall loglamasını aktif et
Set-NetFirewallProfile -Profile Domain, Private, Public `
-LogAllowed True `
-LogBlocked True `
-LogFileName "C:WindowsSystem32LogFilesFirewallpfirewall.log" `
-LogMaxSizeKilobytes 32767
# Son firewall drop olaylarını göster
Get-WinEvent -LogName "Security" -MaxEvents 100 | `
Where-Object {$_.Id -eq 5157} | `
ForEach-Object {
$xml = [xml]$_.ToXml()
[PSCustomObject]@{
TimeCreated = $_.TimeCreated
SourceAddress = $xml.Event.EventData.Data[3].'#text'
DestAddress = $xml.Event.EventData.Data[5].'#text'
DestPort = $xml.Event.EventData.Data[6].'#text'
Protocol = $xml.Event.EventData.Data[7].'#text'
}
} | Format-Table -AutoSize
Bu logları merkezi bir SIEM sistemine (Wazuh, Splunk, ELK) göndermeni şiddetle tavsiye ederim. Manuel log analizi uzun vadede sürdürülebilir değil.
Sonuç
Windows Server ortamında ağ segmentasyonu ve VLAN yapılandırması, bir kez yapıp unutacağın bir işlem değil. Ağın büyüdükçe, yeni sistemler eklendikçe ve tehdit peyzajı değiştikçe bu yapıyı gözden geçirip güncelleme zorunluluğu doğar.
Özetlemek gerekirse şu adımları izle:
- Önce kağıt üzerinde VLAN tasarımını yap, segmentleri ve aralarındaki izin verilen trafiği belirle
- NIC Teaming ile sağlam bir temel kur
- Hyper-V ortamında Virtual Switch ve VLAN ID atamalarını yapılandır
- Her VLAN için ayrı DHCP scope oluştur
- Windows Firewall ile segmentler arası erişimi kontrol altına al
- Yapılandırmayı test et ve loglamayı aktif et
- Değişiklikleri belgele
En büyük motivasyonum şu: Bir ransomware vakasında flat ağa sahip bir müşterinin tüm sunucuları şifrelenmişti. Segmentasyonu olan başka bir müşteride ise sadece bir segment etkilendi, diğerleri kurtarıldı. Bu farkı bizzat gördükten sonra segmentasyonu “nice to have” olarak değil, “must have” olarak görüyorum. Umarım bu yazı sana da aynı bakış açısını kazandırır.