Active Directory Integrated DNS Kurulum ve Yönetimi

Yıllar önce bir müşteride DNS sorununu çözmek için sabahın üçüne kadar uğraştığımı hatırlıyorum. Sorun basitti aslında: Active Directory ile DNS düzgün entegre edilmemişti ve her domain controller yeniden başladığında DNS kayıtları tutarsız hale geliyordu. O geceden bu yana AD Integrated DNS konusuna çok daha fazla önem veriyorum. Bu yazıda hem teorik arka planı hem de gerçek dünyada işe yarayan pratik konfigürasyonları ele alacağım.

Active Directory Integrated DNS Nedir ve Neden Önemlidir?

Geleneksel DNS yapısında primary/secondary zone mantığı vardır. Primary zone üzerinde değişiklik yaparsınız, secondary zone’lar da zone transfer ile bu değişiklikleri çeker. Basit bir yapı, ama ciddi eksiklikleri var. Öncelikle tek nokta arıza riski (single point of failure) taşıyor, çünkü primary zone’u barındıran sunucu çöktüğünde dinamik DNS güncellemeleri durur. İkincisi, zone transfer trafiği şifresiz gider ve güvenlik açığı oluşturur.

AD Integrated DNS’te ise DNS zone verileri artık bir dosyada değil, Active Directory veritabanında (NTDS.dit) saklanır. Bu sayede:

  • Multi-master replikasyon elde edersiniz: Herhangi bir domain controller üzerinde DNS kaydı ekleyebilir veya güncelleyebilirsiniz
  • Güvenli dinamik güncelleme zorunlu hale getirilebilir: Yalnızca domain üyesi makineler kendi kayıtlarını güncelleyebilir
  • AD replikasyonu üzerinden zone transferi gerçekleşir, ayrı bir zone transfer mekanizmasına gerek kalmaz
  • Şifreli ve kimlik doğrulamalı replikasyon sayesinde DNS verisi korunur

Küçük bir ortamda bu farkı hissetmeyebilirsiniz, ama 5-6 domain controller’ı olan enterprise bir yapıda AD Integrated DNS olmadan yaşamak gerçekten zorlaşıyor.

Ön Gereksinimler ve Planlama

Kuruluma geçmeden önce birkaç şeyi netleştirmeniz gerekiyor.

DNS namespace planlaması: Internal DNS için ne kullanacaksınız? Burada iki okul var. Bir kesim corp.sirket.com gibi external domain’in alt domain’ini kullanmayı tercih ediyor. Diğer kesim sirket.local gibi tamamen ayrı bir namespace kullanıyor. Microsoft artık .local yerine kayıtlı bir domain kullanılmasını öneriyor, özellikle certificate otoritesi kuruyorsanız. Ben genellikle ad.sirket.com veya internal.sirket.com formatını öneriyorum.

IP adresleme: Domain controller’larınızın statik IP adresi olmalı. Bunu atlayan insanlar görüyorum, sonra sorunlar çıkıyor. DHCP reservation da kabul edilebilir ama statik tercih edilir.

Replikasyon topolojisi: DNS verisi AD replikasyonu üzerinden gittiğinden, hangi partition’da saklanacağını belirlemeniz gerekiyor. Bu konuya birazdan geleceğiz.

Kurulum Adımları

Domain Controller Üzerine DNS Rolü Ekleme

Eğer yeni bir DC kuruyorsanız, dcpromo (ya da Server 2012 ve sonrasında Install-ADDSDomainController) sırasında DNS rolü otomatik önerilir. Ama mevcut bir DC’ye sonradan DNS eklemek de sık karşılaşılan senaryo.

# DNS Server rolünü yükle
Install-WindowsFeature -Name DNS -IncludeManagementTools

# Kurulumu doğrula
Get-WindowsFeature -Name DNS

Kurulum tamamlandıktan sonra DNS servisinin çalıştığını kontrol edin:

Get-Service -Name DNS | Select-Object Name, Status, StartType

# Servis durumunu izle
Start-Service -Name DNS
Set-Service -Name DNS -StartupType Automatic

AD Integrated Zone Oluşturma

DNS Manager GUI üzerinden yapabilirsiniz ama PowerShell ile yapmak hem daha hızlı hem de tekrarlanabilir. Özellikle birden fazla DC kuruyorsanız script hazırlamak hayat kurtarır.

# Yeni bir Primary Zone oluştur ve AD'ye entegre et
Add-DnsServerPrimaryZone -Name "internal.sirket.com" `
    -ReplicationScope "Forest" `
    -DynamicUpdate "Secure"

