DNS A Kaydı Nedir? Active Directory Ortamında A Kaydı Yönetimi

DNS altyapısının kalbinde, makinelerin birbirini bulmasını sağlayan o sihirli mekanizma yatar. Bir kullanıcı tarayıcısına “intranet.sirket.local” yazdığında, arka planda yaşanan DNS sorgulama sürecinin en temel taşı olan A kaydı devreye girer. Active Directory ortamlarında A kaydı sadece isim çözümleme değil, Kerberos kimlik doğrulama, LDAP sorguları ve domain controller keşfi gibi kritik işlevlerin de omurgasını oluşturur. Bu yazıda DNS A kaydını Windows Server ve Active Directory bağlamında derinlemesine inceleyeceğiz.

DNS A Kaydı Nedir?

A kaydı (Address Record), bir alan adını IPv4 adresine eşleyen en temel DNS kayıt türüdür. Tam adıyla “IPv4 Address Record” olan bu kayıt tipi, DNS’in varoluş amacını en saf haliyle temsil eder: insanların okuyabildiği isimleri, makinelerin anlayabildiği sayılara dönüştürmek.

Windows Server DNS’de bir A kaydının temel yapısı şöyledir:

  • Ad (Name): Hostname veya FQDN (Fully Qualified Domain Name)
  • Tip: A
  • TTL (Time to Live): Kaydın önbellekte tutulacağı süre (saniye cinsinden)
  • Değer: IPv4 adresi (örnek: 192.168.1.10)

Bir A kaydının FQDN formu şöyle görünür: dc01.sirket.local. 3600 IN A 192.168.1.10

Buradaki nokta işareti sonundaki FQDN’nin tam ve kesin bir adres olduğunu, başka bir suffix eklenmeyeceğini belirtir. Bu ince detay, özellikle zone transfer ve BIND konfigürasyonlarında kritik hata kaynaklarından biridir.

Active Directory ve A Kaydının Kritik İlişkisi

Active Directory, DNS’e son derece bağımlı bir servistir. Microsoft bu durumu kendi belgelerinde açıkça şöyle ifade eder: “DNS is required for Active Directory to function.” Peki bu bağımlılık A kaydıyla nasıl şekillenir?

Domain controller’lar, başlatıldıklarında NETLOGON servisi aracılığıyla DNS’e otomatik olarak kayıt yaptırır. Bu kayıtlar arasında A kaydı ilk sırada gelir. Bir DC’nin A kaydı olmadığında:

  • Domain join işlemleri başarısız olur
  • Kerberos bilet alınamaz
  • Group Policy uygulanamaz
  • SYSVOL ve NETLOGON paylaşımlarına erişilemez

DC’nin DNS kaydını kontrol etmek için:

# Belirli bir DC'nin A kaydını sorgula
nslookup dc01.sirket.local
nslookup dc01.sirket.local 192.168.1.1

# Tüm DC'lerin kayıtlarını listele
nltest /dclist:sirket.local

# DNS zone'undaki tüm kayıtları listele
dnscmd /enumrecords sirket.local @ /type A

Windows Server DNS Üzerinde A Kaydı Yönetimi

PowerShell ile A Kaydı Oluşturma ve Yönetme

Günümüz sysadmin’i için PowerShell, DNS yönetiminin vazgeçilmez aracıdır. GUI üzerinden tek tek yapmak yerine scriptlerle toplu operasyonlar yapmak hem hız hem de tutarlılık açısından çok daha verimlidir.

Temel A kaydı oluşturma:

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

# Birden fazla A kaydını CSV'den toplu olarak ekle
Import-Csv "sunucular.csv" | ForEach-Object {
    Add-DnsServerResourceRecordA `
        -Name $_.Hostname `
        -ZoneName "sirket.local" `
        -IPv4Address $_.IPAddress `
        -TimeToLive 00:20:00
    Write-Host "$($_.Hostname) eklendi: $($_.IPAddress)"
}

CSV dosyasının formatı şöyle olmalıdır:

  • Hostname, IPAddress
  • webserver01, 192.168.10.50
  • appserver01, 192.168.10.51
  • dbserver01, 192.168.10.52

Mevcut A kayıtlarını sorgulama ve listeleme:

# Belirli bir zone'daki tüm A kayıtlarını listele
Get-DnsServerResourceRecord -ZoneName "sirket.local" -RRType A |
    Select-Object HostName, RecordType, TimeToLive,
    @{N="IPAddress";E={$_.RecordData.IPv4Address}} |
    Sort-Object HostName |
    Format-Table -AutoSize

# Belirli bir IP adresine sahip kaydı bul
Get-DnsServerResourceRecord -ZoneName "sirket.local" -RRType A |
    Where-Object { $_.RecordData.IPv4Address -eq "192.168.10.50" }

