Windows DNS Sunucusu Kurulumu ve İlk Yapılandırma

Yeni bir Windows Server kurulumu yaptıktan sonra “DNS’i de bu sunucuya atalım” kararını vermek kolay. Asıl iş, DNS rolünü doğru yapılandırmak ve ilerleyen dönemde sorun çıkarmayacak bir temel oluşturmak. Bu yazıda Windows DNS Sunucusu kurulumunu adım adım ele alacağız; hem GUI hem de PowerShell yolunu göstereceğiz. Kurumsal ortamda defalarca geçtiğim bu süreçte öğrendiğim püf noktaları da ekleyeceğim.

Kuruluma Başlamadan Önce: Ön Hazırlık

DNS sunucusu kurmadan önce birkaç şeyi netleştirmeniz gerekiyor. Bunları atlayanların sonradan “neden çalışmıyor” diye saatlerce uğraştığını gördüm.

Sunucu IP adresi statik olmalı. DHCP’den IP alan bir DNS sunucusu kurmak, kumdan kale yapmak gibi. Önce sunucunuzun ağ ayarlarına gidin ve sabit IP tanımlayın.

# Mevcut ağ adaptörlerini listeleyin
Get-NetAdapter

# Statik IP yapılandırması (örnek: 192.168.1.10)
New-NetIPAddress -InterfaceAlias "Ethernet0" -IPAddress 192.168.1.10 -PrefixLength 24 -DefaultGateway 192.168.1.1

# DNS sunucusu adresini kendinize gösterin (kurulumdan sonra)
Set-DnsClientServerAddress -InterfaceAlias "Ethernet0" -ServerAddresses 192.168.1.10,192.168.1.11

Bilgisayar adı kalıcı olmalı. DNS sunucusunu kurduktan sonra makine adını değiştirirseniz çeşitli kayıtlar tutarsız kalır. Kurulumdan önce adı düzeltin:

# Mevcut bilgisayar adını kontrol edin
$env:COMPUTERNAME

# Bilgisayar adını değiştirin (yeniden başlatma gerektirir)
Rename-Computer -NewName "SRV-DNS01" -Restart

DNS Rolünün Kurulumu

PowerShell ile Kurulum

Üretim ortamında PowerShell’i tercih ediyorum. Hem tekrarlanabilir hem de kayıt altına alınabilir. Özellikle birden fazla sunucuda aynı yapılandırmayı uygulamak gerektiğinde script haline getirmek çok değerli.

# DNS Server rolünü kur
Install-WindowsFeature -Name DNS -IncludeManagementTools -Restart

# Kurulumu doğrula
Get-WindowsFeature -Name DNS

# DNS servisinin durumunu kontrol et
Get-Service -Name DNS

Kurulum tamamlandıktan sonra DNS servisinin Running durumunda olduğunu görmelisiniz. Eğer sunucunuz Active Directory ile entegre çalışacaksa, DNS rolü çoğunlukla AD DS rolüyle birlikte kurulur. Ama sadece standalone DNS sunucusu istiyorsanız yukarıdaki komut yeterli.

Server Manager ile GUI Kurulumu

Bazı ortamlarda GUI’den gitmek zorunda kalabilirsiniz, özellikle junior ekip arkadaşlarınıza gösterirken. Server Manager üzerinden şu adımları izleyin:

  • Manage > Add Roles and Features yolunu takip edin
  • Role-based or feature-based installation seçin
  • Sunucunuzu seçin
  • Server Roles listesinden DNS Server seçin
  • Yönetim araçlarını da dahil etmek için Include management tools kutusunu işaretleyin
  • Kurulumu tamamlayın ve gerekirse yeniden başlatın

İlk Zone Yapılandırması

DNS sunucunuz kuruldu, şimdi asıl işe geliyoruz. Zone yapılandırması olmadan DNS sunucusu sadece boş bir kabuk.

Forward Lookup Zone Oluşturma

Forward lookup zone, isimden IP’ye çözümleme yapar. Şirketinizin iç ağı için bir zone oluşturalım:

# Yeni primary zone oluştur
Add-DnsServerPrimaryZone -Name "sirket.local" -ZoneFile "sirket.local.dns" -DynamicUpdate NonsecureAndSecure

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