# Zone'un oluşturulduğunu doğrula
Get-DnsServerZone -Name "internal.sirket.com" | 
    Select-Object ZoneName, ZoneType, IsDsIntegrated, DynamicUpdate, ReplicationScope

Burada ReplicationScope parametresi kritik. Üç seçenek var:

  • Forest: Tüm forest’taki domain controller’lara replicate edilir (DNS sunucu olmayan DC’ler dahil)
  • Domain: Yalnızca mevcut domain’deki DC’lere replicate edilir
  • Legacy: Eski Windows 2000 tarzı replikasyon, yeni kurulumlarda kullanmayın

Çoğu senaryoda Domain scope yeterlidir. Forest scope’u ancak forest içinde birden fazla domain varsa ve DNS’i tüm DC’lerde tutmak istiyorsanız tercih edin.

Mevcut Zone’u AD Integrated’a Dönüştürme

Bazen mevcut bir file-based zone’u AD integrated’a çevirmeniz gerekir. Bu durumda:

# Mevcut zone'un tipini kontrol et
Get-DnsServerZone | Select-Object ZoneName, ZoneType, IsDsIntegrated

# File-based zone'u AD integrated'a dönüştür
ConvertTo-DnsServerPrimaryZone -Name "eski.sirket.com" `
    -ReplicationScope "Domain" `
    -Force

Bu işlem zone verilerini AD’ye aktarır. Zone dosyası sistemde kalır ama artık kullanılmaz. Yine de bir süre tutmanızı öneririm, sorun çıkarsa reference alabilirsiniz.

Güvenli Dinamik Güncellemeler

Bu konu genellikle gözden kaçıyor ama çok önemli. DynamicUpdate parametresi için üç değer var:

  • None: Dinamik güncelleme kapalı, tüm kayıtlar manuel eklenir
  • NonsecureAndSecure: Hem domain üyesi hem de domain dışı makineler kayıt ekleyebilir (Tehlikeli!)
  • Secure: Yalnızca Kerberos ile kimlik doğrulaması yapan domain üyeleri kayıt ekleyebilir

Production ortamda her zaman Secure kullanın. NonsecureAndSecure seçeneğini yalnızca çok özel geçiş dönemlerinde ve kısa süreliğine açın.

# Tüm AD integrated zone'ların dinamik güncelleme ayarını kontrol et
Get-DnsServerZone | 
    Where-Object {$_.IsDsIntegrated -eq $true} | 
    Select-Object ZoneName, DynamicUpdate

# Belirli bir zone için secure dynamic update zorla
Set-DnsServerPrimaryZone -Name "internal.sirket.com" -DynamicUpdate "Secure"

DNS Kayıtlarını Yönetme

Günlük operasyonda en çok ihtiyaç duyulan komutlar:

# A kaydı ekle
Add-DnsServerResourceRecordA -ZoneName "internal.sirket.com" `
    -Name "webserver01" `
    -IPv4Address "192.168.10.50" `
    -TimeToLive 01:00:00

# CNAME kaydı ekle
Add-DnsServerResourceRecordCName -ZoneName "internal.sirket.com" `
    -Name "intranet" `
    -HostNameAlias "webserver01.internal.sirket.com."

# MX kaydı ekle
Add-DnsServerResourceRecordMX -ZoneName "internal.sirket.com" `
    -Name "@" `
    -MailExchange "mail.internal.sirket.com" `
    -Preference 10

# Kayıtları listele
Get-DnsServerResourceRecord -ZoneName "internal.sirket.com" -RRType "A"