# Belirli bir hostname'in kaydını getir
Get-DnsServerResourceRecord `
    -ZoneName "sirket.local" `
    -Name "webserver01" `
    -RRType A

A kaydını güncelleme:

A kaydı güncelleme PowerShell’de biraz farklı çalışır. Önce eski kaydı alır, sonra yeni değerle birlikte Set-DnsServerResourceRecord komutuna verirsiniz.

# Mevcut A kaydını güncelle
$OldRecord = Get-DnsServerResourceRecord `
    -ZoneName "sirket.local" `
    -Name "webserver01" `
    -RRType A

$NewRecord = $OldRecord.Clone()
$NewRecord.RecordData.IPv4Address = [System.Net.IPAddress]::Parse("192.168.10.55")

Set-DnsServerResourceRecord `
    -ZoneName "sirket.local" `
    -OldInputObject $OldRecord `
    -NewInputObject $NewRecord

Write-Host "webserver01 IP adresi 192.168.10.55 olarak guncellendi"

A kaydını silme:

# Tek bir A kaydını sil
Remove-DnsServerResourceRecord `
    -ZoneName "sirket.local" `
    -Name "webserver01" `
    -RRType A `
    -Force

# Belirli bir IP'ye sahip tüm kayıtları sil (dikkatli kullanın!)
Get-DnsServerResourceRecord -ZoneName "sirket.local" -RRType A |
    Where-Object { $_.RecordData.IPv4Address -eq "192.168.10.50" } |
    Remove-DnsServerResourceRecord -ZoneName "sirket.local" -Force

TTL Değeri: Küçük Ama Kritik Detay

TTL (Time to Live), DNS A kaydının belki de en çok göz ardı edilen ama en önemli parametresidir. Bu değer, kaydın DNS önbelleklerinde ne kadar süre tutulacağını belirler.

Gerçek dünya senaryosu: Bir üretim sunucusunun IP adresini değiştirmeniz gerekiyor. Eğer A kaydının TTL değeri 86400 saniye (24 saat) ise, IP değişikliğinden sonra bazı istemciler 24 saat boyunca eski IP’ye bağlanmaya çalışacaktır. Bu, planlı bir bakım penceresi açısından ciddi sorun yaratır.

Profesyonel yaklaşım: Büyük değişikliklerden önce TTL’yi düşürün, değişikliği yapın, sonra TTL’yi tekrar artırın.

# Değişiklik öncesi TTL'yi 5 dakikaya düşür
$Record = Get-DnsServerResourceRecord `
    -ZoneName "sirket.local" `
    -Name "kritikuygulama" `
    -RRType A

$NewRecord = $Record.Clone()
$NewRecord.TimeToLive = [System.TimeSpan]::FromMinutes(5)
# IP adresi de değişiyorsa bunu da güncelleyin
$NewRecord.RecordData.IPv4Address = [System.Net.IPAddress]::Parse("192.168.10.100")

Set-DnsServerResourceRecord `
    -ZoneName "sirket.local" `
    -OldInputObject $Record `
    -NewInputObject $NewRecord

Write-Host "TTL 5 dakikaya dusuruldu ve yeni IP uygulandı"
Write-Host "Eski TTL suresince bekleyin, sonra TTL'yi artirabilirsiniz"

TTL için önerilen değerler:

  • Normal production sunucuları: 3600 saniye (1 saat)
  • Kritik servisler (DC, Exchange, vb.): 900-1800 saniye
  • Sık değişen kayıtlar: 300 saniye
  • Test ortamları: 60-300 saniye
  • Asla değişmeyecek kayıtlar: 86400 saniye

Round Robin ve Yük Dağılımı

Bir hostname için birden fazla A kaydı tanımlamak mümkündür. Bu özellik, Windows DNS’de Round Robin olarak bilinen basit bir yük dağılım mekanizması sağlar.

# Aynı hostname için birden fazla A kaydı ekle
Add-DnsServerResourceRecordA `
    -Name "webapp" `
    -ZoneName "sirket.local" `
    -IPv4Address "192.168.10.60"

Add-DnsServerResourceRecordA `
    -Name "webapp" `
    -ZoneName "sirket.local" `
    -IPv4Address "192.168.10.61"

Add-DnsServerResourceRecordA `
    -Name "webapp" `
    -ZoneName "sirket.local" `
    -IPv4Address "192.168.10.62"

# Mevcut round robin kayıtlarını doğrula
Resolve-DnsName "webapp.sirket.local" -Server "192.168.1.1" -Type A

Bu yapılandırmada DNS sunucusu, her sorguya farklı bir sırada IP adresleri döndürür. İstemci genellikle listenin ilk IP’sine bağlandığından, teorik olarak yük dağılımı sağlanmış olur.

