Windows DNS ile Active Directory Entegrasyonu

Active Directory ortamlarında DNS’i yanlış yapılandırmak, gecenin ikisinde sizi telefonun başına götüren türden sorunlara yol açar. Bunu bir kez yaşayan sysadmin, bir daha aynı hatayı yapmaz. Bu yazıda Windows DNS ile AD entegrasyonunun nasıl düzgün kurulacağını, nelere dikkat edilmesi gerektiğini ve sahadan edinilmiş pratik notları paylaşacağım.

Active Directory ve DNS İlişkisi Neden Bu Kadar Kritik?

AD ortamı için DNS sadece bir isim çözümleme servisi değil, altyapının iskeletidir. Domain Controller’lar birbirini bulmak için DNS’e bakar. Kerberos authentication DNS’e bağımlıdır. GPO uygulaması DNS olmadan çalışmaz. Bir DC’nin DNS kaydı bozulduğunda veya eksik olduğunda, kullanıcılar oturum açamaz, yazıcılar çalışmaz, uygulamalar kimlik doğrulayamaz.

AD-entegre DNS’in temel mantığı şudur: DNS zone verileri Active Directory veritabanında saklanır ve AD replikasyon mekanizmasıyla tüm DC’lere dağıtılır. Bu, geleneksel “primary/secondary” DNS modelinden çok daha sağlam ve yönetimi kolay bir yapı sunar.

AD-Entegre DNS’in Avantajları

Geleneksel DNS mimarisinde zone transferi için ayrı konfigürasyon gerekir, single point of failure riski vardır ve güvenlik açıkları daha kolay ortaya çıkar. AD-entegre DNS ile:

  • Çok-master replikasyon: Her DC aynı anda DNS güncellemesi kabul edebilir.
  • Güvenli dinamik güncelleme: Sadece yetkili makineler kendi kayıtlarını güncelleyebilir.
  • Otomatik replikasyon: Zone transfer konfigürasyonu gerekmez, AD kendi replikasyonunu kullanır.
  • Granüler replikasyon kapsamı: Forest geneli, domain geneli veya belirli DC setleri için ayrı ayrı ayarlanabilir.
  • Scavenging entegrasyonu: Eski kayıtlar otomatik temizlenebilir.

Kurulum Öncesi Kontroller

DNS kurulumuna geçmeden önce birkaç temel kontrolü yapmanız gerekiyor. Bu adımları atlamak, ileride saatlerce uğraşmanıza neden olabilir.

# Domain Controller rolü yüklenmiş mi kontrol et
Get-WindowsFeature -Name AD-Domain-Services, DNS

# Mevcut DNS sunucu ayarlarını kontrol et
Get-DnsClientServerAddress -InterfaceAlias "Ethernet*"

# NetLogon servisinin çalıştığını doğrula
Get-Service -Name Netlogon | Select-Object Status, StartType

# Mevcut SRV kayıtlarını listele
Resolve-DnsName -Name _ldap._tcp.dc._msdcs.sirket.local -Type SRV

Bu komutları çalıştırdığınızda SRV kayıtları dönüyorsa DNS AD’yi zaten biliyor demektir. Eğer hata alıyorsanız ya kurulum eksik ya da kayıtlar henüz oluşturulmamış.

DNS Rolünü Yükleme ve AD ile Entegre Etme

Yeni bir ortam kuruyorsanız, DNS rolü genellikle AD DS rolüyle birlikte yüklenir. Ama bunu ayrı ayrı da yapabilirsiniz.

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

# Eğer AD DS de yüklü değilse ikisini birden yükle
Install-WindowsFeature -Name AD-Domain-Services, DNS -IncludeManagementTools

# AD DS'yi yapılandır ve yeni domain oluştur
Install-ADDSForest `
    -DomainName "sirket.local" `
    -DomainNetbiosName "SIRKET" `
    -InstallDns:$true `
    -SafeModeAdministratorPassword (ConvertTo-SecureString "P@ssw0rd123!" -AsPlainText -Force) `
    -Force:$true

Burada -InstallDns:$true parametresi kritik. Bu parametre olmadan DNS rolü yüklenir ama zone’lar oluşturulmaz ve AD entegrasyonu yapılmaz.

Mevcut DNS Zone’larını AD-Entegre Hale Getirme

Eğer elinizde standart primary zone olarak çalışan bir DNS varsa ve bunu AD-entegre hale getirmek istiyorsanız, bu işlemi canlı ortamda da yapabilirsiniz.

# Mevcut zone'ların replikasyon tipini kontrol et
Get-DnsServerZone | Select-Object ZoneName, ZoneType, IsDsIntegrated, ReplicationScope

# Standard primary zone'u AD-entegre hale getir
ConvertTo-DnsServerPrimaryZone `
    -Name "sirket.local" `
    -ReplicationScope "Domain" `
    -PassThru

