Windows DNS’te A, AAAA, MX, CNAME ve TXT Kayıt Yönetimi

Yıllar içinde onlarca Windows DNS kurulumu yaptım ve şunu fark ettim: çoğu sistem yöneticisi DNS kaydı oluşturmayı biliyor, ama yönetmeyi bilmiyor. Kayıt eklemek ayrı bir şey, o kayıtların tutarlı, düzenli ve hatasız çalışmasını sağlamak bambaşka bir iş. Bu yazıda Windows DNS Server üzerinde A, AAAA, MX, CNAME ve TXT kayıtlarını hem GUI hem PowerShell ile nasıl yönettiğimizi, hangi durumlarda hangi yöntemi tercih ettiğimizi ve gerçek ortamlarda karşılaştığım senaryoları paylaşacağım.

DNS Kaydı Türlerini Doğru Anlamak

Teorik tanımları geçelim, işin pratiğine bakalım. Windows DNS’te yanlış kayıt türü seçimi ciddi sorunlara yol açabiliyor. Bir keresinde bir müşteri ortamında web sunucusu için CNAME yerine A kaydı kullanılmış, IP değiştiğinde 47 farklı kayıt tek tek güncellenmek zorunda kalınmıştı. Bu tür acıları yaşamamak için her kayıt türünün ne zaman kullanılacağını netleştirmek gerekiyor.

A Kaydı: IPv4 adresi ile hostname eşleştirmesi. En temel kayıt türü. Doğrudan IP-isim ilişkisi kurmak istediğinizde kullanırsınız.

AAAA Kaydı: IPv6 için A kaydının karşılığı. Dual-stack ortamlarda hem A hem AAAA kaydı tutmak artık neredeyse zorunlu hale geldi.

CNAME Kaydı: Bir hostname’i başka bir hostname’e yönlendirir. IP değil, isim çözümleme. Alias mekanizması olarak düşünün. Ancak önemli bir kural: zone apex’te (örneğin sadece ornek.com) CNAME kullanamazsınız.

MX Kaydı: Mail exchange kaydı. Mail trafiğini yönlendirmek için kullanılır. Öncelik değeri ne kadar düşükse, o sunucu o kadar öncelikli demektir.

TXT Kaydı: Metin tabanlı veri içerir. SPF, DKIM, DMARC, domain doğrulama gibi işler için vazgeçilmez.

PowerShell ile DNS Kaydı Yönetimi

DNS Manager GUI kullanışlı ama ölçeklenebilir değil. 50 kayıt ekleyeceğiniz zaman GUI’ye güvenmeyin. PowerShell’in DnsServer modülü bu işi çok daha verimli yapıyor.

Önce modülün yüklü olduğundan emin olalım:

# DNS Server modülünü kontrol et
Get-Module -ListAvailable -Name DnsServer

# RSAT araçları kurulu değilse Windows Server'da
Install-WindowsFeature -Name RSAT-DNS-Server

# Windows 10/11 workstation'da
Add-WindowsCapability -Online -Name "Rsat.Dns.Tools~~~~0.0.1.0"

A ve AAAA Kaydı Oluşturma

Basit A kaydı eklemek birkaç saniye:

# Tek A kaydı ekleme
Add-DnsServerResourceRecordA `
    -ZoneName "sirket.local" `
    -Name "webserver01" `
    -IPv4Address "192.168.10.50" `
    -TimeToLive 01:00:00 `
    -CreatePtr

# AAAA kaydı ekleme (IPv6)
Add-DnsServerResourceRecordAAAA `
    -ZoneName "sirket.local" `
    -Name "webserver01" `
    -IPv6Address "2001:db8::1" `
    -TimeToLive 01:00:00

-CreatePtr parametresi otomatik olarak reverse zone’da PTR kaydı oluşturur. Bunu yapmayı ihmal etmeyin, PTR eksikliği mail sunucularında ve bazı uygulamalarda ciddi sorun çıkarıyor.

Toplu kayıt ekleme senaryosunu düşünün. Bir proje devralımında karşıma 200’den fazla host kaydının tek tek girilmesi gerektiği bir durum çıktı. CSV’den bulk ekleme şöyle yapılır:

# CSV formatı: Name,IPAddress,Zone
# webserver01,192.168.10.50,sirket.local
# dbserver01,192.168.10.51,sirket.local

$records = Import-Csv -Path "C:dns_records.csv"

foreach ($record in $records) {
    try {
        Add-DnsServerResourceRecordA `
            -ZoneName $record.Zone `
            -Name $record.Name `
            -IPv4Address $record.IPAddress `
            -TimeToLive 01:00:00 `
            -CreatePtr `
            -ErrorAction Stop
        
        Write-Host "Eklendi: $($record.Name) -> $($record.IPAddress)" -ForegroundColor Green
    }
    catch {
        Write-Host "HATA: $($record.Name) - $($_.Exception.Message)" -ForegroundColor Red
    }
}

MX Kaydı Yönetimi

MX kaydları mail akışının kalbi. Yanlış yapılandırma mail trafiğini tamamen durdurabilir. Exchange ortamlarında MX kayıtlarını doğru önceliklerle yapılandırmak kritik:

# Primary MX kaydı (düşük öncelik = yüksek öncelik)
Add-DnsServerResourceRecordMX `
    -ZoneName "sirket.com" `
    -Name "@" `
    -MailExchange "mail01.sirket.com" `
    -Preference 10 `
    -TimeToLive 00:30:00