# Zone bilgilerini detaylı görüntüle
Get-DnsServerZone | Format-List -Property ZoneName, ZoneType, IsDsIntegrated, DynamicUpdate

DynamicUpdate parametresi için üç seçeneğiniz var:

  • None: Dinamik güncelleme kapalı, tüm kayıtları manuel girmeniz gerekir
  • NonsecureAndSecure: Hem güvenli hem güvensiz güncellemelere izin verir, test ortamları için uygun
  • Secure: Sadece kimlik doğrulaması yapılmış istemciler kayıt güncelleyebilir, production için tercih edin

Reverse Lookup Zone Oluşturma

IP’den isme çözümleme için reverse lookup zone şart. Pek çok uygulama ve güvenlik aracı bu zone olmadan düzgün çalışmaz. Log dosyalarında IP yerine hostname görmek istiyorsanız bu zone’u mutlaka kurun.

# Reverse lookup zone oluştur (192.168.1.0/24 ağı için)
Add-DnsServerPrimaryZone -NetworkId "192.168.1.0/24" -ZoneFile "1.168.192.in-addr.arpa.dns" -DynamicUpdate NonsecureAndSecure

# Oluşturulan reverse zone'u doğrula
Get-DnsServerZone | Where-Object {$_.IsReverseLookupZone -eq $true}

DNS Kayıtlarının Yönetimi

Zone’ları oluşturdunuz, şimdi kayıt ekleme zamanı. Gerçek dünyada en çok kullandığım kayıt türlerini buraya topladım.

A ve PTR Kayıtları

# A kaydı ekle (hostname -> IP)
Add-DnsServerResourceRecordA -ZoneName "sirket.local" -Name "webserver" -IPv4Address "192.168.1.20" -CreatePtr

# -CreatePtr parametresi otomatik olarak PTR kaydı da oluşturur
# Bu çok kullanışlı, her iki kaydı ayrı ayrı eklemenize gerek kalmaz

# Birden fazla kayıt ekleme (script ile)
$hosts = @(
    @{Name="fileserver"; IP="192.168.1.21"},
    @{Name="mailserver"; IP="192.168.1.22"},
    @{Name="appserver";  IP="192.168.1.23"}
)

foreach ($host in $hosts) {
    Add-DnsServerResourceRecordA -ZoneName "sirket.local" -Name $host.Name -IPv4Address $host.IP -CreatePtr
    Write-Host "$($host.Name) kaydı eklendi: $($host.IP)"
}

CNAME Kayıtları

Takma ad (alias) oluşturmak için CNAME kullanıyoruz. Özellikle servis adlarını sunucu adlarından soyutlamak için çok kullanışlı:

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

# Sonundaki nokta (.) önemli! FQDN belirtiyorsanız mutlaka ekleyin

# İntranet portalı için CNAME
Add-DnsServerResourceRecordCName -ZoneName "sirket.local" -Name "intranet" -HostNameAlias "appserver.sirket.local."

# Kayıtları listele ve doğrula
Get-DnsServerResourceRecord -ZoneName "sirket.local" -RRType CName

MX Kayıtları

Mail altyapınız varsa MX kayıtlarını da DNS’e girmeniz gerekiyor:

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

# Yedek mail sunucusu için (daha yüksek preference değeri = daha düşük öncelik)
Add-DnsServerResourceRecordMX -ZoneName "sirket.local" -Name "@" -MailExchange "mailserver2.sirket.local." -Preference 20

# MX kayıtlarını görüntüle
Get-DnsServerResourceRecord -ZoneName "sirket.local" -RRType MX

Forwarder Yapılandırması

İç ağınızda bulunamayan sorgular için DNS sunucunuzu nereye yönlendireceğinizi belirlemeniz gerekiyor. Forwarder yapılandırması, hem performans hem de güvenlik açısından kritik.

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

# Forwarder ekle (Google DNS ve Cloudflare)
Set-DnsServerForwarder -IPAddress "8.8.8.8","8.8.4.4","1.1.1.1" -UseRootHint $false

# Forwarder timeout süresini ayarla (varsayılan 3 saniye, artırabilirsiniz)
Set-DnsServerForwarder -Timeout 5