# Belirli bir kaydı sil
Remove-DnsServerResourceRecord -ZoneName "internal.sirket.com" `
    -Name "eskisunucu" `
    -RRType "A" `
    -Force

Bir de PTR kayıtlarından bahsetmek lazım. Birçok ortamda reverse lookup zone’lar ihmal edilir, ama özellikle monitoring araçları ve mail sunucular için PTR kayıtları kritiktir.

# Reverse lookup zone oluştur
Add-DnsServerPrimaryZone -NetworkID "192.168.10.0/24" `
    -ReplicationScope "Domain" `
    -DynamicUpdate "Secure"

# PTR kaydı ekle
Add-DnsServerResourceRecordPtr -ZoneName "10.168.192.in-addr.arpa" `
    -Name "50" `
    -PtrDomainName "webserver01.internal.sirket.com."

DNS Forwarder Konfigürasyonu

Internal zone’lar için AD integrated DNS mükemmel çalışır, ama internet trafiği için ne yapacaksınız? Forwarder’lar devreye giriyor.

# DNS forwarder ekle
Add-DnsServerForwarder -IPAddress "8.8.8.8", "8.8.4.4" -PassThru

# Mevcut forwarder'ları görüntüle
Get-DnsServerForwarder

# Forwarder'ı kaldır
Remove-DnsServerForwarder -IPAddress "8.8.8.8"

# Conditional forwarder ekle (partner şirket DNS'i için)
Add-DnsServerConditionalForwarderZone -Name "partner.com" `
    -MasterServers "10.20.30.1", "10.20.30.2" `
    -ReplicationScope "Domain"

Conditional forwarder’lar özellikle merger/acquisition senaryolarında veya partner firmaların iç kaynaklarına erişmeniz gerektiğinde çok işe yarar. Tüm trafiği dış DNS’e göndermek yerine sadece ilgili domain sorgularını doğru sunucuya yönlendirirsiniz.

Scavenging ve Eski Kayıtların Temizlenmesi

Bu konu birçok sysadmin’in kaçırdığı, sonra “neden bu kadar çok kayıt var ki DNS’de?” diye şaştığı bir alan. DHCP ile dinamik DNS kullanıyorsanız, makineler domain’den ayrıldıktan sonra DNS kayıtları geride kalıyor. Zamanla DNS database şişiyor ve yanlış kayıtlar sorunlara yol açıyor.

Scavenging mekanizması eski ve güncellenmemiş kayıtları otomatik temizler. Ama dikkatli olun, yanlış yapılandırılmış scavenging geçerli kayıtları da silebilir.

# DNS sunucu seviyesinde scavenging ayarla
Set-DnsServerScavenging -ScavengingState $true `
    -RefreshInterval 7.00:00:00 `
    -NoRefreshInterval 7.00:00:00 `
    -ScavengingInterval 7.00:00:00

# Belirli bir zone için scavenging aktif et
Set-DnsServerZoneAging -ZoneName "internal.sirket.com" `
    -Aging $true `
    -RefreshInterval 7.00:00:00 `
    -NoRefreshInterval 7.00:00:00

# Scavenging ayarlarını kontrol et
Get-DnsServerZoneAging -ZoneName "internal.sirket.com"

Buradaki mantık şu: NoRefreshInterval (varsayılan 7 gün) süresince kayıt timestamp’i güncellenmez. RefreshInterval (varsayılan 7 gün) süresince kayıt kendini yenilemezse “eski” sayılır. Toplam 14 gün boyunca güncellenmemiş bir kayıt scavenging ile silinir. Çoğu ortam için bu değerler makul, ama laptop’ların sık sık VPN’e bağlandığı ortamlarda biraz artırmanızı öneririm.

Sorun Giderme

DNS sorunlarının büyük çoğunluğu birkaç temel komutla tespit edilebilir.

# DNS çözümleme testi
Resolve-DnsName -Name "webserver01.internal.sirket.com" -Server "dc01.internal.sirket.com"

# Tüm DC'lerin DNS kayıtlarını kontrol et (SRV kayıtları)
Resolve-DnsName -Name "_ldap._tcp.internal.sirket.com" -Type SRV

# DNS sunucu diagnostics
dnscmd /info
dnscmd /statistics

# Event log'lardan DNS hatalarını çek
Get-WinEvent -LogName "DNS Server" -MaxEvents 50 | 
    Where-Object {$_.Level -eq 2} | 
    Select-Object TimeCreated, Message

# Zone replikasyon durumunu kontrol et
repadmin /showrepl

# Belirli bir zone'un AD'de doğru replike olduğunu doğrula
Get-DnsServerZone -Name "internal.sirket.com" -ComputerName "dc02" | 
    Select-Object ZoneName, IsDsIntegrated, ReplicationScope

Sık karşılaştığım bir senaryo: Yeni bir DC kuruldu, DNS rolü eklendi, ama bazı zone’lar görünmüyor. Bunun sebebi genellikle AD replikasyonunun henüz tamamlanmamış olması. repadmin /syncall /AdeP komutu ile replikasyonu zorla tetikleyebilirsiniz.

Bir diğer klasik senaryo: Client makineler DNS sorgularını yanıtsız gönderiyor. İlk kontrol etmeniz gereken şey DNS Server servisinin çalışıp çalışmadığı ve firewall’ın 53. portu (hem TCP hem UDP) açık tutup tutmadığı.

# DC'ler arası DNS replikasyon sorunlarını zorla düzelt
repadmin /syncall /AdeP

# Firewall kurallarını kontrol et
netsh advfirewall firewall show rule name="DNS"

# DNS cache'i temizle
Clear-DnsServerCache -Force
Clear-DnsClientCache

DNS Güvenlik Konfigürasyonu

AD Integrated DNS kullanmanın güvenlik avantajlarından tam yararlanmak için birkaç ek adım atmanızı öneririm.

DNS Socket Pool: DNS amplification saldırılarına karşı koruma sağlar.

# DNS Socket Pool boyutunu artır (varsayılan 2500)
dnscmd /config /socketpoolsize 10000

# DNS Cache Locking aktif et (varsayılan %100)
dnscmd /config /cachelockingpercent 100

Response Rate Limiting: DNS DDoS saldırılarına karşı koruma.

# RRL'yi etkinleştir
Set-DnsServerResponseRateLimiting -Mode Enable `
    -ResponsesPerSec 5 `
    -ErrorsPerSec 5 `
    -WindowInSec 5