# Forest geneli replikasyon için
ConvertTo-DnsServerPrimaryZone `
    -Name "sirket.local" `
    -ReplicationScope "Forest" `
    -PassThru

ReplicationScope parametresi önemli. Domain seçerseniz sadece o domaindeki DC’ler bu zone’u görür. Forest seçerseniz tüm forest’taki DC’ler görür. Çok domainli ortamlarda genellikle Forest tercih edilir ama bu aynı zamanda daha fazla replikasyon trafiği anlamına gelir.

SRV Kayıtlarının Doğrulanması

AD’nin DNS’e kaydettiği SRV kayıtları, client’ların doğru DC’yi bulmasını sağlar. Bu kayıtları düzenli olarak kontrol etmek iyi bir alışkanlıktır.

# Tüm kritik SRV kayıtlarını tek komutla test et
$domain = "sirket.local"
$srvRecords = @(
    "_ldap._tcp.dc._msdcs.$domain",
    "_kerberos._tcp.dc._msdcs.$domain",
    "_gc._tcp.$domain",
    "_ldap._tcp.$domain"
)

foreach ($record in $srvRecords) {
    Write-Host "Test: $record" -ForegroundColor Cyan
    try {
        $result = Resolve-DnsName -Name $record -Type SRV -ErrorAction Stop
        $result | ForEach-Object {
            Write-Host "  -> $($_.NameTarget):$($_.Port)" -ForegroundColor Green
        }
    } catch {
        Write-Host "  HATA: Kayit bulunamadi!" -ForegroundColor Red
    }
}

Bu betiği çalıştırdığınızda her SRV kaydının hangi DC’ye işaret ettiğini görürsünüz. Eğer bir kayıt eksikse, ilgili DC’de nltest /dsregdns komutuyla kayıtların yeniden oluşturulmasını tetikleyebilirsiniz.

Dinamik Güncelleme Ayarları

AD-entegre zone’larda dinamik güncelleme ayarı önemlidir. “None”, “Nonsecure and Secure” ve “Secure only” olmak üç seçenek vardır.

Production ortamlar için her zaman “Secure only” kullanmalısınız. Aksi takdirde ağınıza bağlanan her cihaz DNS kaydı oluşturabilir, bu da kayıt kirliliğine ve potansiyel güvenlik sorunlarına yol açar.

# Zone'un dinamik güncelleme ayarını kontrol et
Get-DnsServerZone -Name "sirket.local" | Select-Object DynamicUpdate

# Sadece secure dynamic update'e al
Set-DnsServerPrimaryZone -Name "sirket.local" -DynamicUpdate Secure

# Reverse lookup zone için de aynısını yap
Set-DnsServerPrimaryZone -Name "10.168.192.in-addr.arpa" -DynamicUpdate Secure

Dikkat: “Nonsecure and Secure” seçeneği sadece geçiş dönemlerinde, eski DHCP sunucularının kayıt oluşturması gerektiğinde geçici olarak kullanılabilir. İşiniz bitince hemen “Secure only”ye döndürün.

Scavenging Yapılandırması

Scavenging, eski ve atıl DNS kayıtlarını otomatik temizleyen mekanizmadır. Kurumsal ortamlarda bu özelliği açık tutmazsanız, zamanla yüzlerce geçersiz kayıt birikir.

# DNS sunucusunda scavenging'i etkinleştir
Set-DnsServerScavenging `
    -ScavengingState $true `
    -ScavengingInterval 7.00:00:00 `
    -ApplyOnAllZones

# Belirli zone için scavenging parametrelerini ayarla
Set-DnsServerZoneAging `
    -Name "sirket.local" `
    -Aging $true `
    -NoRefreshInterval 7.00:00:00 `
    -RefreshInterval 7.00:00:00

# Scavenging durumunu kontrol et
Get-DnsServerZoneAging -Name "sirket.local"

Burada NoRefreshInterval ve RefreshInterval değerlerine dikkat edin. NoRefreshInterval boyunca kayıt yenilenmez ama silinmez. RefreshInterval boyunca kayıt yenilenebilir. İkisi toplamı kadar gün geçtikten sonra kayıt silinmeye aday olur. Yani 7+7=14 gün aktif olmayan kayıtlar temizlenir.

Scavenging’i açmadan önce mevcut kayıtlara timestamp atayı unutmayın, yoksa tüm statik kayıtlarınız da silinebilir. Statik kayıtlara timestamp atanmaz, sadece dinamik olanlar etkilenir. Ama yine de ilk kez açarken test ortamında deneyin.

Conditional Forwarder Yapılandırması

Şirketinizde birden fazla domain varsa veya iş ortaklarıyla DNS çözümlemesi yapmanız gerekiyorsa, conditional forwarder kullanırsınız.

# Conditional forwarder ekle
Add-DnsServerConditionalForwarderZone `
    -Name "ortakfirma.com" `
    -MasterServers "10.20.30.4", "10.20.30.5" `
    -ReplicationScope "Forest" `
    -PassThru

# Mevcut forwarder'ları listele
Get-DnsServerZone | Where-Object { $_.ZoneType -eq "Forwarder" } |
    Select-Object ZoneName, MasterServers

# Genel DNS forwarder ekle (8.8.8.8 gibi public DNS)
Set-DnsServerForwarder -IPAddress "8.8.8.8", "8.8.4.4" -UseRootHint $false

-ReplicationScope "Forest" ile conditional forwarder’ı tüm forest’a dağıtırsanız, her DC ayrı ayrı konfigüre etmeniz gerekmez. Bu özellikle büyük ortamlarda büyük zaman tasarrufu sağlar.

Replikasyon Sorunlarını Tespit Etme

AD replikasyonu sorunlu olduğunda DNS de etkilenir. Replikasyon sağlığını düzenli kontrol etmek bu yüzden DNS yönetiminin parçasıdır.

# AD replikasyon durumunu kontrol et
repadmin /replsummary

# DNS kayıtlarının tüm DC'lerde tutarlı olup olmadığını kontrol et
$dcs = (Get-ADDomainController -Filter *).HostName
$testRecord = "sirket.local"

foreach ($dc in $dcs) {
    Write-Host "`nDC: $dc" -ForegroundColor Yellow
    try {
        $result = Resolve-DnsName -Name $testRecord -Server $dc -Type SOA
        Write-Host "SOA: $($result.PrimaryServer)" -ForegroundColor Green
        Write-Host "Serial: $($result.SerialNumber)" -ForegroundColor Green
    } catch {
        Write-Host "HATA: $($_.Exception.Message)" -ForegroundColor Red
    }
}

SOA serial numaraları tüm DC’lerde aynı olmalıdır. Farklıysa replikasyon gecikmesi veya sorunu var demektir. Bu durumda repadmin /syncall /AdeP ile replikasyonu manuel tetikleyebilirsiniz.

Güvenlik Açısından DNS Ayarları

DNS güvenliği genellikle ihmal edilen bir konudur. Birkaç temel önlem almak zorunludur.

# DNS sunucusunun sadece yetkili network'lerden sorgu kabul etmesini sağla
Set-DnsServerRecursion -SecureResponse $true

# Zone transfer'ı kısıtla (AD-entegre zone'larda bu zaten varsayılan olarak kapalı)
Set-DnsServerPrimaryZone `
    -Name "sirket.local" `
    -SecureSecondaries NoTransfer `
    -Notify None

# DNS cache poisoning'e karşı socket pool boyutunu artır
Set-ItemProperty `
    -Path "HKLM:SYSTEMCurrentControlSetServicesDNSParameters" `
    -Name "SocketPoolSize" `
    -Value 10000 `
    -Type DWord

# DNS debug logging'i etkinleştir (sorun giderme için)
Set-DnsServerDiagnostics `
    -Queries $true `
    -Answers $true `
    -Errors $true `
    -LogFilePath "C:WindowsSystem32dnsdns.log" `
    -MaxMBFileSize 100

DNS cache poisoning gerçek bir tehdit. SocketPoolSize değerini yüksek tutmak, saldırganların rastgele port tahmin ederek önbelleği zehirlemesini zorlaştırır. Varsayılan değer 2500’dür, 10000 yapmanız önerilir.

Gerçek Dünya Senaryosu: DC Migrasyonu Sırasında DNS

Eski bir DC’yi devreden çıkartırken DNS kayıtlarını doğru temizlememek, ortamınızı haftalarca hasta bırakabilir. Bu konuda edindiğim tecrübeyi paylaşayım.

Eski DC’yi kapatmadan önce şu adımları takip edin:

  • FSMO rollerini taşı: Move-ADDirectoryServerOperationMasterRole ile FSMO rollerini yeni DC’ye al.
  • DNS kayıtlarını temizle: Eski DC’nin A, SRV ve NS kayıtlarını elle sil veya scavenging yapmasını bekle.
  • NetLogon kayıtlarını kontrol et: Eski DC’nin _msdcs altındaki GUID kaydını temizle.
  • DHCP ayarlarını güncelle: DHCP sunucusunun dağıttığı DNS sunucu adresi hala eski DC’yi gösteriyorsa tüm client’lar problem yaşar.