# Kurumsal ortamlarda ISP DNS'i forwarder olarak eklemek daha iyi olabilir
# Özellikle filtreleme gereksinimleri varsa
Set-DnsServerForwarder -IPAddress "X.X.X.X" -UseRootHint $false

UseRootHint parametresi hakkında bir not: Bunu $false olarak ayarladığınızda, forwarder’lar yanıt vermezse sorgu başarısız olur. $true yaparsanız root hint sunucularına gidilir. Kurumsal ortamlarda genellikle $false tercih edilir, çünkü tüm dış trafiğin kurumun proxy/güvenlik duvarından geçmesi istenir.

Koşullu Forwarder (Conditional Forwarder)

Bu özellik çok kullanışlı ama sık atlanıyor. Belirli bir domain için farklı DNS sunucusuna yönlendirme yapmanızı sağlar. Örneğin, partner firmanın domain’ini kendi DNS’lerinden çözümletmek istiyorsanız:

# Belirli domain için conditional forwarder ekle
Add-DnsServerConditionalForwarderZone -Name "partner-firma.local" -MasterServers "10.0.0.1","10.0.0.2"

# Birden fazla partner domain için
$partnerDomains = @(
    @{Domain="partner1.local"; DNS="10.0.1.1"},
    @{Domain="partner2.local"; DNS="10.0.2.1"}
)

foreach ($partner in $partnerDomains) {
    Add-DnsServerConditionalForwarderZone -Name $partner.Domain -MasterServers $partner.DNS
    Write-Host "$($partner.Domain) için conditional forwarder eklendi"
}

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

DNS Sunucu Ayarlarının Optimizasyonu

Kurulum ve temel yapılandırma tamam. Şimdi biraz performans ve güvenilirlik tarafına bakalım.

Recursive Sorguların Yönetimi

# Mevcut recursive sorgu ayarlarını görüntüle
Get-DnsServerRecursion

# Recursive sorgu ayarlarını optimize et
Set-DnsServerRecursion -Enable $true -Timeout 8 -RetryInterval 3 -AdditionalTimeout 4

# Dış istemcilerin recursive sorgu yapmasını engellemek için
# (sadece iç ağdan recursive sorgu kabul et)
# Bu ayar DNS amplification saldırılarına karşı koruma sağlar
Set-DnsServerRecursionScope -Name "." -EnableRecursion $false
Add-DnsServerRecursionScope -Name "InternalClients" -EnableRecursion $true
Add-DnsServerClientSubnet -Name "InternalSubnet" -IPv4Subnet "192.168.1.0/24"

Cache Temizleme ve Yönetimi

# DNS cache içeriğini görüntüle
Get-DnsServerCache

# Tüm cache'i temizle (sorun giderirken sık kullanılır)
Clear-DnsServerCache -Force

# Belirli bir kayıt için cache'i temizle
Clear-DnsServerCache -Force
# Sonrasında nslookup ile test et:
# nslookup webserver.sirket.local 192.168.1.10

Zone Transfer Güvenliği

Zone transfer ayarlarını sıkılaştırın. Varsayılan olarak zone transfer herkese açık olabilir, bu ciddi bir güvenlik açığıdır:

# Zone transfer ayarlarını görüntüle
Get-DnsServerZoneTransfer -Name "sirket.local"

# Zone transferi sadece belirtilen sunuculara izin ver
Set-DnsServerZoneTransfer -Name "sirket.local" -PassThru -SecureSecondaries TransferToZoneNameServer

# Veya belirli IP'lere kısıtla
Set-DnsServerZoneTransfer -Name "sirket.local" -SecureSecondaries TransferToSecureServers -SecondaryServers "192.168.1.11"

İzleme ve Sorun Giderme

DNS sorunları genellikle en kötü zamanda çıkar. Temel izleme ve sorun giderme araçlarını bilmek hayat kurtarır.

# DNS sunucu istatistiklerini görüntüle
Get-DnsServerStatistics

# Anlık sorgu istatistikleri
Get-DnsServerStatistics | Select-Object -ExpandProperty Query2Statistics

# DNS debug logging'i etkinleştir (sorun giderme için)
Set-DnsServerDiagnostics -All $true -LogFilePath "C:DNS_Debugdns.log" -MaxMBFileSize 50

