Ağ Sorunları ile başa çıkma
Bu kaynak, sistem yöneticilerine Linux tabanlı ağ sorunlarını hızlıca...
Bir güvenlik duvarının günlüklerinde veya ağ izleme araçlarınızda hiç, Windows DNS Sunucunuzdan çıkan, sürekli değişen kaynak port numaralı DNS sorguları gördünüz mü? Bu, rastgele bir davranış değil; bu, Microsoft'un **"Socket Pool"** (Yuva Havuzu) adı verilen akıllı ve proaktif bir güvenlik mekanizmasının iş başındaki işaretidir.
Peki nedir bu Socket Pool, ne işe yarar ve neden önemsemelisiniz? Gelin, DNS güvenliğinin bu önemli bileşenini birlikte inceleyelim.
Temel Problem: DNS Önbellek Zehirlenmesi (Cache Poisoning)
Sorunu anlamak için önce tehdidi tanıyalım. Klasik bir DNS Cache Poisoning (önbellek zehirlenmesi) saldırısında, bir saldırgan hedef DNS sunucusuna, *"google.com'un IP adresi 1.2.3.4'tür"* gibi sahte bir cevap göndermeye çalışır.
DNS, UDP üzerinde çalışan istemci-istemci olmayan (stateless) bir protokoldür. Sunucu bir sorgu gönderdiğinde, gelen cevabın hangi sorguya ait olduğunu anlamak için üç bilgiye bakar:
1. Hedef IP Adresi** (Sunucunun kendi IP'si)
2. Hedef Port** (Genellikle standart 53)
3. DNS Sorgu Kimliği (Transaction ID - TXID)** - 16 bitlik rastgele bir sayı
Saldırgan, sunucunun gönderdiği sorguyu görürse (veya tahmin ederse), kaynak IP'si ve portunu taklit ederek (*spoofing*), doğru TXID'ye sahip sahte bir cevap gönderebilir. Eğer bu sahte cevap, gerçek cevaptan önce sunucuya ulaşırsa, sunucu zehirlenmiş veriyi önbelleğine alır ve sonraki tüm kullanıcıları yanlış (ve genellikle kötü amaçlı) bir siteye yönlendirir.
Buradaki zayıf nokta, **kaynak portunun sabit olmasıydı.** Geleneksel olarak DNS sunucuları, recursive sorgularını her zaman 53. kaynak portundan gönderirdi. Bu, saldırganın tahmin etmesi gereken değişkenleri sadece TXID (65.536 olasılık) ile sınırlıyordu.
Çözüm: Socket Pool (Yuva Havuzu) Devreye Giriyor
Microsoft, bu güvenlik açığını kapatmak için Windows Server 2008 R2 ve sonrasında **Socket Pool** özelliğini getirdi. Mantığı basit ama etkilidir:
DNS Sunucusu, recursive sorgularını gönderirken artık sabit bir kaynak portu (53) kullanmak yerine, önceden ayrılmış rastgele bir port havuzundan dinamik olarak bir port seçer.
Bu nasıl çalışır?
1. DNS Sunucusu hizmeti başladığında, işletim sistemi tarafından belirlenen bir aralıktan (varsayılan olarak 49152-65535) binlerce rastgele kaynak portu "rezerve eder". Buna **Socket Pool** denir.
2. Sunucu her yeni bir recursive sorgu gönderdiğinde, bu havuzdan rastgele bir kaynak portu seçer ve sorguyu o port üzerinden gönderir.
3. Gelen cevabın, doğru hedef IP, doğru hedef port **ve** doğru kaynak porta gelmesi gerekir.
Bu Neden Bu Kadar Etkili?
Socket Pool'ün gücü, saldırganın başarı şansını katlanarak düşürmesinden gelir. Artık saldırganın sadece TXID'yi değil, aynı zamanda **kullanılan rastgele kaynak portu** da tahmin etmesi gerekir.
Bu, saldırganın başarı şansını astronomik seviyelerde düşürerek, saldırıyı pratikte uygulanamaz hale getirir.
DNS 2016'nın Nasıl Dağıtılır ve Yapılandırılır'ının son iki bölümünde, gelişmiş DNS seçenekleri ve güvenliği ile devam edeceğiz.
Bu bölüm neleri kapsar
Socket Pool, Windows DNS Sunucusu'nda varsayılan olarak etkindir ve çoğu durumda herhangi bir müdahaleye gerek kalmaz. Ancak, güvenlik gereksinimlerinize göre ince ayar yapabilirsiniz.
Havuz Boyutunu Görüntüleme ve Değiştirme:
Havuz boyutu, `MaxUserPort` ve `TcpTimedWaitDelay` gibi sistem kayıt defteri (`HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters`) ayarları tarafından dolaylı olarak belirlenir. DNS Sunucusu, bu aralıktan rastgele portlar seçer.
Ancak, DNS Server hizmetinin kendine özgü bir yapılandırması da vardır. PowerShell kullanarak mevcut Socket Pool boyutunu görebilir ve değiştirebilirsiniz:
Varsayılan olarak, socketpoolsize 2500'dür ve bunu dnscmd /info /socketpoolsize komutuyla kontrol edebiliriz
Mevcut Socket Pool durumunu görüntüleme
Get-DnsServerSocketPool
Socket Pool boyutunu 3000 olarak ayarlama
Set-DnsServerSocketPool -SocketPoolSize 3000
Varsayılan olarak, socketpoolsize 2500'dür ve bunu dnscmd /info /socketpoolsize komutuyla kontrol edebiliriz
Bunu değiştirmek isterseniz dnscmd /config /socketpoolsize — örneğin 5000 için > çalıştırarak yapabilirsiniz

TimeToLive değeri süresi dolmadan önce gerçekleşebilir; bazıları saldırganın önbellek girişini üzerine yazması olabilir ya da saldırganın gerçek TimeToLive değerinin ne zaman dolduğunu görmek için sunucudan sürekli bilgi talep etmesiyle ve önbelleği kendi yanlış değeriyle hemen güncellesi olabilir. Önbellek kilitleme, önbellekte bulunan bu girişlere ek bir koruma katmanı ekler; çünkü bu girişlerin tüm TimeToLive değerinin bir yüzdesinde üzerine yazılmasını engeller. Varsayılan olarak, bu %100 olacak. TimeToLive değeri, gerçek girdi için o dönemin tamamı için üzerine yazılamaz. Bunu TimeToLive değerinin bir yüzdesine indirebilirsiniz, ancak %100 aslında varsayılan değerdir. Bunu koşarak kontrol edebilirsiniz
dnscmd /info /cachelockingpercent

Çoğu ortamda bunu asla ayarlamayacaksınız, çünkü varsayılan olarak yapılandırılmıştır, ancak bir nedenle önbellekteki bir kaydın üzerine yazılabileceği süreyi azaltmak isterseniz, bunu dnscmd /config /cachelockingpercent ve ardından belirli bir değerle, yani 50 veya 75 ile yapabilirsiniz, Önbellek kilitlenme yüzdesini ayarlayacağım.

Kısacası, önbellek kilitleme, bilmeniz gereken ama muhtemelen asla ayarlanmayacak bir özellik.
Not:Havuz boyutunu artırmak güvenliği daha da güçlendirir, ancak çok fazla artırmak nadir durumlarda kaynak tüketimini etkileyebilir. Varsayılan değerler genellikle optimaldir.
En basit yolu, sunucunuzdan çıkan DNS sorgularını bir ağ analiz aracı (Wireshark gibi) ile incelemektir. Eğer recursive sorguların "Source Port" alanı sürekli değişiyor ve 1024'ten büyük rastgele değerler alıyorsa, Socket Pool aktif demektir.
Socket Pool'a ek olarak, Windows Server 2012 R2 ve sonrasında bir başka akıllı özellik daha geldi: **Socket Pool Exhaustion Protection**.
Saldırganlar, havuzdaki portları "tüketmeye" çalışabilir. Sunucu her sorgu için yeni bir socket açar. Eğer saldırgan çok sayıda sahte sorgu gönderip sunucuyu sürekli recursive sorgu göndermeye zorlarsa, havuzdaki kullanılabilir portlar tükenebilir.
Bu koruma mekanizması, sunucunun aşırı yük altında olduğunu algıladığında, belirli bir süre için aynı kaynak portunu yeniden kullanmaya başlar. Bu, performansı ve hizmet sürekliliğini korumak için tasarlanmış bir davranıştır. Saldırı durumu sona erdiğinde, sunucu normal, rastgele port kullanımına geri döner.
Windows DNS Server, DNS sorguları için rastgele kaynak port kullanır. Bu davranış DNS Cache Poisoning saldırılarını önlemek içindir.
SocketPoolSize, DNS Server’ın kullanabileceği port sayısını belirler.
0 → Socket pool tamamen kapatılır.
DNS Server tek bir statik port (genelde 53 veya küçük bir port aralığı) kullanmaya başlar.
Güvenlik ciddi şekilde azalır.
DNS kaynak port randomization kapalı olur.
DNS spoofing / cache poisoning saldırıları çok daha kolay hale gelir.
Kısaca: DNS Server “rasgele port kullanma” özelliğini kaybeder.
Bu ayar, socket pool tarafından kullanılmaması gereken UDP port aralıklarını tanımlar.
Burada:
1-60000 aralığı dışlanmış.
Yani DNS Server bu portları kullanamaz.
1–60000 arası tüm UDP portları yasaklanınca DNS Server’ın kullanabileceği sadece 60001–65535 arası kalıyor.
Ancak SocketPoolSize=0 olduğundan bu havuz zaten devre dışı.
Bu durumda DNS Server:
Ya tek bir port kullanır,
Ya da çoğu zaman başlatılamaz / çalışamaz, event log'da socket bind hataları verir.
Bu durum:
Çoğu yapılandırmada DNS Server’ın doğru çalışmamasına
UDP port bind hatalarına (Event ID 408, 404, 4010)
DNS sorgularının cevap verememesine
Çok yüksek güvenlik zafiyeti oluşmasına
sebep olur.
Genelde yanlışlıkla, hatalı bir güvenlik talimatından veya "tüm portları blokla" gibi düşüncelerden dolayı.
Bazı durumlarda ise:
Firewall’da özel bir saldırı testi
IDS/IPS davranışı gözlemlemek için
kısmi olarak yapılır; ama üretim DNS sunucusunda kesinlikle kullanılmaz.
| Kontrol | Sorun | Çözüm |
|---|---|---|
| SocketPoolSize | 0 veya çok düşük | 2500’e çeker |
| ExcludedPortRanges | Aralık tanımlı | Tamamen siler |
| DNS’yi yeniden başlatır | Ayarlar aktif olur | ✔ |
PowerShell’i Run as Administrator aç:
✔ Log tutar
✔ Mail gönderir
✔ GUI ekranı ile sonuçları gösterir
Add-Type -AssemblyName PresentationFramework
<# =========================================================
DNS Advanced Checker
✔ Registry Health Check
✔ Loglama
✔ Email Bildirimi
✔ GUI Sonuç Ekranı
========================================================= #>
# ======= Ayarlar (DÜZENLE) =======
$LogPath = "C:\DNS-Fix-Logs"
$SmtpServer = "smtp.domain.com"
$SmtpFrom = "dns-monitor@domain.com"
$SmtpTo = "admin@domain.com"
$MailEnable = $false # Mail gönderimi için: $true yap
# ==================================
if (!(Test-Path $LogPath)) { New-Item -ItemType Directory -Path $LogPath | Out-Null }
$LogFile = "$LogPath\DNS_Check_$(Get-Date -Format 'yyyyMMdd_HHmmss').log"
function Log {
param($msg)
$time = (Get-Date -Format "yyyy-MM-dd HH:mm:ss")
$line = "[$time] $msg"
Add-Content -Path $LogFile -Value $line
Write-Host $line
}
Log "DNS Sağlık Kontrolü Başladı"
$RegPath = "HKLM:\SYSTEM\CurrentControlSet\Services\DNS\Parameters"
$FixNeeded = $false
$Report = ""
# ========== 1) SocketPoolSize ==========
try {
$SocketPool = Get-ItemProperty -Path $RegPath -Name "SocketPoolSize" -ErrorAction Stop
if ($SocketPool.SocketPoolSize -eq 0) {
$Report += "⚠ SocketPoolSize = 0 (Tehlikeli)`n"
Log "Tehlike: SocketPoolSize = 0"
$FixSocket = $true
}
elseif ($SocketPool.SocketPoolSize -lt 1024) {
$Report += "⚠ SocketPoolSize düşük ($($SocketPool.SocketPoolSize))`n"
Log "Uyarı: SocketPoolSize düşük"
$FixSocket = $true
}
else {
$Report += "✔ SocketPoolSize normal ($($SocketPool.SocketPoolSize))`n"
Log "SocketPoolSize normal"
}
}
catch {
$Report += "⚠ SocketPoolSize bulunamadı`n"
Log "SocketPoolSize kayıt anahtarı yok"
$FixSocket = $true
}
# ========== 2) SocketPoolExcludedPortRanges ==========
try {
$Ranges = Get-ItemProperty -Path $RegPath -Name "SocketPoolExcludedPortRanges" -ErrorAction Stop
$Report += "⚠ Port dışlama aktif: $($Ranges.SocketPoolExcludedPortRanges)`n"
Log "Port dışlama bulundu"
$FixRanges = $true
}
catch {
$Report += "✔ Port dışlama ayarı yok (Normal)`n"
Log "Port dışlama yok"
}
# ========== Düzeltme ==========
if ($FixSocket -or $FixRanges) {
$FixNeeded = $true
Log "Düzeltme işlemleri başlatılıyor..."
if ($FixSocket) {
Log "SocketPoolSize 2500 olarak ayarlanıyor"
reg add "HKLM\SYSTEM\CurrentControlSet\Services\DNS\Parameters" /v SocketPoolSize /t REG_DWORD /d 2500 /f | Out-Null
}
if ($FixRanges) {
Log "SocketPoolExcludedPortRanges siliniyor"
reg delete "HKLM\SYSTEM\CurrentControlSet\Services\DNS\Parameters" /v SocketPoolExcludedPortRanges /f | Out-Null
}
Log "DNS servisi yeniden başlatılıyor..."
Restart-Service DNS
Log "Düzeltme tamamlandı"
$Report += "`n✔ Düzeltme yapıldı ve DNS yeniden başlatıldı.`n"
}
else {
Log "Düzeltme gerekmiyor."
$Report += "`n✔ Sistem tamamen sağlıklı.`n"
}
# ========== Email Gönderimi ==========
if ($MailEnable -eq $true) {
try {
Log "Mail gönderiliyor..."
Send-MailMessage -To $SmtpTo -From $SmtpFrom -Subject "DNS Health Report" -Body $Report -SmtpServer $SmtpServer
Log "Mail başarıyla gönderildi."
}
catch {
Log "Mail gönderilemedi: $_"
}
}
# ========== GUI Ekranı ==========
[System.Windows.MessageBox]::Show($Report, "DNS Sağlık Raporu", "OK", "Information")
Log "DNS Sağlık Kontrolü Bitti"
SocketPoolSize kontrol
ExcludedPortRanges kontrol
Risk seviyelerini analiz eder
Şuraya kaydeder:
SMTP ayarlarını doğru girersen:
raporu sana mail atar.
Windows üzerinde MessageBox açılır.
Windows DNS Sunucusu'ndaki Socket Pool, sessiz sedasız çalışan, arka planda DNS altyapınızı modern tehditlere karşı koruyan hayati bir güvenlik katmanıdır. Sadece bir kayıt defteri anahtarının veya PowerShell komutunun ardındaki bu basit fikir, DNS önbellek zehirlenmesi gibi kritik bir saldırı vektörünü neredeyse imkansız hale getirmiştir.
Bir sonraki sefer güvenlik duvarı log'larınızı incelerken, o değişken kaynak portlarını gördüğünüzde, içiniz rahat olsun. Bu, Windows'un sizin için arka planda güvenliğinizi sağlamlaştırdığının bir göstergesidir.
Derinlemesine Analiz için bu yazıma bakınız
Şimdi DNS sunucunuzun çok yüksek seviyede çalışmasını isteyebilirsiniz. Kutudan çıktığı gibi, Windows Server DNS kullanıldığı trafiğin büyük çoğunluğunu yönetiyor. Çoğu organizasyon için saniyede birkaç yüz ya da belki birkaç bin sorgu olabilir ve sadece bununla uğraşıyorsanız, sorun yok. Saniyede on binlerce ya da yüzbinlerce sorguya bakarsanız, DNS sunucu performans ayarınızı düşünmeye başlıyorsunuz, bu yüzden Microsoft'un DNS sunucusunun performans ayarı konusunda verdiği birkaç tavsiye var. İlki, özyinelemeyi devre dışı bırakıyorsunuz.
DNS sunucunuzun performans ayarlaması açısından iyi bir diğer ipucu ise, başka hiçbir şeye gerçekten etkisi olmadan uygulayabileceğiniz bir diğer iyi ipucu, DNS sunucu sorgusunu kabul eden arayüz IP adresi için 53 portunda UDP trafiğine izin veren açık bir firewall kuralı oluşturmak. Bunu yapmak güvenlik duvarının CPU kullanımını azaltır. Çünkü varsayılan kural, UDP port 53 kadar açık değil. Temelde TCP port trafiğine izin veriyor. Ama gelip özel bir güvenlik duvarı kuralı oluşturursanız, trafik güvenlik duvarına düşer ve bu da DNS sunucunuzdaki CPU kullanımınızı azaltır.
Eğer 12'den fazla işlemci çekirdeği olan bir DNS sunucunuz varsa, UDP iş parçacığı sayısını sekiz olarak ayarlamalısınız ve bunu HKLM\System\CurrentControlSet\ Services\DNS\Parameters\UdpRecvTreadCount kayıt defterini değiştirerek yapabilirsiniz. O yüzden kayıt kaydı anahtarını değiştir ve sekize ayarla. Çünkü 12'den fazla çekirdeğe sahip olduğunda UDP'nin ipliklerinin en iyi seviyesi bu olur. 12 çekirdekten az varsa, varsayılan olarak bırak.
Microsoft'un DNS sunucu performans ayarı için verdiği diğer tavsiye ise ağ adaptör tamponlarını maksimuma göre yapılandırmak. Bunu Set-Network Adapter Gelişmiş Özellik- ,PowerShell Komut Set-Ağ Komutunu kullanarak yapabilirsiniz; burada ağ arayüzünüzün adını, Display Name'i Receive Buffers olarak ve Display Değerini Maksimum olarak belirtirsiniz. Bu, DNS Sunucunuzun mümkün olduğunca iyi çalışmasını istiyorsanız Alım Tamponlarını Maksimuma ayarlıyor.