Windows DNS’te Primary ve Secondary Zone Oluşturma

Kurumsal ortamlarda DNS yönetimi, küçük bir yanlış adımın saatler süren kesintilere yol açabileceği hassas bir alan. Windows Server ortamlarında DNS zone yapılandırması da bu hassasiyetin tam ortasında duruyor. Yıllar içinde farklı ölçeklerde kurumların DNS altyapısını kurarken edindiğim deneyimlere göre, en sık karşılaşılan sorunların büyük çoğunluğu yanlış zone türü seçiminden ya da secondary zone’ların düzgün yapılandırılmamasından kaynaklanıyor. Bu yazıda primary ve secondary zone’ların ne olduğunu, nasıl oluşturulduğunu ve production ortamda dikkat etmeniz gereken kritik noktaları ele alacağım.

DNS Zone Türlerini Anlamak

Windows DNS Server, birkaç farklı zone türünü destekler ama günlük operasyonlarda en çok karşılaşacağınız ikisi primary ve secondary zone’lar. Bunlara ek olarak stub zone ve Active Directory-integrated zone da var, ama önce temeli sağlam atalım.

Primary Zone, bir DNS bölgesinin yetkili kaynağıdır. Zone dosyası bu sunucuda tutulur, değişiklikler burada yapılır. Küçük ortamlarda tek bir primary zone yeterli gelebilir ama bu hem tek nokta arızası riski hem de coğrafi olarak dağılmış kullanıcılar için performans sorunu demek.

Secondary Zone ise primary zone’un salt okunur bir kopyasıdır. Zone Transfer (AXFR/IXFR) mekanizmasıyla primary’den veri alır, değişiklik yapılamaz. Yedeklilik sağlar, yükü dağıtır ve farklı lokasyonlardaki istemcilerin yerel DNS sunucusunu sorgulamasına olanak tanır.

Şimdi bu zone’ları nasıl oluşturacağımıza bakalım.

Ortam Gereksinimleri

Başlamadan önce şu senaryoyu netleştirelim: İki Windows Server 2019/2022 sunucumuz var.

  • NS1.sirket.local (192.168.1.10) – Primary DNS Sunucusu
  • NS2.sirket.local (192.168.1.20) – Secondary DNS Sunucusu

Her iki sunucuda da DNS Server rolü kurulu olmalı. Kurulu değilse PowerShell ile hızlıca ekleyebilirsiniz:

# Her iki sunucuda da çalıştırın
Install-WindowsFeature -Name DNS -IncludeManagementTools

# Kurulumu doğrulayın
Get-WindowsFeature -Name DNS

Primary Zone Oluşturma

PowerShell ile Primary Zone

Grafiksel arayüz güzel ama production ortamda her şeyi betikleştirmek uzun vadede hayat kurtarır. İşte primary zone oluşturmanın PowerShell yolu:

# Primary zone oluştur
Add-DnsServerPrimaryZone -Name "sirket.local" `
    -ZoneFile "sirket.local.dns" `
    -DynamicUpdate None

# Zone'u doğrula
Get-DnsServerZone -Name "sirket.local"

Zone oluşturduktan sonra temel kayıtları ekleyelim. Boş bir zone pek işe yaramaz:

# A kaydı ekle
Add-DnsServerResourceRecordA -ZoneName "sirket.local" `
    -Name "webserver" `
    -IPv4Address "192.168.1.50" `
    -TimeToLive 01:00:00

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

# CNAME ekle
Add-DnsServerResourceRecordCName -ZoneName "sirket.local" `
    -Name "www" `
    -HostNameAlias "webserver.sirket.local."

# Tüm kayıtları listele
Get-DnsServerResourceRecord -ZoneName "sirket.local"

DNS Manager GUI ile Primary Zone

Komut satırı sevmeyenler için GUI yolu da mevcut. DNS Manager’ı açtığınızda (dnsmgmt.msc), sol panelde sunucu adına sağ tıklayıp “New Zone” deyin. Zone Type ekranında “Primary zone” seçin, Active Directory ortamındaysanız “Store the zone in Active Directory” seçeneğini de göreceksiniz, ama biz şimdilik file-based devam ediyoruz.

Zone adını girin, dynamic update ayarını seçin (güvenlik açısından “Allow only secure dynamic updates” önerilir, domain ortamında) ve bitirin.

SOA ve NS Kayıtlarını Yapılandırma

Primary zone oluşturulduğunda otomatik SOA ve NS kayıtları eklenir ama bunları production değerlerinize göre güncellemeniz gerekir. SOA (Start of Authority) kaydı özellikle zone transfer zamanlaması açısından kritik:

# SOA kaydını güncelle
Set-DnsServerResourceRecord -ZoneName "sirket.local" `
    -OldInputObject (Get-DnsServerResourceRecord -ZoneName "sirket.local" -RRType SOA) `
    -NewInputObject (
        $soa = Get-DnsServerResourceRecord -ZoneName "sirket.local" -RRType SOA
        $soa.RecordData.RefreshInterval = [System.TimeSpan]::FromMinutes(15)
        $soa.RecordData.RetryDelay = [System.TimeSpan]::FromMinutes(10)
        $soa.RecordData.ExpireLimit = [System.TimeSpan]::FromDays(1)
        $soa.RecordData.MinimumTimeToLive = [System.TimeSpan]::FromMinutes(10)
        $soa
    )

# Güncel SOA bilgisini kontrol et
Get-DnsServerResourceRecord -ZoneName "sirket.local" -RRType SOA | Select-Object -ExpandProperty RecordData

Buradaki değerlerin ne anlama geldiğini bilmek önemli:

  • RefreshInterval: Secondary’nin SOA sorgulayıp değişiklik olup olmadığını kontrol etme sıklığı
  • RetryDelay: Primary’e ulaşılamazsa ne kadar süre sonra tekrar denenecek
  • ExpireLimit: Primary’ye bu süre boyunca ulaşılamazsa secondary zone’u expire olarak işaretler
  • MinimumTimeToLive: Negatif yanıtlar (NXDOMAIN) için TTL

Zone Transfer İzinlerini Yapılandırma

Bu adım çok kritik ve sıkça atlanıyor. Primary zone’u oluşturdunuz, güzel. Ama secondary’nin bu zone’u transfer edebilmesi için primary tarafında açıkça izin vermeniz gerekiyor.

# Belirli IP adreslerine zone transfer izni ver
Set-DnsServerPrimaryZone -Name "sirket.local" `
    -SecureSecondaries TransferToSecureServers `
    -SecondaryServers "192.168.1.20"

# Notify ayarını yapılandır - primary değişince secondary'yi bilgilendir
Set-DnsServerPrimaryZone -Name "sirket.local" `
    -Notify NotifyServers `
    -NotifyServers "192.168.1.20"

# Ayarları doğrula
Get-DnsServerPrimaryZone -Name "sirket.local" | `
    Select-Object ZoneName, SecureSecondaries, SecondaryServers, Notify, NotifyServers

Güvenlik açısından “Transfer to any server” seçeneğinden kaçının. Bu ayar, yetkisiz sunucuların tüm zone verinizi çekmesine olanak tanır. Zone verisi küçümsenmemeli; tüm sunucu adlarını, IP adreslerini ve yapınızı bir saldırgana servis ediyor olabilirsiniz.

Secondary Zone Oluşturma

Şimdi NS2 sunucusuna geçiyoruz. Secondary zone oluştururken primary sunucunun IP adresini ve zone adını belirtiyoruz:

# NS2 sunucusunda çalıştırın
Add-DnsServerSecondaryZone -Name "sirket.local" `
    -ZoneFile "sirket.local.dns" `
    -MasterServers "192.168.1.10"

# Zone durumunu kontrol et
Get-DnsServerZone -Name "sirket.local"

Zone oluşturulduktan hemen sonra “Zone not loaded” görülebilir, bu normal. Zone transfer başlayana kadar bekleyin ya da manual transfer tetikleyin:

# Manuel zone transfer başlat
Start-DnsServerZoneTransfer -Name "sirket.local" -FullTransfer

# Transfer sonucunu izle
Get-DnsServerZone -Name "sirket.local" | Select-Object ZoneName, ZoneType, LastSuccessfulSoaCheck, LastSuccessfulXfr

Birden Fazla Primary Sunucu Tanımlama

Büyük ortamlarda primary sunucu çöktüğünde secondary’nin başka bir kaynaktan beslenebilmesi için birden fazla master tanımlayabilirsiniz:

# Birden fazla master sunucu tanımla
Add-DnsServerSecondaryZone -Name "sirket.local" `
    -ZoneFile "sirket.local.dns" `
    -MasterServers "192.168.1.10", "192.168.1.11"

# Mevcut secondary zone'a yeni master ekle
Set-DnsServerSecondaryZone -Name "sirket.local" `
    -MasterServers "192.168.1.10", "192.168.1.11"

Reverse Lookup Zone’ları

Forward zone’ları hallettik ama DNS altyapısı reverse lookup zone olmadan eksik kalır. Özellikle log analizi, güvenlik olayı incelemesi ve bazı servislerin çalışması için PTR kayıtları şart:

# Primary'de reverse lookup zone oluştur (192.168.1.x ağı için)
Add-DnsServerPrimaryZone -NetworkId "192.168.1.0/24" `
    -ZoneFile "1.168.192.in-addr.arpa.dns" `
    -DynamicUpdate None

# PTR kaydı ekle
Add-DnsServerResourceRecordPtr -ZoneName "1.168.192.in-addr.arpa" `
    -Name "50" `
    -PtrDomainName "webserver.sirket.local."

# Secondary'de reverse zone'u da transfer et
# NS2 sunucusunda:
Add-DnsServerSecondaryZone -Name "1.168.192.in-addr.arpa" `
    -ZoneFile "1.168.192.in-addr.arpa.dns" `
    -MasterServers "192.168.1.10"

Yapılandırmayı Test Etme

Zone’lar hazır, şimdi her şeyin düzgün çalıştığını doğrulayalım. Test aşamasını atlamak en sık yapılan hatalardan biri:

# nslookup ile temel sorgu testi
# Hem NS1 hem NS2'ye sorgula
nslookup webserver.sirket.local 192.168.1.10
nslookup webserver.sirket.local 192.168.1.20

# Resolve-DnsName ile PowerShell testi
Resolve-DnsName -Name "webserver.sirket.local" -Server "192.168.1.10" -Type A
Resolve-DnsName -Name "webserver.sirket.local" -Server "192.168.1.20" -Type A

# Reverse lookup testi
Resolve-DnsName -Name "192.168.1.50" -Server "192.168.1.10" -Type PTR

# Zone transfer'in çalıştığını doğrula
# NS2'den AXFR isteği simüle et (test amaçlı)
nslookup
> server 192.168.1.20
> set type=SOA
> sirket.local

Zone transfer’i daha detaylı test etmek için event log’a bakabilirsiniz:

# DNS event log'larını incele
Get-WinEvent -LogName "DNS Server" -MaxEvents 50 | `
    Where-Object {$_.Id -in @(6001, 6002, 6004)} | `
    Select-Object TimeCreated, Id, Message | `
    Format-List

Event ID 6001 zone yüklendiğinde, 6002 zone güncellendiğinde, 6004 zone transfer hatası olduğunda tetiklenir.

Yaygın Sorunlar ve Çözümleri

Zone Transfer Başarısız

En sık karşılaştığım sorun bu. Birkaç olası neden var:

Önce firewall kurallarını kontrol edin. DNS zone transfer TCP 53 kullanır (UDP değil). Windows Firewall’da bu porta izin verilmediği sürece AXFR başarısız olur:

# NS1'de firewall kuralını kontrol et
Get-NetFirewallRule -DisplayGroup "DNS Service" | `
    Select-Object DisplayName, Enabled, Direction, Action

# Gerekirse TCP 53'e izin ver
New-NetFirewallRule -DisplayName "DNS Zone Transfer" `
    -Direction Inbound `
    -Protocol TCP `
    -LocalPort 53 `
    -Action Allow `
    -RemoteAddress "192.168.1.20"