# Normal operasyonda debug logging'i kapat (performansı etkiler)
Set-DnsServerDiagnostics -All $false

# Windows Event Log'dan DNS hatalarını filtrele
Get-WinEvent -LogName "DNS Server" -MaxEvents 50 | 
    Where-Object {$_.LevelDisplayName -eq "Error"} | 
    Select-Object TimeCreated, Message | 
    Format-List

Gerçek dünyadan bir senaryo: Bir müşteride tüm çözümleme işlemleri yavaşlamıştı. Get-DnsServerStatistics ile baktığımda recursive sorgu sayısının anormal yüksek olduğunu gördüm. Meğer test ortamındaki bir uygulama DNS sunucusunu flood ediyormuş. Debug logging açıp logları analiz etmeden bu sorunu bulamazdık. İzleme araçlarını küçümsemeyin.

Yedekleme ve Felaketten Kurtarma

DNS yapılandırmanızı yedeklemeyi unutmayın. Bir sunucunun çöküp sıfırdan DNS kurmanın ne kadar can sıkıcı olduğunu biliyorum:

# Tüm zone'ları dışa aktar
$zones = Get-DnsServerZone | Where-Object {$_.ZoneType -eq "Primary" -and $_.IsAutoCreated -eq $false}

foreach ($zone in $zones) {
    Export-DnsServerZone -Name $zone.ZoneName -FileName "$($zone.ZoneName).bak"
    Write-Host "$($zone.ZoneName) zone'u yedeklendi"
}

# DNS sunucu yapılandırmasını dışa aktar
$backupPath = "C:DNSBackup_$(Get-Date -Format 'yyyyMMdd')"
New-Item -ItemType Directory -Path $backupPath -Force

# Zone dosyaları genellikle C:WindowsSystem32dns altında
Copy-Item "C:WindowsSystem32dns*.dns" -Destination $backupPath

# Registry üzerinden DNS yapılandırmasını yedekle
reg export "HKLMSYSTEMCurrentControlSetServicesDNS" "$backupPathdns_registry.reg"

Write-Host "DNS yedekleme tamamlandı: $backupPath"

Yedeklemeyi haftada en az bir kez çalıştıran bir scheduled task oluşturmanızı tavsiye ederim. Özellikle zone değişiklikleri sık olan ortamlarda günlük yedek bile düşünülebilir.

Hızlı Doğrulama Kontrolleri

Yapılandırma tamamlandıktan sonra her şeyin doğru çalıştığını teyit etmek için şu komutları çalıştırın:

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

# Tüm zone'ları listele
Get-DnsServerZone | Select-Object ZoneName, ZoneType, DynamicUpdate, IsDsIntegrated

# Forward lookup testi
Resolve-DnsName -Name "webserver.sirket.local" -Server "192.168.1.10" -Type A

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

# Forwarder testi (dış domain)
Resolve-DnsName -Name "google.com" -Server "192.168.1.10" -Type A

# nslookup ile de doğrulayabilirsiniz
nslookup webserver.sirket.local 192.168.1.10

Sonuç

Windows DNS Sunucusu kurulumu ilk bakışta basit görünse de, doğru yapılandırılmamış bir DNS sunucusu ilerleyen dönemde ciddi sorunlara yol açar. Statik IP ile başlayıp zone yapılandırması, forwarder ayarları, güvenlik kısıtlamaları ve yedekleme adımlarını eksiksiz geçmek, sağlıklı bir DNS altyapısının temelini oluşturur.

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

  • Kurulum öncesi ağ ve hostname hazırlığı
  • PowerShell ile rol kurulumu ve doğrulama
  • Forward ve reverse lookup zone oluşturma
  • A, CNAME, MX kayıt yönetimi
  • Forwarder ve conditional forwarder yapılandırması
  • Zone transfer güvenliği
  • Debug logging ve izleme
  • Yedekleme stratejisi

Sonraki adım olarak ikincil DNS sunucusu kurulumu ve zone replikasyonu konusuna bakmanızı öneririm. Tek DNS sunucusuyla üretim ortamı kurmak, tek nokta arıza (single point of failure) riski taşır. En küçük ortamlarda bile en az iki DNS sunucusu olmalı.

Bir yanıt yazın

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