# Backup MX kaydı
Add-DnsServerResourceRecordMX `
    -ZoneName "sirket.com" `
    -Name "@" `
    -MailExchange "mail02.sirket.com" `
    -Preference 20 `
    -TimeToLive 00:30:00

# Mevcut MX kayıtlarını listele
Get-DnsServerResourceRecord -ZoneName "sirket.com" -RRType MX | 
    Select-Object HostName, @{N="MailExchange";E={$_.RecordData.MailExchange}}, 
    @{N="Preference";E={$_.RecordData.Preference}} | 
    Format-Table -AutoSize

MX kaydı için @ kullanımına dikkat edin. Bu zone apex’i temsil eder, yani sirket.com için mail kaydı anlamına gelir. Subdomain için mail yönlendirmesi yapacaksanız @ yerine subdomain adını yazarsınız.

CNAME Kaydı ve Tuzakları

CNAME kayıtları doğru kullanıldığında hayat kurtarır, yanlış kullanıldığında baş ağrısı kaynağı olur. Birkaç önemli kural:

  • CNAME hedefi başka bir CNAME’e gösterebilir ama bu zinciri uzatmayın, maksimum 2-3 seviye
  • Zone apex’te CNAME kullanmayın (RFC 2181)
  • Bir hostname’de hem CNAME hem başka kayıt türü olamaz
# CNAME kaydı oluşturma
Add-DnsServerResourceRecordCName `
    -ZoneName "sirket.local" `
    -Name "www" `
    -HostNameAlias "webserver01.sirket.local." `
    -TimeToLive 01:00:00

# Birden fazla CNAME oluşturma (load balancer alias'ları gibi senaryolar)
$aliases = @(
    @{Name="app"; Target="appserver01.sirket.local."},
    @{Name="portal"; Target="appserver01.sirket.local."},
    @{Name="intranet"; Target="webserver02.sirket.local."}
)

foreach ($alias in $aliases) {
    Add-DnsServerResourceRecordCName `
        -ZoneName "sirket.local" `
        -Name $alias.Name `
        -HostNameAlias $alias.Target `
        -TimeToLive 01:00:00
    Write-Host "CNAME oluşturuldu: $($alias.Name) -> $($alias.Target)"
}

Hedef hostname sonundaki nokta (.) trailing dot olarak adlandırılır ve FQDN’i belirtir. Windows DNS PowerShell cmdlet’leri bunu otomatik eklemez, siz eklemezseniz zone adı eklenerek hatalı çözümleme yapılabilir. Her zaman trailing dot kullanın.

TXT Kaydı: SPF, DKIM ve Daha Fazlası

TXT kayıtları günümüzde belki de en sık kullanılan kayıt türü. Mail güvenliği, domain doğrulama, Google/Microsoft servis doğrulamaları hepsi TXT kaydı üzerinden yürüyor.

# SPF kaydı ekleme
Add-DnsServerResourceRecord `
    -ZoneName "sirket.com" `
    -Name "@" `
    -Txt `
    -DescriptiveText "v=spf1 mx a include:spf.koruma.net ~all" `
    -TimeToLive 00:30:00

# DMARC kaydı ekleme
Add-DnsServerResourceRecord `
    -ZoneName "sirket.com" `
    -Name "_dmarc" `
    -Txt `
    -DescriptiveText "v=DMARC1; p=quarantine; rua=mailto:[email protected]; pct=100" `
    -TimeToLive 01:00:00

# Domain doğrulama TXT kaydı (Google Workspace, Microsoft 365 gibi)
Add-DnsServerResourceRecord `
    -ZoneName "sirket.com" `
    -Name "@" `
    -Txt `
    -DescriptiveText "MS=ms12345678" `
    -TimeToLive 00:05:00

DKIM kaydı TXT kaydı olarak eklenir ama biraz farklı bir yapısı var. Selector adını bilmeniz gerekiyor:

# DKIM kaydı - selector adı mail sunucunuzdan gelir
$dkimValue = "v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC..."