Önemli uyarı: Round Robin, gerçek bir yük dengeleyici (load balancer) değildir. Sunucu çöktüğünde DNS hala o IP’yi döndürür. Gerçek yüksek erişilebilirlik için NLB, HAProxy veya F5 gibi çözümlere ihtiyaç vardır.

Scavenging ve Stale Record Temizliği

Active Directory ortamlarında, bilgisayarlar DNS’e dinamik olarak kayıt yaptırır. Ancak bir makine domain’den çıkarıldığında veya IP adresi değiştiğinde, eski kayıtlar DNS’de kalmaya devam edebilir. Bu stale (bayat) kayıtlar zamanla sorun yaratır.

Scavenging mekanizması bu sorunu otomatik olarak çözer:

# DNS zone'unda scavenging'i etkinleştir
Set-DnsServerZoneAging `
    -Name "sirket.local" `
    -Aging $true `
    -NoRefreshInterval 7.00:00:00 `
    -RefreshInterval 7.00:00:00

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

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

Scavenging parametrelerini anlamak kritiktir:

  • NoRefreshInterval: Bu süre içinde kayıt yenilenebilir ama timestamp güncellenmez. Varsayılan 7 gün.
  • RefreshInterval: Bu süre içinde kayıt timestamp’ini yenileyebilir. Varsayılan 7 gün.
  • ScavengingInterval: Scavenging işleminin ne sıklıkta çalışacağı.

Bir kaydın silinmesi için toplam süre: NoRefreshInterval + RefreshInterval = 14 gün (varsayılan ayarlarla).

Dinamik DNS Güncellemeleri ve Güvenlik

Active Directory ortamında istemciler, IP adresleri değiştiğinde A kayıtlarını otomatik olarak güncelleyebilir. Bu Dynamic DNS (DDNS) özelliği büyük kolaylık sağlar ama güvenlik açısından da dikkat gerektirir.

Zone güncelleme ayarları:

  • None: Dinamik güncelleme kapalı
  • Nonsecure and Secure: Hem kimlik doğrulamalı hem de anonim güncellemelere izin verilir (tehlikeli!)
  • Secure Only: Sadece domain üyesi bilgisayarlar kayıt yaptırabilir (önerilen)
# Zone'un dinamik güncelleme ayarını kontrol et
Get-DnsServerZone -Name "sirket.local" |
    Select-Object ZoneName, DynamicUpdate

# Sadece güvenli güncellemelere izin ver
Set-DnsServerPrimaryZone `
    -Name "sirket.local" `
    -DynamicUpdate Secure

# Belirli bir kaydın timestamp bilgisini gör
Get-DnsServerResourceRecord `
    -ZoneName "sirket.local" `
    -Name "workstation01" `
    -RRType A |
    Select-Object HostName, TimeStamp, TimeToLive,
    @{N="IP";E={$_.RecordData.IPv4Address}}

Güvenlik notu: Secure Only modunda, bir kayıt yalnızca onu oluşturan bilgisayar tarafından güncellenebilir. Eğer bir bilgisayarı yeniden adlandırır veya domain’den çıkarıp tekrar eklerseniz, eski kaydı manuel silmeniz gerekebilir.

Gerçek Dünya Sorun Giderme Senaryoları

Senaryo 1: Domain Join Başarısız

Kullanıcı “The specified domain either does not exist or could not be contacted” hatası alıyor. İlk şüphelenilen nokta genellikle A kaydıdır.

# 1. DC'nin A kaydını doğrula
nslookup sirket.local
nslookup -type=A dc01.sirket.local

# 2. Tüm DC'lerin SRV ve A kayıtlarını kontrol et
nltest /dsgetdc:sirket.local
dcdiag /test:DNS /v

# 3. DNS sunucusunun zone'unu kontrol et
dnscmd /enumzones
dnscmd /enumrecords sirket.local @ /type A /additional

# 4. DC'nin kendi DNS kaydını yeniden kaydetmesini zorla
ipconfig /registerdns
net stop netlogon && net start netlogon

Senaryo 2: Stale A Kaydı Çakışması

Eski bir sunucunun IP’si yeni bir sunucuya verildi, ama DNS’de hala eski A kaydı duruyor.

# Çakışan kayıtları bul
Get-DnsServerResourceRecord -ZoneName "sirket.local" -RRType A |
    Where-Object { $_.RecordData.IPv4Address -eq "192.168.10.50" } |
    Format-List

# Eski kaydı sil, yenisini ekle
Remove-DnsServerResourceRecord `
    -ZoneName "sirket.local" `
    -Name "eskisunucu" `
    -RRType A `
    -RecordData "192.168.10.50" `
    -Force