# RRL durumunu kontrol et
Get-DnsServerResponseRateLimiting

DNS kayıtlarına ACL uygulama: AD integrated DNS’in en değerli özelliklerinden biri, kayıt seviyesinde izin kontrolü yapabilmesidir. Örneğin, belirli bir makine yalnızca kendi kaydını güncelleyebilsin isteyebilirsiniz. Bu kontrol DNS Manager’dan sağ tık > Properties > Security ile yapılabilir.

Çoklu Site Senaryolarında DNS Tasarımı

İstanbul merkez ve Ankara şube gibi iki site olan bir yapıyı ele alalım. Her sitede en az bir DC/DNS sunucu bulunmalı. Şube kullanıcıları DNS sorgularını yerel DNS’e göndermeli, WAN üzerinden merkeze gitmemeli.

AD Sites and Services’te doğru site ve subnet tanımları yapıldığında, DHCP’den dağıtılan DNS adresleri de buna göre verilmelidir. Yani Ankara’daki makinelere Ankara DC’sinin IP’si DNS olarak verilmeli.

# Mevcut AD site'larını listele
Get-ADReplicationSite -Filter *

# Subnet'leri listele
Get-ADReplicationSubnet -Filter *

# Yeni site link konfigürasyonu
Get-ADReplicationSiteLink -Filter * | 
    Select-Object Name, Cost, ReplicationFrequencyInMinutes

DNS sorgularının hangi sunucuya gittiğini test etmek için:

# Belirli bir DNS sunucuya sorgu gönder
nslookup webserver01.internal.sirket.com dc-ankara.internal.sirket.com

# veya PowerShell ile
Resolve-DnsName -Name "webserver01.internal.sirket.com" `
    -Server "192.168.20.1" `
    -Type A

İzleme ve Raporlama

Günlük operasyonda DNS sağlığını takip etmek için birkaç şeyi düzenli kontrol etmenizi öneririm.

# Tüm zone'ları ve durumlarını raporla
Get-DnsServerZone | 
    Select-Object ZoneName, ZoneType, IsDsIntegrated, DynamicUpdate, IsAutoCreated |
    Sort-Object ZoneName |
    Format-Table -AutoSize

# DNS sorgu istatistiklerini al
Get-DnsServerStatistics | Select-Object -ExpandProperty Query

# Stale kayıt sayısını kontrol et (scavenging öncesi)
$zone = "internal.sirket.com"
$staleDate = (Get-Date).AddDays(-14)
Get-DnsServerResourceRecord -ZoneName $zone -RRType A | 
    Where-Object {$_.TimeStamp -lt $staleDate -and $_.TimeStamp -ne [DateTime]::MinValue} |
    Measure-Object | 
    Select-Object Count

DNS debug log’lamasını da aktif etmek isteyebilirsiniz, özellikle sorun araştırması sırasında. Ama production’da sürekli açık bırakmayın, disk I/O’yu ciddi etkiler.

# DNS debug logging aç (sorun araştırması için)
Set-DnsServerDiagnostics -All $true

# Sorun çözüldükten sonra kapat
Set-DnsServerDiagnostics -All $false

Sonuç

AD Integrated DNS, sadece bir DNS çözümü değil; Active Directory altyapısının temel taşlarından biri. Doğru kurulup yapılandırıldığında yıllarca sorunsuz çalışır. Ama ihmal edildiğinde, authentication sorunlarından grup policy uygulama hatalarına kadar geniş bir yelpazede problem kaynağı haline gelir.

Özetlemek gerekirse dikkat etmeniz gereken ana noktalar şunlar: Replikasyon scope’unu ortamınıza göre seçin, her zaman secure dynamic update kullanın, scavenging’i mutlaka aktif edin ama değerlerini doğru ayarlayın, conditional forwarder’ları akıllıca kullanın ve DNS sağlığını düzenli monitör edin.

Bu yazıda ele aldığım senaryoların büyük çoğunluğu gerçek müşteri ortamlarından derlendi. Her ortam farklı olduğundan, buradaki komutları kendi test ortamınızda denedikten sonra production’a almayı unutmayın.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir