Azure DNS Yönetimi: Kapsamlı Rehber

Azure ortamında DNS yönetimi, ilk bakışta “sadece isim çözümleme” gibi görünse de pratikte işlerin çoğunun bu katmanda düğümlendiğini fark ediyorsunuz. Yanlış yapılandırılmış bir DNS kaydı yüzünden saatler harcadım, production ortamında bir servisi erişilemez hale getirdim ve o günden beri Azure DNS’i ciddiye alıyorum. Bu yazıda hem temel kavramları hem de gerçek dünya senaryolarını ele alacağım.

Azure DNS Nedir ve Neden Önemlidir?

Azure DNS, Microsoft’un yönetilen DNS hizmetidir. Kendi DNS sunucunuzu ayağa kaldırmak yerine Azure’un global anycast altyapısını kullanırsınız. Bunun yanında Azure Private DNS ile sanal ağlarınız içinde özel isim çözümleme yapabilirsiniz.

İki temel senaryo var:

  • Public DNS Zones: İnternete açık domainlerin yönetimi. alan-adi.com gibi bir domaini Azure’da barındırırsınız.
  • Private DNS Zones: VNet içindeki kaynaklar için özel DNS çözümlemesi. Örneğin veritabanı sunucunuzun db.internal.company.com adıyla erişilebilir olması.

Azure DNS’in avantajlarından bahsetmek gerekirse: SLA garantisi, Azure Resource Manager entegrasyonu, RBAC ile granüler yetki yönetimi ve Azure CLI/PowerShell/Terraform ile tam otomasyon desteği bunların başında geliyor.

Ön Hazırlık: Gerekli Araçlar

Örneklerin büyük çoğunluğunda Azure CLI kullanacağım. PowerShell örnekleri de ekleyeceğim ama CLI her iki platformda da çalıştığı için tercihim o yönde.

# Azure CLI kurulumu (Ubuntu/Debian)
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash

# Azure'a giriş
az login

# Doğru subscription'da olduğunuzu kontrol edin
az account show --output table

# Gerekiyorsa subscription değiştirin
az account set --subscription "Subscription-ID-veya-Adi"

Public DNS Zone Oluşturma ve Yönetme

Zone Oluşturma

İlk adım bir resource group ve DNS zone oluşturmak. Gerçek dünya senaryosu: Şirketinizin ornekfirma.com domainini Azure DNS’e taşıyorsunuz.

# Resource group oluştur
az group create 
  --name dns-management-rg 
  --location westeurope

# Public DNS zone oluştur
az network dns zone create 
  --resource-group dns-management-rg 
  --name ornekfirma.com

# Zone bilgilerini görüntüle (Name Server'ları buradan alacaksınız)
az network dns zone show 
  --resource-group dns-management-rg 
  --name ornekfirma.com 
  --output json

Zone oluşturulduktan sonra size Azure’un atadığı 4 adet name server verilir. Domain registrar’ınıza (GoDaddy, Namecheap vs.) gidip bu NS kayıtlarını girmeniz gerekiyor. Bu adımı atlamak en sık yapılan hatalardan biri.

DNS Kayıtları Ekleme

Temel kayıt türlerini ekleyelim:

# A kaydı ekle (web sunucusu için)
az network dns record-set a add-record 
  --resource-group dns-management-rg 
  --zone-name ornekfirma.com 
  --record-set-name www 
  --ipv4-address 20.71.45.120 
  --ttl 3600

# CNAME kaydı ekle (blog subdomain için)
az network dns record-set cname set-record 
  --resource-group dns-management-rg 
  --zone-name ornekfirma.com 
  --record-set-name blog 
  --cname www.ornekfirma.com 
  --ttl 3600

# MX kaydı ekle (e-posta için)
az network dns record-set mx add-record 
  --resource-group dns-management-rg 
  --zone-name ornekfirma.com 
  --record-set-name "@" 
  --exchange mail.ornekfirma.com 
  --preference 10 
  --ttl 3600

# TXT kaydı ekle (SPF için)
az network dns record-set txt add-record 
  --resource-group dns-management-rg 
  --zone-name ornekfirma.com 
  --record-set-name "@" 
  --value "v=spf1 include:spf.protection.outlook.com -all" 
  --ttl 3600

# Tüm kayıtları listele
az network dns record-set list 
  --resource-group dns-management-rg 
  --zone-name ornekfirma.com 
  --output table

Alias Kayıtları (Azure’a Özgü)

Azure DNS’in en güçlü özelliklerinden biri Alias Record Set’ler. Bir A kaydını doğrudan bir Azure kaynağına (Traffic Manager, Load Balancer, CDN endpoint) bağlayabiliyorsunuz. IP değişse bile kaydı güncellemeniz gerekmiyor.

# Traffic Manager profilini alias olarak ekle
az network dns record-set a create 
  --resource-group dns-management-rg 
  --zone-name ornekfirma.com 
  --name app 
  --target-resource "/subscriptions/SUBSCRIPTION_ID/resourceGroups/dns-management-rg/providers/Microsoft.Network/trafficManagerProfiles/ornekfirma-tm" 
  --ttl 300

Bu özellik özellikle zone apex (root domain) için kritik. Çoğu DNS sağlayıcısı root domain için CNAME kullanamaz ama Azure’un Alias kayıtları bu sorunu çözüyor.

Private DNS Zone Yönetimi

Gerçek dünya senaryosu: Şirkette 3 farklı VNet var. Uygulama sunucuları, veritabanı sunucuları ve bir de yönetim VNet’i. Bu sunucuların birbirleriyle özel isimler üzerinden haberleşmesini istiyoruz.

Private Zone Oluşturma ve VNet Bağlama

# Private DNS zone oluştur
az network private-dns zone create 
  --resource-group dns-management-rg 
  --name "internal.ornekfirma.com"

# VNet oluştur (zaten varsa bu adımı atlayın)
az network vnet create 
  --resource-group dns-management-rg 
  --name app-vnet 
  --address-prefix 10.0.0.0/16 
  --location westeurope

# Private zone'u VNet'e bağla (registration enabled = otomatik kayıt)
az network private-dns link vnet create 
  --resource-group dns-management-rg 
  --zone-name "internal.ornekfirma.com" 
  --name app-vnet-link 
  --virtual-network app-vnet 
  --registration-enabled true

# İkinci bir VNet için sadece çözümleme (registration olmadan)
az network private-dns link vnet create 
  --resource-group dns-management-rg 
  --zone-name "internal.ornekfirma.com" 
  --name mgmt-vnet-link 
  --virtual-network mgmt-vnet 
  --registration-enabled false

registration-enabled true seçeneği önemli: Bu VNet içinde oluşturulan VM’ler otomatik olarak private DNS zone’a kayıt olur. Yani app-server-01.internal.ornekfirma.com gibi bir kayıt otomatik oluşur.

Private Zone’a Manuel Kayıt Ekleme

Bazı durumlarda otomatik kayıt yetmez, özellikle load balancer’lar veya PaaS servisleri için:

# Veritabanı sunucusu için A kaydı
az network private-dns record-set a add-record 
  --resource-group dns-management-rg 
  --zone-name "internal.ornekfirma.com" 
  --record-set-name "db-primary" 
  --ipv4-address 10.0.1.50

# Uygulama load balancer'ı için
az network private-dns record-set a add-record 
  --resource-group dns-management-rg 
  --zone-name "internal.ornekfirma.com" 
  --record-set-name "app-lb" 
  --ipv4-address 10.0.2.100

# Kayıtları kontrol et
az network private-dns record-set list 
  --resource-group dns-management-rg 
  --zone-name "internal.ornekfirma.com" 
  --output table

Azure Private Endpoint ile DNS Entegrasyonu

Bu konu çoğu zaman göz ardı ediliyor ama production ortamlarında en kritik noktalardan biri. Bir Azure Storage Account veya SQL Database için Private Endpoint oluşturduğunuzda DNS çözümleme de düzgün yapılandırılmaz ise trafik hâlâ public internet üzerinden gider.

# Storage Account private endpoint oluştur
az network private-endpoint create 
  --name storage-private-endpoint 
  --resource-group dns-management-rg 
  --vnet-name app-vnet 
  --subnet default 
  --private-connection-resource-id "/subscriptions/SUBSCRIPTION_ID/resourceGroups/dns-management-rg/providers/Microsoft.Storage/storageAccounts/ornekdepolama" 
  --group-id blob 
  --connection-name storage-blob-connection

# Private DNS zone for blob storage
az network private-dns zone create 
  --resource-group dns-management-rg 
  --name "privatelink.blob.core.windows.net"

# Zone'u VNet'e bağla
az network private-dns link vnet create 
  --resource-group dns-management-rg 
  --zone-name "privatelink.blob.core.windows.net" 
  --name storage-dns-link 
  --virtual-network app-vnet 
  --registration-enabled false

# DNS zone group oluştur (private endpoint ile zone'u ilişkilendir)
az network private-endpoint dns-zone-group create 
  --resource-group dns-management-rg 
  --endpoint-name storage-private-endpoint 
  --name storage-dns-zone-group 
  --private-dns-zone "privatelink.blob.core.windows.net" 
  --zone-name blob

Bu yapılandırma sonrasında VNet içindeki herhangi bir kaynaktan ornekdepolama.blob.core.windows.net adresini çözümlediğinizde private IP adresi döner ve trafik Azure backbone üzerinden gider.

Toplu DNS Yönetimi: Terraform ile Altyapı Kodu

Büyük ortamlarda Azure CLI ile tek tek kayıt eklemek sürdürülebilir değil. Terraform ile tüm DNS yapısını kod olarak yönetmek çok daha mantıklı.

# Terraform DNS zone ve kayıt tanımı (main.tf dosyası)
cat << 'EOF' > dns_zone.tf
resource "azurerm_dns_zone" "main" {
  name                = "ornekfirma.com"
  resource_group_name = azurerm_resource_group.dns_rg.name
}

resource "azurerm_dns_a_record" "www" {
  name                = "www"
  zone_name           = azurerm_dns_zone.main.name
  resource_group_name = azurerm_resource_group.dns_rg.name
  ttl                 = 3600
  records             = ["20.71.45.120"]
}

resource "azurerm_dns_cname_record" "api" {
  name                = "api"
  zone_name           = azurerm_dns_zone.main.name
  resource_group_name = azurerm_resource_group.dns_rg.name
  ttl                 = 300
  record              = "api-gateway.westeurope.cloudapp.azure.com"
}

resource "azurerm_private_dns_zone" "internal" {
  name                = "internal.ornekfirma.com"
  resource_group_name = azurerm_resource_group.dns_rg.name
}

resource "azurerm_private_dns_zone_virtual_network_link" "app_vnet" {
  name                  = "app-vnet-link"
  resource_group_name   = azurerm_resource_group.dns_rg.name
  private_dns_zone_name = azurerm_private_dns_zone.internal.name
  virtual_network_id    = azurerm_virtual_network.app.id
  registration_enabled  = true
}
EOF

# Plan ve uygula
terraform init
terraform plan -out=dns.tfplan
terraform apply dns.tfplan

DNS Sorun Giderme

Temel Kontroller

Gündelik hayatta en çok karşılaşılan sorun: Kayıt eklenmiş ama çözümlenmiyor. İşte hızlı kontrol listesi:

# Zone'daki tüm kayıtları listele
az network dns record-set list 
  --resource-group dns-management-rg 
  --zone-name ornekfirma.com 
  --query "[].{Name:name, Type:type, TTL:ttl}" 
  --output table

# Belirli bir kaydı sorgula
az network dns record-set a show 
  --resource-group dns-management-rg 
  --zone-name ornekfirma.com 
  --name www

# dig ile DNS çözümlemeyi test et
dig www.ornekfirma.com @ns1-01.azure-dns.com

# nslookup ile test (Windows/Linux)
nslookup www.ornekfirma.com ns1-01.azure-dns.com

# Private DNS için VNet içinden test (bir VM üzerinde)
resolvectl query db-primary.internal.ornekfirma.com

Private DNS Sorunlarında Ek Kontroller

Private DNS sorunları public DNS’e göre daha karmaşık olabiliyor:

# VNet link durumunu kontrol et
az network private-dns link vnet show 
  --resource-group dns-management-rg 
  --zone-name "internal.ornekfirma.com" 
  --name app-vnet-link 
  --query "virtualNetworkLinkState"

# VM'in hangi DNS sunucusunu kullandığını kontrol et
# (VM içinde çalıştırın)
cat /etc/resolv.conf

# Azure'un sanal DNS resolver'ı 168.63.129.16 olmalı
# Farklı bir IP görüyorsanız custom DNS sorunu var
nslookup db-primary.internal.ornekfirma.com 168.63.129.16

RBAC ile DNS Yönetimi Yetkilerinin Kontrolü

Büyük ekiplerde DNS kayıtlarını herkesin değiştirememesi gerekir. Azure’un built-in rolleri var ama ihtiyaca göre custom rol da oluşturabilirsiniz.

# DNS Zone Contributor rolünü belirli bir kullanıcıya ver
az role assignment create 
  --assignee [email protected] 
  --role "DNS Zone Contributor" 
  --scope "/subscriptions/SUBSCRIPTION_ID/resourceGroups/dns-management-rg/providers/Microsoft.Network/dnsZones/ornekfirma.com"

# Sadece belirli zone üzerinde okuma yetkisi ver
az role assignment create 
  --assignee "service-principal-object-id" 
  --role "DNS Zone Reader" 
  --scope "/subscriptions/SUBSCRIPTION_ID/resourceGroups/dns-management-rg/providers/Microsoft.Network/dnsZones/ornekfirma.com"

# Mevcut rol atamalarını listele
az role assignment list 
  --scope "/subscriptions/SUBSCRIPTION_ID/resourceGroups/dns-management-rg" 
  --output table

DNS Yedekleme ve Dışa Aktarma

Azure Portal DNS kayıtlarını export etme özelliği sunuyor ama CLI ile de yapabilirsiniz. Özellikle DR senaryoları için kritik.

# Tüm DNS kayıtlarını JSON olarak yedekle
az network dns record-set list 
  --resource-group dns-management-rg 
  --zone-name ornekfirma.com 
  --output json > dns_backup_$(date +%Y%m%d).json

# Yedekten belirli kayıt tiplerini filtrele
az network dns record-set list 
  --resource-group dns-management-rg 
  --zone-name ornekfirma.com 
  --query "[?type=='Microsoft.Network/dnszones/A']" 
  --output json

# Zone'u başka bir subscription'a kopyalamak için
# Önce kayıtları dışa aktar, sonra hedef zone'a import et
az network dns zone export 
  --resource-group dns-management-rg 
  --name ornekfirma.com 
  --output-file ornekfirma_zone_backup.txt

Pratik Senaryolar ve İpuçları

Senaryo 1: Domain Taşıma (Zero Downtime)

Mevcut bir domaini başka bir DNS sağlayıcısından Azure’a taşırken dikkat edilecekler:

  • Önce Azure’da zone’u oluşturun ve tüm kayıtları ekleyin
  • TTL değerlerini taşımadan 24-48 saat önce düşürün (300 saniye idealdir)
  • NS kayıtlarını değiştirmeden önce Azure name server’larından çözümlemeyi test edin
  • Taşıma sonrası eski TTL değerlerine geri dönün

Senaryo 2: Disaster Recovery için Çoklu Bölge DNS

# İkinci bir bölgede aynı zone için secondary kayıtlar
# Traffic Manager ile coğrafi yönlendirme
az network traffic-manager profile create 
  --resource-group dns-management-rg 
  --name ornekfirma-geo-tm 
  --routing-method Geographic 
  --unique-dns-name ornekfirma-geo 
  --monitor-protocol HTTPS 
  --monitor-port 443 
  --monitor-path "/health"

# Birincil bölge endpoint
az network traffic-manager endpoint create 
  --resource-group dns-management-rg 
  --profile-name ornekfirma-geo-tm 
  --name primary-west-europe 
  --type externalEndpoints 
  --target "app-westeurope.ornekfirma.com" 
  --endpoint-location westeurope 
  --geo-mapping "GEO-EU"

# Disaster recovery endpoint
az network traffic-manager endpoint create 
  --resource-group dns-management-rg 
  --profile-name ornekfirma-geo-tm 
  --name dr-north-europe 
  --type externalEndpoints 
  --target "app-northeurope.ornekfirma.com" 
  --endpoint-location northeurope 
  --geo-mapping "WORLD"

Sık Yapılan Hatalar

  • NS kayıtlarını registrar’da güncellememek: Zone oluşturuldu, kayıtlar eklendi ama domain hâlâ eski DNS’e bakıyor. En klasik hata.
  • Private endpoint DNS entegrasyonunu atlamak: Private endpoint var ama DNS zone group yok. Sonuç: Trafik public IP’ye gidiyor.
  • Yüksek TTL ile anlık değişiklik beklemek: 24 saatlik TTL varken kaydı güncelleyip 5 dakika sonra neden çalışmıyor diye soruşturmak.
  • Registration enabled VNet’e duplicate kayıt eklemek: Otomatik kayıt açık olan VNet’e manuel de aynı isimle kayıt eklenince çakışma oluyor.
  • CNAME ile root domain kullanmaya çalışmak: Root domain için mutlaka Alias Record veya A kaydı kullanın.

Azure DNS Monitoring

DNS sorgularını ve zone değişikliklerini izlemek için Azure Monitor entegrasyonu kullanabilirsiniz:

# DNS zone için diagnostic settings ekle
az monitor diagnostic-settings create 
  --name dns-diagnostics 
  --resource "/subscriptions/SUBSCRIPTION_ID/resourceGroups/dns-management-rg/providers/Microsoft.Network/dnsZones/ornekfirma.com" 
  --logs '[{"category": "DnsAuditLogs", "enabled": true}]' 
  --workspace "/subscriptions/SUBSCRIPTION_ID/resourceGroups/dns-management-rg/providers/Microsoft.OperationalInsights/workspaces/dns-log-workspace"

# Log Analytics workspace oluştur (yoksa)
az monitor log-analytics workspace create 
  --resource-group dns-management-rg 
  --workspace-name dns-log-workspace 
  --location westeurope

Audit logları sayesinde kim hangi kaydı ne zaman değiştirdi görebiliyorsunuz. Prodüksiyon ortamlarında bu özelliği mutlaka açın.

Sonuç

Azure DNS, sadece kayıt ekleyip çıktığınız bir servis değil. Public zone yönetiminden private endpoint entegrasyonuna, RBAC’ten DR senaryolarına kadar geniş bir yelpazede doğru yapılandırılması gereken bir bileşen. Özellikle private DNS ve private endpoint entegrasyonu konusu çoğu zaman atlanan ama security ve network izolasyonu açısından kritik bir alan.

Terraform ile altyapıyı kod olarak yönetmek, özellikle onlarca kaydın bulunduğu ortamlarda hem tutarlılık hem de denetlenebilirlik açısından çok değerli. Manuel değişikliklere karşı GitOps yaklaşımı ve audit loglarının birleşimi, DNS katmanında tam görünürlük sağlar.

Son olarak şunu söyleyeyim: TTL değerlerini ciddiye alın. Değişiklik yapmadan önce TTL’yi düşürmek, özellikle domain taşıma veya IP değişikliği gibi senaryolarda sizi saatlerlik cacheden kaynaklanan sorundan kurtarır. Bu küçük ama hayat kurtaran bir alışkanlık.

Bir yanıt yazın

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