Sonra zone transfer izinlerini doğrulayın. “Only to servers listed on the Name Servers tab” seçeneği seçiliyse NS kaydı eklemeniz gerekir:

# NS kaydını ekle
Add-DnsServerResourceRecord -ZoneName "sirket.local" `
    -NS `
    -Name "@" `
    -NameServer "ns2.sirket.local."

Secondary Zone “Expired” Durumunda

ExpireLimit değerini aşan secondary zone, istemcilere yanıt vermeyi durdurur. Bu kritik bir durum. Önce primary ile bağlantıyı kontrol edin, ardından zone’u yeniden yükleyin:

# Zone'u yeniden yükle
Stop-DnsServerZone -Name "sirket.local"
Start-DnsServerZoneTransfer -Name "sirket.local" -FullTransfer

# Veya zone'u sıfırla
Unregister-DnsServerZone -Name "sirket.local"
Add-DnsServerSecondaryZone -Name "sirket.local" `
    -ZoneFile "sirket.local.dns" `
    -MasterServers "192.168.1.10"

Active Directory Entegrasyonu Hakkında Bir Not

Eğer Active Directory ortamındaysanız ve domain controller’larınız DNS çalıştırıyorsa, “Primary zone” yerine “AD-integrated zone” kullanmanızı şiddetle öneririm. AD-integrated zone, zone verisini Active Directory replikasyonuyla taşır, tüm DC’ler aynı anda yazılabilir kopya tutar ve zone transfer’e gerek kalmaz. File-based primary/secondary yalnızca standalone DNS sunucularda ya da non-DC Windows DNS kurulumlarında kullanılır.

# Mevcut file-based primary zone'u AD-integrated'a dönüştür
ConvertTo-DnsServerPrimaryZone -Name "sirket.local" `
    -ReplicationScope "Domain" `
    -PassThru

# AD-integrated zone durumunu kontrol et
Get-DnsServerZone -Name "sirket.local" | `
    Select-Object ZoneName, ZoneType, IsDsIntegrated, ReplicationScope

Otomasyon: Zone’ları Toplu Oluşturma

Büyük ortamlarda onlarca zone yönetiyorsanız, tek tek oluşturmak yerine bir betik hazırlamak mantıklı. İşte basit bir örnek:

# Zones.csv dosyasından toplu zone oluşturma
# CSV formatı: ZoneName,MasterServer
$zones = Import-Csv -Path "C:DNSzones.csv"

foreach ($zone in $zones) {
    try {
        # Primary sunucuda
        Add-DnsServerPrimaryZone -Name $zone.ZoneName `
            -ZoneFile "$($zone.ZoneName).dns" `
            -DynamicUpdate None `
            -ErrorAction Stop
        
        Set-DnsServerPrimaryZone -Name $zone.ZoneName `
            -SecureSecondaries TransferToSecureServers `
            -SecondaryServers "192.168.1.20" `
            -Notify NotifyServers `
            -NotifyServers "192.168.1.20"
        
        Write-Host "Zone oluşturuldu: $($zone.ZoneName)" -ForegroundColor Green
    }
    catch {
        Write-Host "Hata - $($zone.ZoneName): $_" -ForegroundColor Red
    }
}

Sonuç

Windows DNS’te primary ve secondary zone yapılandırması ilk bakışta basit görünse de production ortamda sağlam bir altyapı kurmak birkaç kritik noktayı doğru yapmayı gerektiriyor. Zone transfer izinlerini kısıtlı tutun, SOA değerlerini ortamınıza göre ayarlayın, reverse lookup zone’ları ihmal etmeyin ve her değişiklikten sonra test yapın.

Eğer Active Directory kullanıyorsanız AD-integrated zone’ları tercih edin; zone transfer karmaşasından kurtulursunuz. Standalone ortamlar ya da çoklu orman senaryoları için ise file-based primary/secondary çifti hala geçerliliğini koruyan bir yaklaşım.

DNS altyapısı iyi çalışırken fark edilmez, bozulduğunda ise herkesin gözü sysadmin’in üzerinde olur. Bu yüzden baştan doğru kurun, düzenli test edin ve yapılandırmanızı belgeleyin.

Bir yanıt yazın

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