Add-DnsServerResourceRecord `
    -ZoneName "sirket.com" `
    -Name "selector1._domainkey" `
    -Txt `
    -DescriptiveText $dkimValue `
    -TimeToLive 01:00:00

Kayıt Güncelleme ve Silme İşlemleri

Kayıt güncellemek, eklemekten biraz daha dikkat gerektiriyor. Windows DNS PowerShell’de doğrudan “update” komutu yok, mevcut kaydı alıp modifiye etmek gerekiyor:

# Mevcut A kaydını güncelleme
$zone = "sirket.local"
$hostname = "webserver01"
$newIP = "192.168.10.75"

# Eski kaydı al
$oldRecord = Get-DnsServerResourceRecord -ZoneName $zone -Name $hostname -RRType A

# Yeni kayıt nesnesini hazırla
$newRecord = $oldRecord.Clone()
$newRecord.RecordData.IPv4Address = [System.Net.IPAddress]::Parse($newIP)

# Güncelle
Set-DnsServerResourceRecord `
    -ZoneName $zone `
    -OldInputObject $oldRecord `
    -NewInputObject $newRecord

Write-Host "Kayıt güncellendi: $hostname -> $newIP"

Kayıt silme işlemi daha basit ama dikkatli olmak gerekiyor. Yanlış bir silme işlemi servis kesintisine yol açabilir:

# Belirli bir A kaydını sil
Remove-DnsServerResourceRecord `
    -ZoneName "sirket.local" `
    -Name "eski-sunucu" `
    -RRType A `
    -Force

# Bir hostname'deki tüm kayıtları sil (dikkatli kullanın!)
Remove-DnsServerResourceRecord `
    -ZoneName "sirket.local" `
    -Name "kaldirilan-sunucu" `
    -Force

# Belirli IP adresine sahip A kaydını sil
Get-DnsServerResourceRecord -ZoneName "sirket.local" -RRType A |
    Where-Object {$_.RecordData.IPv4Address -eq "192.168.10.99"} |
    Remove-DnsServerResourceRecord -ZoneName "sirket.local" -Force

Gerçek Dünya Senaryosu: Exchange Ortamı DNS Yapılandırması

Bir müşteri ortamında Exchange Server kurulumu sonrası DNS kayıtlarını tek seferde yapılandırdığım scripti paylaşayım. Bu tür scriptleri her zaman elden geçirin, ortamınıza göre düzenleyin:

# Exchange ortamı için kapsamlı DNS yapılandırması
param(
    [string]$ExternalZone = "sirket.com",
    [string]$InternalZone = "sirket.local",
    [string]$ExchangeServerIP = "192.168.10.20",
    [string]$ExchangeExternalIP = "203.0.113.50"
)

# Internal A kaydı
Add-DnsServerResourceRecordA `
    -ZoneName $InternalZone `
    -Name "mail" `
    -IPv4Address $ExchangeServerIP `
    -TimeToLive 01:00:00

# Autodiscover CNAME (internal)
Add-DnsServerResourceRecordCName `
    -ZoneName $InternalZone `
    -Name "autodiscover" `
    -HostNameAlias "mail.sirket.local." `
    -TimeToLive 01:00:00

# External MX kaydı
Add-DnsServerResourceRecordMX `
    -ZoneName $ExternalZone `
    -Name "@" `
    -MailExchange "mail.$ExternalZone" `
    -Preference 10 `
    -TimeToLive 00:30:00

# External A kaydı (mail sunucusu)
Add-DnsServerResourceRecordA `
    -ZoneName $ExternalZone `
    -Name "mail" `
    -IPv4Address $ExchangeExternalIP `
    -TimeToLive 01:00:00

