Windows DNS’te Forward ve Reverse Lookup Zone Oluşturma
Kurumsal ağlarda DNS yönetimi, sıradan bir görev gibi görünse de yanlış yapılandırılmış bir DNS altyapısı sizi saatlerce süren sorun giderme maratanlarına sürükleyebilir. Geçen ay bir müşterimizin ortamında tam da bu yüzden ciddi bir authentication problemi yaşadık: Forward lookup zone vardı, reverse zone yoktu, Kerberos şikayet ediyordu, kimse nedenini anlayamıyordu. Bu yazıda Windows DNS Server üzerinde forward ve reverse lookup zone’ları nasıl düzgün kurarsınız, nelere dikkat etmeniz gerekir, bütün bunları gerçek senaryolar üzerinden ele alacağız.
DNS Zone Türlerini Anlamak
DNS’e sadece “ismi IP’ye çeviren şey” diye bakarsanız, reverse zone’ların neden var olduğunu hiçbir zaman tam kavrayamazsınız.
Forward Lookup Zone, bildiğiniz klasik DNS çözümlemesidir. sunucu01.sirket.local sorgularsınız, 192.168.10.15 döner. Ağdaki her cihaz buna ihtiyaç duyar.
Reverse Lookup Zone ise tam tersi yönde çalışır. Elinizde bir IP adresi var, buna karşılık gelen hostname’i bulmak istiyorsunuz. 192.168.10.15 sorgularsınız, sunucu01.sirket.local döner. Bunu PTR (Pointer) kaydı ile yapar.
Peki reverse zone neden bu kadar kritik?
- Active Directory Kerberos authentication mekanizması PTR kayıtlarına güvenir
- SQL Server, hostname doğrulaması sırasında reverse çözümleme yapar
- Güvenlik logları ve SIEM sistemleri IP adreslerini hostname’e çevirmek zorundadır
- Exchange Server ve birçok mail sistemi reverse DNS’i spam filtresi olarak kullanır
- Network monitoring araçları (Zabbix, PRTG vs.) cihaz isimlerini PTR’dan alır
Kısacası “reverse zone olmadan da çalışıyor” dediğinizde aslında bir şeyler çalışmıyordur, sadece henüz fark etmedinizdir.
Ortam Hazırlığı
Önce neyle çalıştığımızı netleştirelim. Örnek senaryomuzda:
- Windows Server 2022 üzerinde DNS Server rolü kurulu
- Domain:
sirket.local - Ağ aralığı:
192.168.10.0/24 - DNS sunucu IP:
192.168.10.10
DNS Server rolünü PowerShell ile kontrol edelim:
Get-WindowsFeature -Name DNS
# Rol kurulu değilse:
Install-WindowsFeature -Name DNS -IncludeManagementTools
DNS servisinin durumunu ve temel yapılandırmasını görüntüleyelim:
Get-Service -Name DNS
Get-DnsServer | Select-Object -ExpandProperty ServerSetting
Servis çalışıyorsa ve temel ayarlar yerindeyse zone oluşturmaya geçebiliriz.
Forward Lookup Zone Oluşturma
DNS Manager ile GUI Üzerinden
DNS Manager’ı açmanın en hızlı yolu: Win + R tuşlayın, dnsmgmt.msc yazın, Enter’a basın.
Sol panelde sunucu adınızın altında Forward Lookup Zones görürsünüz. Üzerine sağ tıklayın, New Zone seçin. Sihirbaz açılır.
Zone türünü seçmeniz gerekiyor. Active Directory ortamındaysanız ve zone’un AD ile entegre çalışmasını istiyorsanız:
- Primary zone seçin
- Store the zone in Active Directory kutusunu işaretleyin (domain controller’da DNS çalışıyorsa bu seçenek gelir)
- AD Replication Scope olarak To all DNS servers running on domain controllers in this domain seçin
AD entegrasyonu olmadan standalone DNS kuruyorsanız sadece Primary zone seçmeniz yeterli.
Zone adını girin: sirket.local
Dynamic update ayarı kritik bir karar noktası:
- Allow only secure dynamic updates – AD ortamları için önerilir, sadece domain üyesi makineler kayıt güncelleyebilir
- Allow both nonsecure and secure dynamic updates – Güvenli değil, domain dışı cihazlar da kaydedebilir
- Do not allow dynamic updates – Manuel yönetim, küçük ve statik ortamlar için uygun olabilir
PowerShell ile Forward Zone Oluşturma
GUI’ye hiç bulaşmadan komut satırından halledelim. Özellikle çok sayıda DNS sunucusu olan ortamlarda veya otomasyon scriptlerinde bu yaklaşım çok daha verimli:
# AD entegreli primary zone oluşturma
Add-DnsServerPrimaryZone `
-Name "sirket.local" `
-ReplicationScope "Domain" `
-DynamicUpdate "Secure" `
-PassThru
# Zone oluşturuldu mu kontrol edelim
Get-DnsServerZone -Name "sirket.local"
AD entegrasyonu olmayan, dosya tabanlı zone oluşturmak için:
# Standalone DNS sunucusu için dosya tabanlı zone
Add-DnsServerPrimaryZone `
-Name "sirket.local" `
-ZoneFile "sirket.local.dns" `
-DynamicUpdate "None" `
-PassThru
Zone dosyaları varsayılan olarak C:WindowsSystem32dns dizininde tutulur.
A Kaydı Ekleme
Zone oluşturulduktan sonra içini doldurmaya başlayalım:
# Tek bir A kaydı ekleme
Add-DnsServerResourceRecordA `
-Name "sunucu01" `
-ZoneName "sirket.local" `
-IPv4Address "192.168.10.15" `
-CreatePtr `
-TimeToLive 01:00:00
# Birden fazla kayıt eklemek için döngü kullanabilirsiniz
$sunucular = @(
@{Name="sunucu02"; IP="192.168.10.16"},
@{Name="sunucu03"; IP="192.168.10.17"},
@{Name="webserver"; IP="192.168.10.20"}
)
foreach ($sunucu in $sunucular) {
Add-DnsServerResourceRecordA `
-Name $sunucu.Name `
-ZoneName "sirket.local" `
-IPv4Address $sunucu.IP `
-CreatePtr `
-TimeToLive 01:00:00
Write-Host "$($sunucu.Name) kaydı eklendi: $($sunucu.IP)"
}
-CreatePtr parametresine dikkat edin. Bu parametre, A kaydı oluştururken otomatik olarak karşılık gelen PTR kaydını da oluşturur. Ancak bunun çalışması için reverse zone’un daha önce oluşturulmuş olması gerekir.
Reverse Lookup Zone Oluşturma
İşte asıl kritik kısım burası. Pek çok sysadmin forward zone’u kurar, reverse’i es geçer ve sonra garip problemlerle boğuşur.
GUI ile Reverse Zone
DNS Manager’da Reverse Lookup Zones üzerine sağ tıklayın, New Zone seçin.
Zone türünü forward zone’da yaptığınız gibi seçin (AD entegreli ortam için Primary + AD integrated).
Sonraki ekranda IP version sorulur. IPv4 Reverse Lookup Zone seçin.
Network ID kısmına 192.168.10 yazın. DNS Manager otomatik olarak zone adını 10.168.192.in-addr.arpa olarak gösterecektir. Bu biraz şaşırtıcı gelebilir, ama IP adresinin ters yazılmış halidir ve ARPA zone’ları böyle çalışır.
PowerShell ile Reverse Zone Oluşturma
# /24 ağ için reverse lookup zone oluşturma
Add-DnsServerPrimaryZone `
-NetworkId "192.168.10.0/24" `
-ReplicationScope "Domain" `
-DynamicUpdate "Secure" `
-PassThru
# Zone adını kontrol edelim
Get-DnsServerZone | Where-Object {$_.IsReverseLookupZone -eq $true}
PowerShell burada işinizi kolaylaştırıyor. -NetworkId parametresine CIDR formatında ağı veriyorsunuz, geri kalanını hallediyor.
PTR Kaydı Ekleme
# Manuel PTR kaydı ekleme
Add-DnsServerResourceRecordPtr `
-Name "15" `
-ZoneName "10.168.192.in-addr.arpa" `
-PtrDomainName "sunucu01.sirket.local." `
-TimeToLive 01:00:00
# PTR kaydını doğrulayalım
Resolve-DnsName -Name "192.168.10.15" -Type PTR -Server 192.168.10.10
PTR kaydında -Name parametresi olarak sadece son okteti yazıyorsunuz, 15 gibi. Zone adı zaten 10.168.192.in-addr.arpa olduğu için tam PTR kaydı 15.10.168.192.in-addr.arpa olarak oluşturulur.
-PtrDomainName değerinin sonundaki nokta (.) önemlidir. Bu, FQDN (Fully Qualified Domain Name) göstergesidir. Koymayı unutursanız bazı DNS implementasyonlarında sorun çıkabilir.
Farklı Subnet Büyüklükleri için Zone Yapılandırması
Gerçek dünyada her zaman temiz /24 ağlarla çalışmıyoruz. /16 veya daha büyük ağlarda nasıl yapılandırılır?
# /16 ağ için reverse zone (192.168.0.0/16)
Add-DnsServerPrimaryZone `
-NetworkId "192.168.0.0/16" `
-ReplicationScope "Domain" `
-DynamicUpdate "Secure" `
-PassThru
# Bu 168.192.in-addr.arpa zone'unu oluşturur
# /8 ağ için (10.0.0.0/8)
Add-DnsServerPrimaryZone `
-NetworkId "10.0.0.0/8" `
-ReplicationScope "Domain" `
-DynamicUpdate "Secure" `
-PassThru
# Bu 10.in-addr.arpa zone'unu oluşturur
Birden fazla subnet varsa ve hepsini ayrı ayrı yönetmek istiyorsanız:
# Birden fazla reverse zone oluşturma
$networkler = @(
"192.168.10.0/24",
"192.168.20.0/24",
"192.168.30.0/24"
)
foreach ($network in $networkler) {
Add-DnsServerPrimaryZone `
-NetworkId $network `
-ReplicationScope "Domain" `
-DynamicUpdate "Secure" `
-PassThru
Write-Host "$network icin reverse zone olusturuldu"
}
Zone Doğrulama ve Test
Zone’ları oluşturduktan sonra her şeyin beklendiği gibi çalıştığını doğrulamak şart. Bunu atlayanlar sonradan “kurdum ama çalışmıyor” moduna giriyor.
# Tüm zone'ları listele
Get-DnsServerZone | Select-Object ZoneName, ZoneType, IsReverseLookupZone, IsDsIntegrated
# Forward çözümleme testi
Resolve-DnsName -Name "sunucu01.sirket.local" -Type A -Server 192.168.10.10
# Reverse çözümleme testi
Resolve-DnsName -Name "192.168.10.15" -Type PTR -Server 192.168.10.10
# nslookup ile klasik test
nslookup sunucu01.sirket.local 192.168.10.10
nslookup 192.168.10.15 192.168.10.10
Eğer reverse çözümleme başarısız oluyorsa şu kontrolleri yapın:
- PTR kaydının gerçekten oluşturulup oluşturulmadığını
Get-DnsServerResourceRecord -ZoneName "10.168.192.in-addr.arpa"ile görün - DNS sunucusu adresinin doğru belirtildiğinden emin olun
- Firewall’da UDP/TCP 53 portuna izin verilip verilmediğini kontrol edin
Conditional Forwarder Yapılandırması
Birden fazla domain’iniz varsa veya split-brain DNS senaryosu çalışıyorsanız conditional forwarder kullanmanız gerekir. Örneğin şirketinizin ikinci bir domain’i veya iş ortağı ile VPN bağlantısı üzerinden eriştiğiniz bir domain varsa:
# Belirli bir domain için conditional forwarder ekleme
Add-DnsServerConditionalForwarderZone `
-Name "partner.com" `
-MasterServers 10.0.0.53 `
-PassThru
# Birden fazla forwarder sunucusu tanımlamak için
Add-DnsServerConditionalForwarderZone `
-Name "datacenter.internal" `
-MasterServers @("10.1.0.53", "10.1.0.54") `
-ReplicationScope "Domain" `
-PassThru
# Mevcut conditional forwarder'ları listele
Get-DnsServerZone | Where-Object {$_.ZoneType -eq "Forwarder"}
Scavenging Ayarları
Dynamic DNS kullanıyorsanız eski kayıtlar zamanla birikir. Artık ağda olmayan bilgisayarların DNS kayıtları kalır, kirlenir. Bu hem güvenlik açığı hem de kafa karışıklığı kaynağıdır. Scavenging mekanizması bu eski kayıtları temizler.
# Zone üzerinde scavenging'i etkinleştir
Set-DnsServerZoneAging `
-Name "sirket.local" `
-Aging $true `
-ScavengeServers 192.168.10.10 `
-RefreshInterval 7.00:00:00 `
-NoRefreshInterval 7.00:00:00
# Reverse zone için de aynısını yap
Set-DnsServerZoneAging `
-Name "10.168.192.in-addr.arpa" `
-Aging $true `
-ScavengeServers 192.168.10.10 `
-RefreshInterval 7.00:00:00 `
-NoRefreshInterval 7.00:00:00
# DNS sunucusu genelinde otomatik scavenging'i etkinleştir
Set-DnsServerScavenging `
-ScavengingState $true `
-ScavengingInterval 7.00:00:00 `
-PassThru
Scavenging için RefreshInterval ve NoRefreshInterval’ın toplamı, kayıtların silinmeden önce ne kadar bekleneceğini belirler. Varsayılan 7+7=14 gün çoğu ortam için makul bir değerdir. Statik kayıtlara dokunmaz, sadece dinamik olarak oluşturulan kayıtları temizler.
Sık Karşılaşılan Sorunlar
Problem: A kaydı var ama PTR kaydı yok
En sık görülen durum budur. -CreatePtr parametresini kullanmadan A kaydı eklediğinizde veya reverse zone daha sonra oluşturulduğunda bu durum yaşanır.
# Mevcut A kayıtlarını çekip PTR'ları kontrol et
$aKayitlari = Get-DnsServerResourceRecord -ZoneName "sirket.local" -RRType "A"
foreach ($kayit in $aKayitlari) {
$ip = $kayit.RecordData.IPv4Address.ToString()
try {
$ptr = Resolve-DnsName -Name $ip -Type PTR -Server 192.168.10.10 -ErrorAction Stop
Write-Host "OK: $($kayit.HostName) -> $ip -> $($ptr.NameHost)"
}
catch {
Write-Host "PTR EKSIK: $($kayit.HostName) -> $ip" -ForegroundColor Red
}
}
Problem: Zone transfer çalışmıyor
Secondary DNS sunucunuz varsa zone transfer izinlerini doğru vermeniz gerekir:
# Zone transfer izinlerini yapılandır
Set-DnsServerPrimaryZone `
-Name "sirket.local" `
-SecureSecondaries TransferToSecureServers `
-SecondaryServers "192.168.10.11" `
-PassThru
# Zone transfer'ı manuel tetikle
Start-DnsServerZoneTransfer -Name "sirket.local" -FullTransfer
Problem: DNS kayıtları güncellenmekle birlikte eski değerler önbelleğe alınmış
# DNS sunucusu önbelleğini temizle
Clear-DnsServerCache -Force
# İstemci tarafında cache temizle
Clear-DnsClientCache
ipconfig /flushdns
Geri Dönük Bakış
Yıllarca farklı ölçeklerde ortamlarda DNS kurulumu yaptım. Küçük bir muhasebe firmasından 5000 kullanıcılı holdinglere kadar. Hepsinde gördüğüm ortak hata şu: DNS kurulumu “çalışıyor” diye geçilip geçiştiriliyor, ama bütünlüklü test yapılmıyor.
Forward çalışıyor, reverse yok. Scavenging kapalı, zone şişmiş. PTR kayıtları eski IP’lere işaret ediyor. Bunlar zamanla büyüyen problemler, başlangıçta fark etmiyorsunuz.
Kurulum sonrası mutlaka şu kontrol listesini çalıştırın:
- Forward ve reverse çözümleme testleri geçti mi?
- AD entegreli zone’lar tüm DC’lere replikasyon yapıyor mu?
- Scavenging yapılandırıldı mı?
- Kritik sunuculara statik DNS kaydı mı girildi, yoksa DHCP dinamik kaydına mı güveniliyor?
- Zone transfer güvenli mi yapılandırılmış?
Sonuç
Windows DNS’te forward ve reverse lookup zone yapılandırması aslında teknik olarak çok karmaşık değil. Ama doğru düşünce yapısıyla yaklaşmazsanız, eksik konfigürasyonlar sizi beklenmedik anlarda yakalıyor. Reverse zone’ları hiçbir zaman opsiyonel olarak görmeyin; Active Directory, ağ güvenliği ve monitoring açısından forward zone kadar zorunludur.
PowerShell komutlarını öğrenmek için zaman harcamak da kesinlikle değer. GUI ile kurmak bir kez mantıklı gelebilir, ancak onlarca sunucudan oluşan bir ortamı yönettiğinizde ya da disaster recovery senaryolarında her şeyi yeniden yapılandırmanız gerektiğinde script yazmış olmak hayat kurtarır.
Son olarak, scavenging mekanizmasını kurun ve düzenli aralıklarla DNS kayıtlarınızı gözden geçirin. Temiz bir DNS ortamı, temiz bir ağın temelidir.
