Windows DNS ile GlobalNames Zone Kullanımı

Uzun yıllar boyunca büyük kurumsal ağlarda DNS yönetimi yapan biri olarak şunu söyleyeyim: GlobalNames Zone (GNZ), Windows DNS’in en az konuşulan ama en çok işinize yarayabilecek özelliklerinden biri. Özellikle legacy sistemlerle boğuşan, WINS’i bir türlü söküp atamayan ortamlarda bu özelliği keşfettiğinizde “neden daha önce duymadım” diye düşünüyorsunuz. Bu yazıda GlobalNames Zone’u sıfırdan kuracağız, gerçek dünya senaryolarıyla nasıl kullanacağınızı göstereceğiz ve birkaç önemli tuzağa da dikkat çekeceğiz.

GlobalNames Zone Nedir ve Neden İhtiyaç Duyulur?

Klasik DNS, FQDN (Fully Qualified Domain Name) üzerine kuruludur. Yani bir sunucuya ulaşmak istediğinizde fileserver.sirket.local gibi tam bir isim kullanmanız gerekir. Ancak kurumsal ortamlarda, özellikle eski uygulamalarda, kullanıcılar ve sistemler kısa tek kelimelik isimler kullanmaya alışkındır. \fileserver yazıyorsunuz, Windows önce NetBIOS’a bakıyor, bulamazsa WINS’e gidiyor. Bu mekanizma yıllarca çalıştı ama IPv6 ağırlıklı ortamlarda ve modern altyapılarda WINS artık bir yük haline geldi.

GlobalNames Zone, Windows Server 2008 ile gelen ve tek kelimelik DNS çözümlemesini (single-label name resolution) saf DNS üzerinden mümkün kılan bir özelliktir. Kısaca ne yapar? GlobalNames adında özel bir primary zone oluşturuyorsunuz, bu zone içine CNAME kayıtları ekliyorsunuz ve kullanıcılar fileserver yazdığında DNS bu zone’a bakıp doğru FQDN’e yönlendiriyor. WINS’e gerek kalmıyor.

Peki bu ne zaman gerçekten işe yarıyor?

  • WINS altyapısını devreden çıkarmak istediğinizde ama legacy uygulamalar hâlâ kısa isim kullanıyorken
  • Çok ormanlı (multi-forest) Active Directory ortamlarında, farklı domainlerdeki sunuculara tek isimle erişim gerektiğinde
  • DNS suffix search list’inin çözemediği senaryolarda statik kısa isimler tanımlamak istediğinizde
  • Belirli sunuculara alias oluşturmak ve bu alias’ı tüm ormanda standart hale getirmek istediğinizde

GNZ ile WINS Farkı

Burada önemli bir noktayı vurgulamak istiyorum: GlobalNames Zone, WINS’in birebir yerine geçmez. WINS dinamik kayıt yapabilir, GNZ yapamaz. WINS, NetBIOS namespace’ini destekler; GNZ sadece DNS çözümlemesi yapar. Yani gerçek anlamda WINS bağımlısı olan uygulamalarınız varsa (ki 2024’te hâlâ var maalesef), GNZ tek başına yeterli olmayabilir. Ama %80’lik senaryoda, yani “kısa isimle sunucuya ulaşmam lazım” durumunda GNZ gayet yeterlidir.

Ön Koşullar

GNZ kurulumuna geçmeden önce ortamınızın hazır olduğundan emin olun:

  • Windows Server 2008 veya üstü DNS sunucuları
  • Active Directory entegre zone kullanacaksanız Domain Admin veya DNS Admin yetkisi
  • Birden fazla DNS sunucunuz varsa, tüm sunucularda GNZ’nin etkinleştirilmesi gerekiyor
  • PowerShell veya DNS Manager erişimi

Adım 1: GlobalNames Zone’u Oluşturma

