Windows Güvenlik Duvarı ile Gelen ve Giden Trafik Kontrolü
Ağ yöneticilerinin en çok ihmal ettiği konuların başında Windows Güvenlik Duvarı’nın doğru yapılandırılması geliyor. Çoğu sysadmin, varsayılan ayarlarla devam ediyor ya da “zaten arkada bir donanım güvenlik duvarı var” diyerek host tabanlı güvenlik duvarını devre dışı bırakıyor. Bu yaklaşım, iç ağdan gelebilecek tehditlere karşı sizi tamamen savunmasız bırakır. Bugün Windows Güvenlik Duvarı’nı gerçekten kullanılabilir ve yönetilebilir hale getirmenin yollarına bakacağız.
Windows Güvenlik Duvarı Neden Önemli?
Kurumsal ağlarda “derinlemesine savunma” (defense in depth) stratejisi, güvenliğin temel taşlarından biridir. Perimeter güvenlik duvarınız ne kadar güçlü olursa olsun, bir iç ağ saldırısı veya ele geçirilmiş bir makine senaryosunda host tabanlı güvenlik duvarı devreye girer. Windows Defender Firewall, Windows Vista’dan bu yana gelişmiş özellikler sunan ciddi bir araç haline geldi.
Neden host tabanlı güvenlik duvarına ihtiyaç duyarsınız?
- Lateral movement saldırılarını engellemek için (bir makine ele geçirildiğinde diğerlerine yayılmayı önlemek)
- Servisleri yalnızca gerekli IP aralıklarına açmak
- Uygulama bazında trafik kontrolü sağlamak
- Giden trafiği kısıtlayarak veri sızıntısını önlemek
- Compliance gereksinimlerini karşılamak (PCI-DSS, ISO 27001 vb.)
Temel Kavramlar: Profiller ve Kurallar
Windows Güvenlik Duvarı üç farklı profil üzerinden çalışır:
- Domain profili: Makine domain’e bağlıyken aktif olur
- Private profil: Ev veya güvenilir ağlar için kullanılır
- Public profil: Kamuya açık ağlarda (havalimanı Wi-Fi gibi) aktif olur
Bir kural oluştururken hangi profile uygulandığını belirtmek kritik öneme sahiptir. Sunucularda genellikle Domain profili ön planda olsa da, profil değişikliği durumlarına karşı diğer profilleri de yapılandırmak iyi bir pratiktir.
PowerShell ile Güvenlik Duvarı Yönetimi
GUI her zaman pratik değildir, özellikle toplu değişiklikler yapıyorsanız ya da otomasyon yazıyorsanız. NetSecurity modülü, Windows Güvenlik Duvarı’nı PowerShell üzerinden yönetmenin en temiz yoludur.
Mevcut Durumu Kontrol Etme
Önce güvenlik duvarının hangi profillerde etkin olduğuna bakalım:
# Tüm profillerin durumunu göster
Get-NetFirewallProfile | Select-Object Name, Enabled, DefaultInboundAction, DefaultOutboundAction
# Domain profili detaylarını göster
Get-NetFirewallProfile -Name Domain | Format-List *
Mevcut kuralları listelemek için:
# Tüm aktif gelen kuralları listele
Get-NetFirewallRule -Direction Inbound -Enabled True |
Select-Object DisplayName, Action, Profile, Protocol |
Format-Table -AutoSize
# Belirli bir porta göre kural ara
Get-NetFirewallRule | Where-Object {$_.Enabled -eq "True"} |
Get-NetFirewallPortFilter | Where-Object {$_.LocalPort -eq "3389"} |
ForEach-Object {
$rule = $_ | Get-NetFirewallRule
Write-Host "Kural: $($rule.DisplayName) - Eylem: $($rule.Action)"
}
Temel Kural Oluşturma
Gelen bir RDP bağlantısını sadece belirli bir IP bloğuna açmak gerçek dünyada çok yaygın bir senaryo. Varsayılan olarak RDP kuralı tüm IP’lere açık gelir, bunu kısıtlayalım:
# Mevcut RDP kuralını devre dışı bırak
Disable-NetFirewallRule -DisplayName "Remote Desktop - User Mode (TCP-In)"
# Sadece yönetim ağına RDP izni ver
New-NetFirewallRule `
-DisplayName "RDP - Sadece Yonetim Agina" `
-Direction Inbound `
-Protocol TCP `
-LocalPort 3389 `
-RemoteAddress "10.10.50.0/24" `
-Action Allow `
-Profile Domain `
-Enabled True `
-Description "Yonetim aglari icin RDP erisimi - $(Get-Date -Format 'yyyy-MM-dd')"
Web Sunucusu Sertleştirme Senaryosu
Diyelim ki bir IIS web sunucusu yönetiyorsunuz. Bu sunucunun sadece 80 ve 443 portunu dışarıya açması, yönetim trafiğinin ise belirli bir jump server üzerinden gelmesi gerekiyor:
# Önce tüm gelen trafiği varsayılan olarak engelle
Set-NetFirewallProfile -Profile Domain -DefaultInboundAction Block
# HTTP ve HTTPS'e herkese izin ver
New-NetFirewallRule `
-DisplayName "Web - HTTP Inbound" `
-Direction Inbound `
-Protocol TCP `
-LocalPort 80 `
-Action Allow `
-Profile Domain `
-Enabled True
New-NetFirewallRule `
-DisplayName "Web - HTTPS Inbound" `
-Direction Inbound `
-Protocol TCP `
-LocalPort 443 `
-Action Allow `
-Profile Domain `
-Enabled True
# WinRM'e sadece jump server'dan izin ver (10.10.1.10 jump server IP'si)
New-NetFirewallRule `
-DisplayName "WinRM - Jump Server" `
-Direction Inbound `
-Protocol TCP `
-LocalPort 5985,5986 `
-RemoteAddress "10.10.1.10" `
-Action Allow `
-Profile Domain `
-Enabled True
# SMB portunu tamamen kapat (web sunucusunda SMB gerekmez)
New-NetFirewallRule `
-DisplayName "SMB - Block Inbound" `
-Direction Inbound `
-Protocol TCP `
-LocalPort 445 `
-Action Block `
-Profile Domain `
-Enabled True
Giden Trafik Kontrolü
Çoğu sysadmin giden trafiği ihmal eder. Oysa giden trafik kontrolü, bir saldırganın sisteminizi C2 (Command and Control) sunucusuna bağlamasını veya veri sızdırmasını engellemek için kritiktir.
Sunucularda giden trafiği kısıtlamak için şu stratejiyi uygulayabilirsiniz:
# Giden trafiği varsayılan olarak engelle (DİKKAT: Önce izin kurallarını ekleyin!)
Set-NetFirewallProfile -Profile Domain -DefaultOutboundAction Block
# DNS'e izin ver (olmadan hiçbir şey çalışmaz)
New-NetFirewallRule `
-DisplayName "Outbound - DNS" `
-Direction Outbound `
-Protocol UDP `
-RemotePort 53 `
-RemoteAddress "10.10.1.1","10.10.1.2" `
-Action Allow `
-Profile Domain `
-Enabled True
# NTP'ye izin ver
New-NetFirewallRule `
-DisplayName "Outbound - NTP" `
-Direction Outbound `
-Protocol UDP `
-RemotePort 123 `
-Action Allow `
-Profile Domain `
-Enabled True
# Windows Update için Microsoft adresleri (uygun IP aralıklarını ekleyin)
New-NetFirewallRule `
-DisplayName "Outbound - Windows Update" `
-Direction Outbound `
-Protocol TCP `
-RemotePort 443 `
-RemoteAddress "13.107.4.0/24","13.107.5.0/24","23.103.160.0/20" `
-Action Allow `
-Profile Domain `
-Enabled True
> Dikkat: Giden trafiği engellemeden önce mutlaka hangi servislerin dışarıya bağlantı kurduğunu tespit edin. Aksi takdirde kritik servisleri kesebilirsiniz.
Uygulama Bazlı Kurallar
Windows Güvenlik Duvarı’nın en güçlü özelliklerinden biri, port bazında değil uygulama bazında kural oluşturabilmesidir. Böylece aynı portu kullanan farklı uygulamalar için ayrı politikalar belirleyebilirsiniz:
# Sadece belirli bir uygulamanın dışarıya bağlantı kurmasına izin ver
New-NetFirewallRule `
-DisplayName "App - Backup Agent Outbound" `
-Direction Outbound `
-Program "C:Program FilesBackupAgentagent.exe" `
-Action Allow `
-Profile Domain `
-Enabled True
# Belirli bir uygulamanın ağ erişimini tamamen engelle
New-NetFirewallRule `
-DisplayName "Block - Unauthorized App" `
-Direction Outbound `
-Program "C:UsersPublicsuspicious.exe" `
-Action Block `
-Profile Any `
-Enabled True
Group Policy ile Merkezi Yönetim
Onlarca, yüzlerce sunucuyu tek tek yapılandırmak yerine Group Policy Object (GPO) kullanmak şart. GPO ile tüm domain’e veya belirli OU’lara toplu kural dağıtabilirsiniz.
GPO üzerinden güvenlik duvarı yönetiminin adımları:
- Group Policy Management Console’u açın
- Yeni bir GPO oluşturun veya mevcut birini düzenleyin
- Computer Configuration > Windows Settings > Security Settings > Windows Defender Firewall with Advanced Security yolunu izleyin
- Gelen veya Giden Kurallar bölümüne sağ tıklayıp “New Rule” seçin
- Kuralı tanımladıktan sonra GPO’yu ilgili OU’ya bağlayın
GPO’nun uygulanıp uygulanmadığını kontrol etmek için:
# GPO'yu hemen uygula
gpupdate /force
# Mevcut güvenlik duvarı politikasını göster
netsh advfirewall show allprofiles
# GPO kaynaklı kuralları listele
Get-NetFirewallRule | Where-Object {$_.PolicyStoreSourceType -eq "GroupPolicy"} |
Select-Object DisplayName, Direction, Action, Enabled
Güvenlik Duvarı Loglarının Etkinleştirilmesi ve Analizi
Kural koymak yeterli değil, ne olduğunu izlemek de şart. Windows Güvenlik Duvarı loglama özelliği varsayılan olarak kapalı gelir.
# Domain profili için loglama etkinleştir
Set-NetFirewallProfile -Profile Domain `
-LogFileName "C:WindowsSystem32LogFilesFirewallpfirewall.log" `
-LogMaxSizeKilobytes 32768 `
-LogBlocked True `
-LogAllowed True
# Log dosyasının son 50 satırını göster
Get-Content "C:WindowsSystem32LogFilesFirewallpfirewall.log" -Tail 50
# Engellenen bağlantıları filtrele
Get-Content "C:WindowsSystem32LogFilesFirewallpfirewall.log" |
Where-Object {$_ -match "DROP"} |
Select-Object -Last 20
Log formatını anlamak için temel alanlar şunlardır:
- date: Log tarihi
- time: Log saati
- action: ALLOW veya DROP
- protocol: TCP, UDP, ICMP
- src-ip: Kaynak IP adresi
- dst-ip: Hedef IP adresi
- src-port: Kaynak port
- dst-port: Hedef port
Gerçek Dünya Senaryosu: Ransomware Yayılımını Engelleme
2023’te yönettiğim bir ortamda yaşanan bir olayı örnek olarak verebilirim. Ağda bir ransomware bulaşması tespit edildi ve SMB (445) üzerinden lateral movement girişimi başladı. Hızla devreye giren host tabanlı güvenlik duvarı kuralları yayılımı durdurdu.
Bu tür durumlar için hazırlıklı olmak adına şu “acil kilitleme” script’ini hazır bulundurabilirsiniz:
# Acil durum - SMB lateral movement engelleme
# Bu script'i bir GPO startup script olarak veya manuel çalıştırabilirsiniz
# Tüm inbound SMB trafiğini engelle (sadece belirli sunuculara izin ver)
$FileServerIP = "10.10.5.20" # Gerçek dosya sunucusu IP'si
New-NetFirewallRule `
-DisplayName "EMERGENCY - Block SMB Inbound" `
-Direction Inbound `
-Protocol TCP `
-LocalPort 445 `
-RemoteAddress "0.0.0.0/0" `
-Action Block `
-Priority 1 `
-Profile Any `
-Enabled True
# Sadece dosya sunucusuna SMB giden trafiğe izin ver
New-NetFirewallRule `
-DisplayName "EMERGENCY - Allow SMB to FileServer Only" `
-Direction Outbound `
-Protocol TCP `
-RemotePort 445 `
-RemoteAddress $FileServerIP `
-Action Allow `
-Profile Any `
-Enabled True
# Tüm diğer SMB giden trafiği engelle
New-NetFirewallRule `
-DisplayName "EMERGENCY - Block SMB Outbound" `
-Direction Outbound `
-Protocol TCP `
-RemotePort 445 `
-Action Block `
-Profile Any `
-Enabled True
Write-Host "Acil SMB kilitleme tamamlandi: $(Get-Date)" -ForegroundColor Red
Kural Yönetimi: Temizlik ve Bakım
Zamanla güvenlik duvarı kuralları birikir ve yönetilemez hale gelir. Düzenli temizlik yapmak gerekir.
# Devre dışı bırakılmış tüm kuralları listele
Get-NetFirewallRule | Where-Object {$_.Enabled -eq "False"} |
Select-Object DisplayName, Direction, Profile, Action |
Format-Table -AutoSize
# Belirli bir isimle başlayan eski kuralları sil (dikkatli kullanın!)
Get-NetFirewallRule | Where-Object {$_.DisplayName -like "TEMP-*"} |
Remove-NetFirewallRule -WhatIf # Önce WhatIf ile test et
# WhatIf doğrulandıktan sonra gerçekten sil
Get-NetFirewallRule | Where-Object {$_.DisplayName -like "TEMP-*"} |
Remove-NetFirewallRule
# Tüm kuralları CSV'ye export et (belgeleme için)
Get-NetFirewallRule |
Select-Object DisplayName, Direction, Action, Enabled, Profile, Description |
Export-Csv -Path "C:Tempfirewall-rules-$(Get-Date -Format 'yyyyMMdd').csv" -NoTypeInformation
Windows Defender Firewall ile Advanced Security (WFAS) Konsolu
GUI tarafında wf.msc komutu ile açılan Windows Defender Firewall with Advanced Security konsolu, kuralları görsel olarak yönetmek için kullanışlıdır. Özellikle şu özellikler dikkat çeker:
- Connection Security Rules: IPSec tünelleri ve kimlik doğrulamalı bağlantılar için
- Monitoring: Aktif bağlantıları ve eşleşen kuralları gerçek zamanlı görüntülemek için
- Import/Export Policy: Yapılandırmayı başka makinelere taşımak için
Mevcut yapılandırmayı yedeklemek ve başka bir makineye aktarmak:
# Güvenlik duvarı politikasını export et
netsh advfirewall export "C:Backupfirewall-policy-$(Get-Date -Format 'yyyyMMdd').wfw"
# Başka bir makinede import et
netsh advfirewall import "C:Backupfirewall-policy-20240315.wfw"
# Factory reset - tüm özel kuralları sil, varsayılanlara dön
netsh advfirewall reset
Güvenlik Duvarı Testleri
Kural koyduktan sonra çalışıp çalışmadığını test etmek şart. Test etmeden “çalışıyordur” diye geçmek tehlikeli bir alışkanlık.
Test yaklaşımları:
- Test makineden hedef porta
Test-NetConnectionile bağlantı deneyin - Nmap ile port taraması yapın (izin aldıktan sonra)
- Güvenlik duvarı loglarını gerçek zamanlı izleyin
- Engellenmesi gereken bir bağlantı denemesinin logda göründüğünü doğrulayın
# Belirli bir port ve IP'ye bağlantı testi
Test-NetConnection -ComputerName "10.10.5.20" -Port 445
# Detaylı bilgi ile test
Test-NetConnection -ComputerName "hedefip" -Port 3389 -InformationLevel Detailed
# Birden fazla portu test et
$ports = @(80, 443, 3389, 445, 8080)
foreach ($port in $ports) {
$result = Test-NetConnection -ComputerName "hedefip" -Port $port -WarningAction SilentlyContinue
Write-Host "Port $port : $(if($result.TcpTestSucceeded){'ACIK'}else{'KAPALI'})"
}
Sonuç
Windows Güvenlik Duvarı, doğru yapılandırıldığında kurumsal ağ güvenliğinin önemli bir katmanı haline gelir. Temel noktalara bakacak olursak: Her sunucu için o sunucunun işlevine uygun özel kurallar oluşturun, “herkese açık” mantığından vazgeçin. Gelen trafiği kısıtladığınız kadar giden trafiği de kontrol altında tutun. GPO kullanarak merkezi yönetimi sağlayın ve tutarlılığı koruyun. Loglama mutlaka açık olsun ve bu loglar SIEM’inize ya da merkezi bir log sistemine akmakta olsun. Kurduğunuz kuralları düzenli olarak test edin ve gözden geçirin; eski, gereksiz kuralları temizleyin.
En sık yapılan hata, güvenlik duvarını kurup unutmak. Ağınız değişiyor, uygulamalarınız değişiyor, tehdit ortamı değişiyor. Güvenlik duvarı kurallarınızın da bu değişime ayak uydurması için 3-6 ayda bir gözden geçirme alışkanlığı edinin. Basit bir checklist bile bu süreçte büyük fark yaratır.
Son olarak şunu söyleyelim: Hiçbir güvenlik duvarı %100 koruma sağlamaz. Amacınız saldırganların işini zorlaştırmak, tespit sürenizi kısaltmak ve lateral movement’ı engellemek. Windows Güvenlik Duvarı bu hedefler için güçlü ve ücretsiz bir araç. Kullanmamak için hiçbir neden yok.