Add-DnsServerResourceRecordA `
    -Name "yenisunucu" `
    -ZoneName "sirket.local" `
    -IPv4Address "192.168.10.50"

# Sonucu doğrula
Resolve-DnsName "yenisunucu.sirket.local" -Type A

Senaryo 3: Replikasyon Sonrası A Kaydı Eksikliği

Multi-site Active Directory ortamlarında DNS replikasyonu bazen gecikebilir.

# Tüm DC'lerdeki DNS kayıtlarını karşılaştır
$DCList = (Get-ADDomainController -Filter *).HostName
foreach ($DC in $DCList) {
    Write-Host "=== $DC ==="
    Resolve-DnsName "kritikuygulama.sirket.local" `
        -Server $DC `
        -Type A `
        -ErrorAction SilentlyContinue |
        Select-Object Name, IPAddress
}

# DNS replikasyonunu zorla
repadmin /syncall /AdeP
dnscmd /clearcache

A Kaydı ile PTR Kaydının Koordinasyonu

A kaydı oluşturulurken CreatePtr parametresiyle eş zamanlı PTR (Pointer/Reverse DNS) kaydı da oluşturulabilir. Bu özellikle Exchange, güvenlik logları ve ağ cihazlarının doğru çalışması için önemlidir.

# A kaydıyla birlikte PTR kaydı oluştur
Add-DnsServerResourceRecordA `
    -Name "mailserver01" `
    -ZoneName "sirket.local" `
    -IPv4Address "192.168.10.70" `
    -CreatePtr `
    -TimeToLive 01:00:00

# Ters zone'daki PTR kaydını doğrula
Resolve-DnsName "192.168.10.70" -Type PTR
nslookup 192.168.10.70

# Tüm ters zone kayıtlarını listele
Get-DnsServerResourceRecord `
    -ZoneName "10.168.192.in-addr.arpa" `
    -RRType PTR

Toplu A Kaydı Denetim Scripti

Büyük ortamlarda periyodik denetim yapmak, DNS sağlığını korumak için şarttır.

# DNS A kayıtları denetim scripti
$ZoneName = "sirket.local"
$DnsServer = "dc01.sirket.local"
$ReportPath = "C:DNS_Audit_$(Get-Date -Format 'yyyyMMdd').csv"

$Records = Get-DnsServerResourceRecord `
    -ZoneName $ZoneName `
    -ComputerName $DnsServer `
    -RRType A

$Report = foreach ($Record in $Records) {
    $IP = $Record.RecordData.IPv4Address.ToString()
    $PingResult = Test-Connection -ComputerName $IP `
        -Count 1 -Quiet -ErrorAction SilentlyContinue

    [PSCustomObject]@{
        Hostname    = $Record.HostName
        IPAddress   = $IP
        TTL         = $Record.TimeToLive
        TimeStamp   = $Record.TimeStamp
        IsStatic    = ($Record.TimeStamp -eq $null)
        PingOK      = $PingResult
        Status      = if ($PingResult) { "Aktif" } else { "Erisilemez" }
    }
}

$Report | Export-Csv -Path $ReportPath -NoTypeInformation -Encoding UTF8
Write-Host "Denetim tamamlandi: $ReportPath"
Write-Host "Toplam kayit: $($Report.Count)"
Write-Host "Erisilemez: $(($Report | Where-Object {-not $_.PingOK}).Count)"

Sonuç

DNS A kaydı, Active Directory altyapısının temel yapı taşlarından biridir. Basit görünen bu kayıt türü, domain controller keşfinden Group Policy uygulamasına, kullanıcı kimlik doğrulamasından uygulama servisi erişimine kadar onlarca kritik işlevin sorunsuz çalışmasını doğrudan etkiler.

Bu yazıda ele aldığımız konuları özetlersek:

  • A kaydının AD ortamındaki kritik rolü ve DC servisleriyle ilişkisi
  • PowerShell ile kapsamlı A kaydı yönetimi (oluşturma, güncelleme, silme)
  • TTL stratejisi ve değişiklik planlaması
  • Round Robin ile basit yük dağılımı
  • Scavenging ile stale kayıt temizliği
  • Dinamik DNS güvenlik konfigürasyonu
  • Gerçek dünya sorun giderme senaryoları
  • PTR koordinasyonu ve denetim scriptleri

Sysadmin olarak DNS’i “sadece çalışıyor” mantığıyla bırakmak yerine, periyodik denetim yapmak, TTL değerlerini bilinçli seçmek ve scavenging’i düzgün konfigüre etmek uzun vadede büyük sorunların önüne geçer. DNS altyapısı sağlamsa, Active Directory altyapısı da sağlamdır.

Yorum yapın