# Eski DC'nin DNS kayıtlarını temizle
$oldDC = "eski-dc01.sirket.local"
$oldDCIP = "192.168.10.5"

# A kaydını sil
Remove-DnsServerResourceRecord `
    -ZoneName "sirket.local" `
    -Name "eski-dc01" `
    -RRType A `
    -RecordData $oldDCIP `
    -Force

# NS kaydını kontrol et ve varsa sil
Get-DnsServerResourceRecord -ZoneName "sirket.local" -RRType NS |
    Where-Object { $_.RecordData.NameServer -like "*eski-dc01*" } |
    Remove-DnsServerResourceRecord -ZoneName "sirket.local" -Force

Monitoring ve Proaktif Yönetim

DNS sorunlarını kullanıcılar sizi aramadan önce yakalamanın en iyi yolu basit bir monitoring betiğidir.

# DNS sağlık kontrol betiği
function Test-ADDnsHealth {
    param(
        [string]$Domain = $env:USERDNSDOMAIN
    )

    $errors = @()
    $dcs = (Get-ADDomainController -Filter *).HostName

    foreach ($dc in $dcs) {
        # SOA sorgusu yap
        $soa = Resolve-DnsName -Name $Domain -Type SOA -Server $dc -ErrorAction SilentlyContinue
        if (-not $soa) {
            $errors += "$dc : SOA sorgusu basarisiz"
        }

        # NetLogon SRV kaydını kontrol et
        $srv = Resolve-DnsName -Name "_ldap._tcp.dc._msdcs.$Domain" -Type SRV -Server $dc -ErrorAction SilentlyContinue
        if (-not $srv) {
            $errors += "$dc : SRV kaydi bulunamadi"
        }

        # DC'nin kendi A kaydını kontrol et
        $aRecord = Resolve-DnsName -Name $dc -Type A -Server $dc -ErrorAction SilentlyContinue
        if (-not $aRecord) {
            $errors += "$dc : Kendi A kaydi bulunamadi"
        }
    }

    if ($errors.Count -eq 0) {
        Write-Host "Tum DNS kontrolleri basarili." -ForegroundColor Green
    } else {
        $errors | ForEach-Object { Write-Host "UYARI: $_" -ForegroundColor Red }
    }
}

Test-ADDnsHealth -Domain "sirket.local"

Bu betiği Task Scheduler ile saatlik çalıştırın ve çıktıyı e-posta ile gönderin. Basit ama etkili bir erken uyarı sistemi elde etmiş olursunuz.

Sık Karşılaşılan Hatalar ve Çözümleri

DNS kaydı oluşturulmuyor: İstemci makinenin DNS suffix ayarını kontrol edin. ipconfig /registerdns komutu kaydı manuel oluşturur ama kalıcı çözüm için DHCP üzerinden doğru DNS suffix dağıtılması gerekir.

Replikasyon çakışmaları: İki DC aynı anda farklı değer kaydederse AD çakışmayı timestamp’e göre çözer. repadmin /showrepl ile hangi objenin çakışma yarattığını görebilirsiniz.

SRV kayıtları eksik: DC’de net stop netlogon && net start netlogon komutu kayıtları yeniden oluşturur. Bu işlem servisi kısa süreliğine durdurur, iş saatlerinde dikkatli uygulayın.

Eski kayıtlar temizlenmiyor: Scavenging açık olsa bile bazı kayıtlar silinmez çünkü timestamp’leri yoktur. Bu kayıtları dnscmd /ageallrecords ile timestamp’lendirin, sonra scavenging devreye girsin.

Sonuç

Windows DNS ile Active Directory entegrasyonu, doğru yapılandırıldığında neredeyse bakımsız çalışan bir sistemdir. Ama yanlış adımlardan herhangi birini atlarsanız, ortamınız kademeli olarak bozulmaya başlar ve sorunun kaynağını bulmak zorlaşır.

En önemli noktalara bakacak olursak: Zone’larınızı mutlaka AD-entegre yapın, dinamik güncellemeyi “Secure only” modunda bırakın, scavenging’i yapılandırın ama önce test edin, ve replikasyon sağlığını DNS sağlığından ayrı düşünmeyin.

Bir DNS sorunuyla karşılaştığınızda paniklemeden önce şu üç şeyi kontrol edin: SRV kayıtları var mı, replikasyon sağlıklı mı, scavenging yanlışlıkla aktif bir kaydı silmiş mi? Vakaların büyük çoğunluğu bu üç kontrolden birinde netlik kazanır.

DNS sorunları gecenin ikisinde sizi uyandırmasın diye bu yapılandırmaları bugün gözden geçirin.

Bir yanıt yazın

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