Windows Server’da DNS Sorunlarını Tespit ve Çözme
Gece 02:00’de telefon çalıyor. “DNS çalışmıyor, hiçbir şeye erişemiyoruz.” Bu cümleyi kaç kez duydunuz? Ben sayamıyorum artık. Windows Server ortamlarında DNS sorunları, sıradan bir servis kesintisinden çok daha fazlasını ifade ediyor; Active Directory, Exchange, web uygulamaları, VPN bağlantıları… Hepsi DNS’e bağımlı. Bu yüzden DNS sorunlarını hızlı ve doğru teşhis etmek, bir sysadmin olarak sahip olmanız gereken en kritik becerilerden biri.
Bu yazıda hem Windows Server üzerinde DNS sorunlarını adım adım nasıl tespit edeceğinizi, hem de karşılaştığım gerçek senaryolara dayalı çözüm yöntemlerini paylaşacağım.
DNS Sorunlarının Temel Kategorileri
DNS arızaları genellikle birkaç ana kategoride toplanıyor. Bunları kafanızda netleştirmeden hata ayıklamaya girişirseniz saatlerce boşa dönersiniz.
- Çözümleme (Resolution) sorunları: İstemci DNS sorgularına yanıt alamıyor ya da yanlış yanıt alıyor
- Replikasyon sorunları: Active Directory entegre DNS zone’larında veri tutarsızlığı
- Zone yapılandırma sorunları: Yanlış SOA, NS kaydı veya bozuk zone dosyası
- Performans sorunları: DNS sorgularında gecikme, yüksek CPU veya bellek tüketimi
- Güvenlik sorunları: Cache poisoning, zone transfer izin ihlalleri
Her kategori farklı bir tanı sürecini gerektiriyor. Önce semptomları doğru okumak gerekiyor.
İlk Müdahale: Temel Testler
Herhangi bir DNS şikayeti geldiğinde ilk yapacağınız şey kapsamı belirlemek. Sorun tek bir istemcide mi, tüm ağda mı, sadece belirli bir zone’da mı?
nslookup ile Hızlı Tanılama
nslookup hala en hızlı ilk kontrol aracı. Hem istemci tarafında hem de sunucu üzerinde kullanabilirsiniz.
# Temel sorgu testi
nslookup sunucu01.domain.local
# Belirli bir DNS sunucusu üzerinden test
nslookup sunucu01.domain.local 192.168.1.10
# Reverse lookup testi
nslookup 192.168.1.50
# NS kayıtlarını sorgulama
nslookup -type=NS domain.local
# SOA kaydını kontrol etme
nslookup -type=SOA domain.local 192.168.1.10
Burada dikkat etmeniz gereken nokta: nslookup kendi önbelleğini kullanmaz, doğrudan DNS sunucusuna gider. Bu yüzden istemci tarafındaki önbellek sorunlarını ayırt etmek için iyi bir araç.
Resolve-DnsName ile PowerShell Tanılaması
Modern ortamlarda Resolve-DnsName cmdlet’i çok daha fazla bilgi sunuyor.
# Temel çözümleme
Resolve-DnsName -Name "sunucu01.domain.local"
# Belirli sunucu ve kayıt tipiyle sorgu
Resolve-DnsName -Name "domain.local" -Type SOA -Server 192.168.1.10
# Tüm kayıt tiplerini listele
Resolve-DnsName -Name "domain.local" -Type ANY -Server 192.168.1.10
# DNS önbelleğini atlatarak test
Resolve-DnsName -Name "sunucu01.domain.local" -DnsOnly
Bir keresinde istemcilerin belirli bir sunucuya erişemediği şikayeti geldi. nslookup doğru sonuç veriyordu ama bağlantı olmuyordu. Resolve-DnsName ile sorguladığımda kayıt doğru dönüyordu, ancak TTL değerinin sıfır olduğunu fark ettim. Birisi zone üzerinde oynamış, TTL’i 0 yapmıştı. Sonuç: her sorgu DNS sunucusunu döviyor, sunucu da altında eziliyordu.
DNS Sunucu Durumunu Kontrol Etme
Windows DNS Servisi Sağlık Kontrolü
# DNS servis durumu
Get-Service -Name DNS | Select-Object Name, Status, StartType
# DNS sunucusu istatistikleri
Get-DnsServerStatistics
# DNS sunucusu yapılandırması
Get-DnsServer | Select-Object -ExpandProperty ServerSetting
# Event Log'dan son DNS hatalarını çekme
Get-WinEvent -LogName "DNS Server" -MaxEvents 50 |
Where-Object {$_.LevelDisplayName -eq "Error" -or $_.LevelDisplayName -eq "Warning"} |
Select-Object TimeCreated, Id, Message | Format-List
Get-DnsServerStatistics çıktısına bakın; özellikle RecursionFailure ve SecureUpdateReceived değerleri anormalse, bu size çok şey söyler. Yüksek RecursionFailure genellikle forwarder sorununa ya da internet erişim problemine işaret eder.
Zone Bütünlüğünü Kontrol Etme
# Tüm zone'ları listele
Get-DnsServerZone | Select-Object ZoneName, ZoneType, IsReverseLookupZone, IsDsIntegrated
# Belirli bir zone'daki kayıtları listele
Get-DnsServerResourceRecord -ZoneName "domain.local" |
Where-Object {$_.RecordType -eq "A"} |
Select-Object HostName, RecordData
# Zone'un SOA kaydını kontrol et
Get-DnsServerResourceRecord -ZoneName "domain.local" -RRType SOA
# Zone transfer ayarlarını gör
Get-DnsServerZone -Name "domain.local" | Select-Object ZoneName, SecondaryServers, NotifyServers
Active Directory Entegre DNS Sorunları
AD entegre DNS kullanıyorsanız (ki çoğu kurumsal ortamda böyledir) replikasyon sorunları bambaşka bir boyut kazanıyor.
AD Replikasyon Durumu
AD replikasyonu bozulduğunda DNS kayıtları DC’ler arasında tutarsız hale gelir. Bir DC üzerindeki kayıt diğerinde görünmez.
# AD replikasyon durumunu kontrol et
repadmin /showrepl
# DNS ile ilgili replikasyon hatalarını listele
repadmin /showrepl * /csv | ConvertFrom-Csv |
Where-Object {$_."Number of Failures" -gt 0} |
Select-Object "Source DSA", "Naming Context", "Number of Failures", "Last Failure Time"
# DC'ler arasında DNS kayıt tutarlılığını kontrol et
dcdiag /test:dns /v /f:C:Logsdcdiag_dns.txt
dcdiag /test:dns çıktısını her zaman bir dosyaya yazmayı tercih ederim çünkü konsol çıktısı kayıyor ve uzun raporlarda önemli hataları kaçırıyorsunuz. Dosyaya yazıp Select-String ile filtrelemek çok daha verimli.
DNS Kayıt Tutarsızlığını Tespit Etme
Gerçek bir senaryodan bahsedeyim: Birden fazla DC bulunan bir ortamda kullanıcılar “zaman zaman” erişim sorunu yaşıyordu. Aralıklı sorunlar her zaman en sinir bozucudur. Araştırdığımızda bir DC’deki kayıt başka DC’dekinden farklıydı. Birisi manuel kayıt eklemiş ama değişiklik tüm DC’lere yayılmamıştı.
# Her DC üzerindeki aynı kaydı karşılaştır
$DCs = @("DC01", "DC02", "DC03")
$RecordName = "webserver"
$Zone = "domain.local"
foreach ($DC in $DCs) {
Write-Host "=== $DC ===" -ForegroundColor Cyan
Resolve-DnsName -Name "$RecordName.$Zone" -Server $DC -Type A |
Select-Object Name, IPAddress, TTL
}
Bu basit script, ortamdaki tüm DC’lere aynı sorguyu atar ve sonuçları yan yana gösterir. Tutarsızlık anında ortaya çıkar.
DNS Cache Sorunları
İstemci Tarafında DNS Cache Temizleme
# Windows DNS önbelleğini temizle
ipconfig /flushdns
# DNS önbelleğini görüntüle
ipconfig /displaydns
# PowerShell ile önbelleği temizle
Clear-DnsClientCache
# Önbellek içeriğini detaylı gör
Get-DnsClientCache | Select-Object Entry, RecordName, Data, TimeToLive
Sunucu Tarafında DNS Cache Yönetimi
# DNS sunucusu önbelleğini temizle (dikkatli kullanın, performans etkisi var)
Clear-DnsServerCache
# Belirli bir kaydı önbellekten sil
Clear-DnsServerCache -Force
# Önbellek içeriğini görüntüle
Get-DnsServerCache | Select-Object Entry, RecordType, TimeToLive |
Sort-Object TimeToLive | Format-Table
Sunucu önbelleğini gereksiz yere temizlemekten kaçının. Özellikle büyük ortamlarda önbellek temizliği sonrası DNS sunucusuna yük binebilir. Sadece belirli bir kayıtta sorun yaşıyorsanız o kaydı hedefleyerek temizleyin.
Forwarder ve Recursive Sorgu Sorunları
İnternet erişimi gerektiren sorgular çözümlenemiyorsa forwarder yapılandırmasına bakın.
# Forwarder ayarlarını görüntüle
Get-DnsServerForwarder
# Forwarder ekle
Add-DnsServerForwarder -IPAddress 8.8.8.8 -PassThru
Add-DnsServerForwarder -IPAddress 8.8.4.4 -PassThru
# Mevcut forwarder'ı sil ve yenisini ekle
Set-DnsServerForwarder -IPAddress @("1.1.1.1", "8.8.8.8") -PassThru
# Forwarder erişilebilirliğini test et
Test-NetConnection -ComputerName 8.8.8.8 -Port 53
Forwarder’a erişim varken DNS sorgusu çalışmıyorsa, güvenlik duvarı kurallarına bakın. UDP 53 açık olabilir ama bazı ortamlarda büyük DNS yanıtları için TCP 53 de gerekiyor. DNS over HTTPS kullanmaya başlayan uygulamalar da bazen eski güvenlik duvarı kurallarıyla çakışıyor.
DNS Kayıt Sorunlarını Çözme
Bozuk veya Eksik Kayıtları Tespit Etme
# Belirli bir IP adresine ait tüm A kayıtlarını bul
Get-DnsServerResourceRecord -ZoneName "domain.local" -RRType A |
Where-Object {$_.RecordData.IPv4Address -eq "192.168.1.100"}
# Orphan kayıtları tespit et (IP artık kullanılmıyor ama kayıt var)
$AllARecords = Get-DnsServerResourceRecord -ZoneName "domain.local" -RRType A
foreach ($record in $AllARecords) {
$ip = $record.RecordData.IPv4Address.ToString()
$ping = Test-Connection -ComputerName $ip -Count 1 -Quiet
if (-not $ping) {
Write-Host "Ulasilamaz: $($record.HostName) - $ip" -ForegroundColor Yellow
}
}
# Duplicate A kayıtlarını bul
Get-DnsServerResourceRecord -ZoneName "domain.local" -RRType A |
Group-Object -Property {$_.RecordData.IPv4Address} |
Where-Object {$_.Count -gt 1} |
Select-Object Name, Count
Kayıt Ekleme, Güncelleme ve Silme
# Yeni A kaydı ekle
Add-DnsServerResourceRecordA -ZoneName "domain.local" -Name "yeniserver" -IPv4Address "192.168.1.200" -TimeToLive 01:00:00
# Var olan kaydı güncelle
$OldRecord = Get-DnsServerResourceRecord -ZoneName "domain.local" -Name "webserver" -RRType A
$NewRecord = $OldRecord.Clone()
$NewRecord.RecordData.IPv4Address = [System.Net.IPAddress]::Parse("192.168.1.201")
Set-DnsServerResourceRecord -ZoneName "domain.local" -OldInputObject $OldRecord -NewInputObject $NewRecord
# Kaydı sil
Remove-DnsServerResourceRecord -ZoneName "domain.local" -Name "eskiserver" -RRType A -Force
DNS Günlüklerini Analiz Etme
Sorunun ne zaman başladığını ve hangi sorgulardan kaynaklandığını anlamak için DNS debug logging’i açabilirsiniz. Ancak bu özelliği dikkatli kullanın; yoğun ortamlarda log dosyası çok hızlı büyür.
# DNS debug logging'i etkinleştir
Set-DnsServerDiagnostics -All $true -LogFilePath "C:DNS_Debugdns.log" -MaxMBFileSize 500
# Sadece hataları logla (daha az yük)
Set-DnsServerDiagnostics -EnableLoggingForRemoteServerEvent $true `
-EnableLoggingForPluginDllEvent $true `
-EnableLoggingToFile $true `
-LogFilePath "C:DNS_Debugdns_errors.log"
# Logging ayarlarını kontrol et
Get-DnsServerDiagnostics | Select-Object LogFilePath, MaxMBFileSize, EnableLoggingToFile
# Debug logging'i kapat (test bittikten sonra mutlaka kapatın)
Set-DnsServerDiagnostics -All $false
Log dosyasını açtığınızda binlerce satırla karşılaşırsınız. PowerShell ile filtrelemek hayat kurtarır:
# Log dosyasından sadece NXDOMAIN yanıtlarını filtrele
Get-Content "C:DNS_Debugdns.log" |
Select-String "NXDOMAIN" |
Select-Object -Last 50
# Belirli bir IP adresinin sorgularını takip et
Get-Content "C:DNS_Debugdns.log" |
Select-String "192.168.1.150"
Güvenlik Odaklı DNS Kontrolleri
Zone Transfer Güvenliği
Zone transfer izinleri yanlış yapılandırılmışsa tüm DNS yapınız internete açık hale gelebilir.
# Zone transfer ayarlarını kontrol et
Get-DnsServerZone | Select-Object ZoneName, SecondaryServers, ZoneType |
Where-Object {$_.SecondaryServers -ne $null}
# Zone transfer'ı sadece belirli sunucularla sınırla
Set-DnsServerZone -Name "domain.local" -SecondaryServers @("192.168.1.11", "192.168.1.12") `
-SecureSecondaries TransferToSecureServers
DNSSEC Durumu
# DNSSEC yapılandırmasını kontrol et
Get-DnsServerZone -Name "domain.local" | Select-Object ZoneName, IsSigned, DynamicUpdate
# Zone imzalama bilgisi
Get-DnsServerZoneDnsSecSettings -ZoneName "domain.local"
Sık Karşılaşılan Hatalar ve Çözümleri
DNS sunucusu “DNS Server” servisinin Event Log’unda 4015 hatası görüyorsunuz
Bu hata genellikle AD DS’in henüz hazır olmadığı sırada DNS başlatmaya çalışıldığında oluşur. Çoğunlukla geçicidir ama kalıcıysa AD replikasyonunu kontrol edin.
repadmin /replsummaryçalıştırınnetlogonservisinin çalıştığını kontrol edindcdiag /test:replicationsile replikasyon hatalarını tespit edin
“Tüm IP adresleri çözümleniyor ama bir tane çalışmıyor”
Büyük ihtimalle söz konusu kayıt için split DNS veya stub zone yapılandırması var. Ya da kayıt birden fazla zone’da tanımlı ve biri yanlış değer içeriyor.
# Tüm zone'larda aynı ismi ara
$TargetName = "problemliserver"
Get-DnsServerZone | ForEach-Object {
$ZoneName = $_.ZoneName
try {
$records = Get-DnsServerResourceRecord -ZoneName $ZoneName -Name $TargetName -ErrorAction Stop
Write-Host "Bulundu: $ZoneName - $($records.RecordData)" -ForegroundColor Green
} catch {
# Kayıt yok, devam et
}
}
“DNS çalışıyor ama bazı istemciler çözümleme yapamıyor”
İstemci tarafından DNS sunucu adresini kontrol edin; DHCP ile yanlış DNS dağıtılıyor olabilir.
# İstemcinin DNS ayarlarını kontrol et
Get-DnsClientServerAddress | Select-Object InterfaceAlias, AddressFamily, ServerAddresses
# DHCP scope'unda dağıtılan DNS adresini kontrol et (sunucu tarafında)
Get-DhcpServerv4OptionValue -OptionId 6 -ScopeId 192.168.1.0
Sonuç
DNS sorunlarını çözmek bir dedektiflik işi. Semptomdan hareket edip katmanları tek tek soyuyorsunuz: istemci mi, sunucu mu, zone mı, replikasyon mu? Her katmanda doğru soruyu sormak, doğru aracı kullanmaktan çok daha önemli.
Yukarıda anlattıklarımı özetlersek:
- İlk müdahalede her zaman kapsamı belirleyin, tek istemci mi yoksa genel mi
nslookupveResolve-DnsNameile hızlı ön tanı yapın- AD entegre ortamlarda replikasyonu asla gözardı etmeyin
- Sunucu önbelleğini rastgele temizlemeyin, performans etkisini hesaplayın
- Zone transfer güvenliğini düzenli aralıklarla gözden geçirin
- Debug logging’i sadece ihtiyaç duyduğunuzda ve zaman sınırıyla açın
En önemlisi: sorun çözüldükten sonra ne yaptığınızı belgeleyin. Altı ay sonra aynı sorunla karşılaştığınızda (veya ekibinizden biri karşılaştığında) o notlar altın değerinde olacak. Ben bu acıyı fazlasıyla yaşadım.