# SPF kaydı
Add-DnsServerResourceRecord `
    -ZoneName $ExternalZone `
    -Name "@" `
    -Txt `
    -DescriptiveText "v=spf1 mx a:mail.$ExternalZone ~all" `
    -TimeToLive 00:30:00

# Autodiscover SRV kaydı
Add-DnsServerResourceRecord `
    -ZoneName $ExternalZone `
    -Name "_autodiscover._tcp" `
    -Srv `
    -DomainName "mail.$ExternalZone." `
    -Priority 0 `
    -Weight 0 `
    -Port 443 `
    -TimeToLive 01:00:00

Write-Host "Exchange DNS yapılandırması tamamlandı." -ForegroundColor Green

DNS Kaydı Doğrulama ve Sorun Giderme

Kayıt ekledikten sonra doğrulama şart. nslookup ve Resolve-DnsName bu işin araçları:

# PowerShell ile doğrulama
Resolve-DnsName -Name "webserver01.sirket.local" -Type A -Server "192.168.10.10"
Resolve-DnsName -Name "sirket.com" -Type MX -Server "8.8.8.8"
Resolve-DnsName -Name "sirket.com" -Type TXT -Server "8.8.8.8"

# Nslookup ile zone transfer kontrolü (yetkisiz transfer engelli olmalı)
# nslookup -type=axfr sirket.com dns-sunucusu

# Tüm zone kayıtlarını dışa aktar ve kontrol et
Get-DnsServerResourceRecord -ZoneName "sirket.local" | 
    Where-Object {$_.RecordType -in @("A","AAAA","CNAME","MX","TXT")} |
    Select-Object HostName, RecordType, @{N="Data";E={$_.RecordData}} |
    Export-Csv "C:dns_audit_$(Get-Date -Format 'yyyyMMdd').csv" -NoTypeInformation

TTL Yönetimi: Göz Ardı Edilen Kritik Parametre

TTL değeri çoğu zaman default bırakılıyor ama bu ciddi bir hata. Değişiklik planlamadan önce TTL’i düşürün, değişiklik sonrası yükseltin. Bunu yapmayı unutmanın bedeli saatler süren önbellekleme sorunları oluyor.

Genel önerilerim şöyle:

  • Normal operasyon: 1-4 saat (3600-14400 saniye)
  • Kritik kayıtlar (MX, NS): 30 dakika ile 1 saat arası
  • Değişiklik öncesi: 5-10 dakika (en az 24 saat önceden düşürün)
  • TXT doğrulama kayıtları: 5 dakika yeterli, doğrulandıktan sonra kaldırın
# Toplu TTL güncelleme - değişiklik öncesi hazırlık
$zone = "sirket.com"
$shortTTL = [TimeSpan]::FromMinutes(10)

Get-DnsServerResourceRecord -ZoneName $zone -RRType A | 
    ForEach-Object {
        $old = $_
        $new = $old.Clone()
        $new.TimeToLive = $shortTTL
        Set-DnsServerResourceRecord -ZoneName $zone -OldInputObject $old -NewInputObject $new
    }

Write-Host "Tüm A kayıtları TTL değeri 10 dakikaya düşürüldü."

Conditional Forwarder ve Split-Brain DNS

İç ağda aynı domain’i farklı şekilde çözümlemeniz gerekiyorsa, yani iç kullanıcılar internal IP’ye, dış kullanıcılar external IP’ye ulaşacaksa, split-brain DNS yapısı kurmanız gerekiyor. Bu özellikle hybrid ortamlarda çok işe yarıyor:

# Split-brain için internal zone'da farklı A kaydı
# External DNS'te mail.sirket.com -> 203.0.113.50
# Internal DNS'te mail.sirket.com -> 192.168.10.20

Add-DnsServerPrimaryZone -Name "sirket.com" -ZoneFile "sirket.com.dns"

Add-DnsServerResourceRecordA `
    -ZoneName "sirket.com" `
    -Name "mail" `
    -IPv4Address "192.168.10.20" `
    -TimeToLive 01:00:00

# Conditional forwarder - belirli domain'leri farklı DNS'e gönder
Add-DnsServerConditionalForwarderZone `
    -Name "partner-sirket.com" `
    -MasterServers "10.20.30.40" `
    -ForwarderTimeout 5 `
    -ReplicationScope "Forest"

Kayıt Yedekleme ve Felaket Kurtarma

DNS kayıtlarını düzenli yedeklemek hayat kurtarır. Bir zone’un tüm kayıtlarını export edip yeniden import edebilmek, felaket senaryolarında dakikalar içinde kurtarma yapmanızı sağlar:

# Zone dışa aktarma
Export-DnsServerZone -Name "sirket.local" -FileName "sirket_local_backup.dns"

# Dışa aktarılan dosya C:WindowsSystem32dns altında oluşur
# Bunu güvenli bir konuma kopyalayın

# Alternatif: PowerShell ile tüm kayıtları JSON olarak yedekle
$backup = Get-DnsServerResourceRecord -ZoneName "sirket.local"
$backup | ConvertTo-Json -Depth 5 | 
    Out-File "C:Backupsdns_sirket_local_$(Get-Date -Format 'yyyyMMdd_HHmm').json"

Sonuç

Windows DNS’te kayıt yönetimi ilk bakışta basit görünüyor ama sağlam bir yapı kurmak deneyim ve disiplin istiyor. Şu noktaları her zaman aklınızda tutun: Her değişikliği önce TTL düşürerek hazırlayın. Toplu işlemler için mutlaka PowerShell kullanın, GUI’ye bağlı kalmayın. Düzenli audit scriptleri çalıştırıp kayıt envanterinizi temiz tutun. Split-brain ihtiyaçlarını önceden planlayın. CNAME zincirlerini kısa tutun. Ve en önemlisi, her değişiklikten sonra doğrulama yapın.

DNS sessiz sedasız çalışırken kimse fark etmez, bozulduğunda ise tüm şirket durur. Bu yüzden sağlam temeller kurmak ve yönetimi otomasyona taşımak hem size hem şirketinize büyük zaman ve sinir tasarrufu sağlayacak.

Bir yanıt yazın

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