DNS Manager üzerinden de yapılabilir ama ben her zaman PowerShell’i tercih ederim. Tekrarlanabilir, belgelenebilir ve script’e dönüştürülebilir.

Önce mevcut zone’ların durumunu kontrol edelim:

Get-DnsServerZone | Select-Object ZoneName, ZoneType, IsAutoCreated | Format-Table

Şimdi GlobalNames zone’u oluşturalım. Zone adı kesinlikle GlobalNames olmalı, büyük-küçük harf duyarlıdır:

Add-DnsServerPrimaryZone -Name "GlobalNames" -ReplicationScope "Forest" -PassThru

Burada -ReplicationScope "Forest" parametresi kritik. Eğer sadece tek bir domain içinde çalışacaksanız Domain kullanabilirsiniz. Ama multi-forest ortamlarda veya tüm ormana yaymak istiyorsanız Forest seçin. Replication scope seçenekleri şunlardır:

  • Forest: Tüm ormandaki DNS sunucularına replike edilir
  • Domain: Yalnızca aynı domaindeki DNS sunucularına replike edilir
  • Legacy: Eski tarz AD replikasyonu için
  • Custom: Belirli bir uygulama dizinine replike edilir

Zone oluşturulduktan sonra doğrulayalım:

Get-DnsServerZone -Name "GlobalNames" | Select-Object *

Adım 2: DNS Sunucusunda GNZ Desteğini Etkinleştirme

Zone’u oluşturdunuz ama bu yetmez. Her DNS sunucusunda GlobalNames Zone desteğinin ayrıca açılması gerekiyor. Bu bazen gözden kaçıyor ve “neden çalışmıyor” diye saatler harcanıyor.

Set-DnsServerGlobalNameZone -Enable $true -PassThru

Bu komutu, GNZ çözümlemesi yapmasını istediğiniz tüm DNS sunucularında çalıştırmalısınız. Eğer birden fazla sunucunuz varsa ve sadece birinde etkinleştirirseniz, o sunucuya giden sorgular çalışır ama diğerlerine gidenlerde kısa isim çözümlemesi başarısız olur. Bunu uzaktan yapmak için:

Invoke-Command -ComputerName "DNS-Server-02", "DNS-Server-03" -ScriptBlock {
    Set-DnsServerGlobalNameZone -Enable $true -PassThru
}

Mevcut durumu kontrol etmek için:

Get-DnsServerGlobalNameZone

Çıktıda Enable: True görmelisiniz. Ayrıca SendTimeout, ServerQueryInterval gibi parametreleri de buradan kontrol edebilirsiniz.

Adım 3: CNAME Kayıtları Ekleme

GlobalNames zone’unun çalışma mantığı tamamen CNAME kayıtlarına dayanır. A kaydı değil, CNAME kaydı kullanmanız gerekiyor. Bu da şu anlama geliyor: Hedef olarak mutlaka bir FQDN girmelisiniz.

Örnek senaryo: fileserver kısa adıyla dosyasunucusu01.sirket.local sunucusuna erişilmesini istiyorsunuz.

Add-DnsServerResourceRecord -ZoneName "GlobalNames" -CName -Name "fileserver" -HostNameAlias "dosyasunucusu01.sirket.local." -TimeToLive 00:10:00

Dikkat: -HostNameAlias değerinin sonundaki nokta (.) önemli. Bu, FQDN’nin tam olduğunu belirtir. Bazı ortamlarda noktayı koymazsanız DNS sunucusu kendi zone adını ekleyebilir.

Birkaç kayıt daha ekleyelim:

Add-DnsServerResourceRecord -ZoneName "GlobalNames" -CName -Name "intranet" -HostNameAlias "intranet-web01.sirket.local." -TimeToLive 00:10:00

Add-DnsServerResourceRecord -ZoneName "GlobalNames" -CName -Name "mail" -HostNameAlias "exchange01.sirket.local." -TimeToLive 00:10:00

Add-DnsServerResourceRecord -ZoneName "GlobalNames" -CName -Name "erp" -HostNameAlias "sap-prod-01.sirket.local." -TimeToLive 00:10:00

Kayıtları kontrol edelim:

Get-DnsServerResourceRecord -ZoneName "GlobalNames" | Where-Object {$_.RecordType -eq "CNAME"} | Select-Object HostName, RecordData

Adım 4: Test ve Doğrulama

Kayıtları ekledikten sonra test etmek şart. Hem DNS sunucusundan hem de istemci tarafından test yapın.

DNS sunucusundan nslookup ile test:

nslookup fileserver localhost

Beklenen çıktı, önce CNAME kaydını gösterecek, ardından A kaydının IP adresini dönecek. Eğer sadece Non-existent domain görüyorsanız GNZ desteğinin etkinleştirilmediğini kontrol edin.

PowerShell ile daha detaylı test:

Resolve-DnsName -Name "fileserver" -Server "127.0.0.1" -Type CNAME
Resolve-DnsName -Name "fileserver" -Server "127.0.0.1"

İstemci tarafından da test etmek için bir Windows istemcisinde:

ipconfig /flushdns
nslookup fileserver
ping fileserver

Eğer istemci tarafında çalışmıyorsa ama sunucu tarafında çalışıyorsa, büyük ihtimalle istemcinin DNS suffix search list’inde bir çakışma var veya istemcinin DNS sunucusunda GNZ etkinleştirilmemiş demektir.

Gerçek Dünya Senaryosu: WINS’ten GNZ’ye Geçiş

Yakın zamanda bir üretim ortamında bu geçişi yaptım. Ortamda yaklaşık 150 kısa isim kullanılıyordu; legacy ERP sistemi, dosya sunucuları, yazıcı sunucuları, iç web uygulamaları. Hepsini elle tek tek girmek yerine şöyle bir yaklaşım izledim:

Önce WINS’ten mevcut statik kayıtları dışa aktardım. WINS konsolunda bunu yapabilirsiniz ama PowerShell ile daha temiz:

# Mevcut WINS statik kayitlarini bir CSV'ye aktar (WINS sunucusunda calistir)
$winsEntries = @(
    @{Name="fileserver"; IP="192.168.10.50"},
    @{Name="printserver"; IP="192.168.10.51"},
    @{Name="intranet"; IP="192.168.10.60"}
)

# Her kayit icin once A kaydinin FQDN'ini bul, sonra CNAME ekle
foreach ($entry in $winsEntries) {
    $fqdn = (Resolve-DnsName -Name $entry.IP -Type PTR -ErrorAction SilentlyContinue).NameHost
    if ($fqdn) {
        Add-DnsServerResourceRecord -ZoneName "GlobalNames" `
            -CName -Name $entry.Name `
            -HostNameAlias "$fqdn." `
            -TimeToLive 00:15:00
        Write-Host "Eklendi: $($entry.Name) -> $fqdn"
    } else {
        Write-Host "UYARI: $($entry.Name) icin PTR kaydi bulunamadi, IP: $($entry.IP)"
    }
}

Bu script’i çalıştırdıktan sonra tüm kayıtları doğrulamak için:

Get-DnsServerResourceRecord -ZoneName "GlobalNames" | 
    Where-Object {$_.RecordType -eq "CNAME"} | 
    ForEach-Object {
        $cname = $_.RecordData.HostNameAlias
        $resolved = Resolve-DnsName -Name $cname -ErrorAction SilentlyContinue
        [PSCustomObject]@{
            ShortName = $_.HostName
            CNAME = $cname
            Resolved = if ($resolved) { "OK" } else { "HATA" }
            IP = ($resolved | Where-Object {$_.Type -eq "A"}).IPAddress
        }
    } | Format-Table

Bu yaklaşımla 150 kaydı yaklaşık 20 dakikada GNZ’ye taşıdım. WINS’i bir hafta daha açık bıraktım, herhangi bir sorun çıkmadı, sonra kapattım.

Multi-Forest Ortamda GNZ

GNZ’nin gerçekten parladığı yer multi-forest senaryolarıdır. Diyelim ki sirket-a.local ve sirket-b.local diye iki forest’ınız var ve her iki taraftaki kullanıcılar ortak sunuculara erişiyor. Normalde DNS suffix search list ile bu çözülebilir ama tek isimli erişim için GNZ çok daha temiz bir çözüm sunar.

Her iki forest’taki DNS sunucularında ayrı ayrı GNZ zone’u oluşturmanız gerekir. Ama AD replikasyonu forest sınırını aşmaz, bu yüzden zone içeriklerini senkron tutmak için ya manuel yönetim ya da bir script gerekir.

Basit bir senkronizasyon yaklaşımı:

# Forest-A'daki GNZ kayitlarini al ve Forest-B'ye aktar
$sourceServer = "dns01.sirket-a.local"
$targetServer = "dns01.sirket-b.local"

$sourceRecords = Get-DnsServerResourceRecord -ZoneName "GlobalNames" -ComputerName $sourceServer |
    Where-Object {$_.RecordType -eq "CNAME" -and $_.HostName -ne "@"}

foreach ($record in $sourceRecords) {
    $exists = Get-DnsServerResourceRecord -ZoneName "GlobalNames" -ComputerName $targetServer `
        -Name $record.HostName -RRType CNAME -ErrorAction SilentlyContinue
    
    if (-not $exists) {
        Add-DnsServerResourceRecord -ZoneName "GlobalNames" -ComputerName $targetServer `
            -CName -Name $record.HostName `
            -HostNameAlias $record.RecordData.HostNameAlias `
            -TimeToLive $record.TimeToLive
        Write-Host "Forest-B'ye eklendi: $($record.HostName)"
    }
}

Sık Yapılan Hatalar ve Çözümleri

Yıllar içinde bu konuda birçok hata gördüm, en sık karşılaşılanları şöyle sıralayayım:

CNAME hedefi olarak IP adresi girmek: GlobalNames zone sadece CNAME kabul eder, A kaydı kabul etmez. CNAME hedefi de IP olamaz, mutlaka FQDN olmalıdır. Bunu es geçip saatler harcayanları gördüm.

GNZ desteğini sadece bir sunucuda açmak: Yukarıda da belirttim ama tekrar vurgulayayım. Tüm DNS sunucularında Set-DnsServerGlobalNameZone -Enable $true çalıştırılmalı.

Zone adını yanlış yazmak: Zone adı büyük-küçük harf duyarlı: GlobalNames. globalnames veya GLOBALNAMES çalışmaz.

CNAME hedefinde son noktayı unutmak: dosyasunucusu01.sirket.local. şeklinde nokta ile bitmelidir. Nokta olmadan DNS, bunu bir relative name olarak yorumlayabilir.

Zone replikasyon scope’unu yanlış seçmek: Domain yerine Forest seçmeniz gereken durumda Domain seçerseniz, diğer domainlerdeki DNS sunucuları bu zone’u görmez.

GNZ Yönetimini Kolaylaştıran Yardımcı Script

Günlük yönetim için kullandığım basit bir yönetim fonksiyonu:

function Manage-GNZRecord {
    param(
        [Parameter(Mandatory=$true)]
        [ValidateSet("Add","Remove","List","Test")]
        [string]$Action,
        
        [string]$ShortName,
        [string]$TargetFQDN,
        [string]$DnsServer = "localhost"
    )
    
    switch ($Action) {
        "Add" {
            if (-not $ShortName -or -not $TargetFQDN) {
                Write-Error "Add icin ShortName ve TargetFQDN gerekli"
                return
            }
            $fqdn = if ($TargetFQDN.EndsWith(".")) { $TargetFQDN } else { "$TargetFQDN." }
            Add-DnsServerResourceRecord -ZoneName "GlobalNames" -ComputerName $DnsServer `
                -CName -Name $ShortName -HostNameAlias $fqdn -TimeToLive 00:15:00
            Write-Host "Eklendi: $ShortName -> $fqdn" -ForegroundColor Green
        }
        "Remove" {
            Remove-DnsServerResourceRecord -ZoneName "GlobalNames" -ComputerName $DnsServer `
                -Name $ShortName -RRType CNAME -Force
            Write-Host "Silindi: $ShortName" -ForegroundColor Yellow
        }
        "List" {
            Get-DnsServerResourceRecord -ZoneName "GlobalNames" -ComputerName $DnsServer |
                Where-Object { $_.RecordType -eq "CNAME" } |
                Select-Object HostName, @{N="Hedef";E={$_.RecordData.HostNameAlias}}, TimeToLive
        }
        "Test" {
            $records = Get-DnsServerResourceRecord -ZoneName "GlobalNames" -ComputerName $DnsServer |
                Where-Object { $_.RecordType -eq "CNAME" }
            foreach ($r in $records) {
                $result = Resolve-DnsName -Name $r.RecordData.HostNameAlias -Server $DnsServer -ErrorAction SilentlyContinue
                $status = if ($result) { "OK" } else { "COZUMLENEMEDI" }
                Write-Host "$($r.HostName) -> $($r.RecordData.HostNameAlias): $status" -ForegroundColor $(if ($result) {"Green"} else {"Red"})
            }
        }
    }
}

Kullanımı şöyle:

# Kayit ekle
Manage-GNZRecord -Action Add -ShortName "backup" -TargetFQDN "yedeksunucu01.sirket.local"

# Tum kayitlari listele
Manage-GNZRecord -Action List

# Tum kayitlari test et
Manage-GNZRecord -Action Test

# Kayit sil
Manage-GNZRecord -Action Remove -ShortName "eski-uygulama"

İzleme ve Bakım

GNZ kayıtlarının düzenli bakımını ihmal etmeyin. Sunucu isimleri değişir, IP’ler değişir, CNAME hedefleri geçersiz hale gelir. Yukarıdaki Test fonksiyonunu haftalık bir scheduled task olarak çalıştırıp sonuçları e-posta ile almak iyi bir pratik. Bunun yanı sıra:

  • GNZ kayıtlarını bir CMDB veya Excel tablosunda belgelendirin
  • Sunucu ismi değişikliklerinde GNZ’yi güncelleme adımını change management sürecinize ekleyin
  • TTL değerlerini çok uzun tutmayın; sunucu geçişlerinde sorun çıkarabiliyor. 15-30 dakika makul bir değer

Sonuç

GlobalNames Zone, doğru kullanıldığında kurumsal ağlarda ciddi bir fark yaratıyor. WINS bağımlılığını ortadan kaldırmak, multi-forest ortamlarda tek isimli erişimi sağlamak ve legacy uygulamaları modern DNS altyapısıyla barıştırmak için gerçekten güçlü bir araç. Dinamik kayıt yapamaması ve yalnızca CNAME desteklemesi gibi kısıtlamaları var ama bunları göz önünde bulundurarak tasarım yaparsanız sorun çıkmıyor.

Kurulum süreci aslında oldukça basit; asıl iş kayıt yönetimi ve bakımında. PowerShell ile yönetimi otomatize edin, kayıtları belgeleyin ve düzenli test yapın. Birkaç saat yatırımla WINS’in yarattığı operasyonel yükten kurtulabilirsiniz. Eğer hâlâ WINS üzerinde koşuyorsanız ve sunucularınız Windows Server 2008 ve üstüyse, GlobalNames Zone’u test ortamında denemenizi şiddetle tavsiye ederim.

Bir yanıt yazın

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