DNS altyapısı söz konusu olduğunda PowerDNS, esnekliği ve güçlü backend desteğiyle özellikle kurumsal ortamlarda tercih edilen bir çözüm haline geldi. Bind’ın flat dosya yapısına alışkın olanlar için başta biraz yabancı gelebilir, ancak PowerDNS’in veritabanı tabanlı zone yönetimi bir kez kurulup anlaşıldığında geri dönmek istemiyorsunuz. Bu yazıda PowerDNS Authoritative Server üzerinde zone yönetimini, pratik senaryolarla ve gerçek komut örnekleriyle ele alacağız.
PowerDNS Authoritative Server Nedir ve Neden Tercih Edilir?
PowerDNS Authoritative Server (pdns), yetkili DNS sunucusu olarak çalışır. Recursive resolver olan Recursor bileşeniyle karıştırmamak gerekiyor. Authoritative Server, elinizdeki zone verilerini dış dünyaya sunar; hangi domain’in hangi IP’ye işaret ettiğini, MX kayıtlarını, TXT kayıtlarını ve diğerlerini bilir ve sorgulara cevap verir.
Neden PowerDNS tercih edilir:
- Veritabanı backend desteği: MySQL, PostgreSQL, SQLite, LDAP gibi pek çok backend ile çalışabilir
- API desteği: REST API üzerinden zone ve kayıt yönetimi mümkün
- Native replication: Master-slave replikasyonu kolayca kurulabilir
- Scripting: Lua ile dinamik DNS yanıtları üretilebilir
- Performans: Yüksek sorgu yükü altında stabil kalır
Kurulum
Ubuntu/Debian üzerinde kurulum oldukça basit:
# Önce sistem paket listesini güncelle
apt update
# PowerDNS Authoritative Server ve MySQL backend kurulumu
apt install -y pdns-server pdns-backend-mysql
# Servis durumunu kontrol et
systemctl status pdns
CentOS/RHEL tabanlı sistemlerde:
# PowerDNS repo ekle
curl -o /etc/yum.repos.d/powerdns-auth-48.repo
https://repo.powerdns.com/repo-files/el-auth-48.repo
# Kurulum
dnf install -y pdns pdns-backend-mysql
# Servisi başlat ve enable et
systemctl enable --now pdns
Kurulum sonrasında systemd-resolved veya başka bir DNS servisi 53. portu tutuyorsa çakışma yaşarsınız. Bunu kontrol etmek için:
ss -tulnp | grep :53
Eğer systemd-resolved çakışıyorsa şu adımları izleyin:
# systemd-resolved'un stub listener'ını kapat
echo "DNSStubListener=no" >> /etc/systemd/resolved.conf
systemctl restart systemd-resolved
# resolv.conf'u güncelle
ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
MySQL Backend Yapılandırması
PowerDNS’in en yaygın kullanılan backend’i MySQL’dir. Önce veritabanını hazırlayalım:
# MySQL'e giriş yap
mysql -u root -p
# Veritabanı ve kullanıcı oluştur
CREATE DATABASE pdns CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'pdns'@'localhost' IDENTIFIED BY 'guclu_bir_sifre';
GRANT ALL PRIVILEGES ON pdns.* TO 'pdns'@'localhost';
FLUSH PRIVILEGES;
EXIT;
# Şema dosyasını yükle (yol dağıtıma göre değişebilir)
mysql -u pdns -p pdns < /usr/share/doc/pdns-backend-mysql/schema.mysql.sql
Şimdi PowerDNS yapılandırma dosyasını düzenleyelim:
# Ana yapılandırma dosyası
cat > /etc/powerdns/pdns.conf << 'EOF'
# Dinlenecek arayüz ve port
local-address=0.0.0.0
local-port=53
# Backend seçimi
launch=gmysql
# MySQL bağlantı ayarları
gmysql-host=127.0.0.1
gmysql-port=3306
gmysql-dbname=pdns
gmysql-user=pdns
gmysql-password=guclu_bir_sifre
# API ayarları
api=yes
api-key=supersecretapikey
webserver=yes
webserver-address=127.0.0.1
webserver-port=8081
webserver-allow-from=127.0.0.1,::1
# Log seviyesi
loglevel=4
# Security ayarları
setuid=pdns
setgid=pdns
EOF
# Servisi yeniden başlat
systemctl restart pdns
systemctl status pdns
Zone Oluşturma ve Yönetimi
pdnsutil ile Zone Yönetimi
PowerDNS’in en güçlü komut satırı aracı pdnsutil‘dir. Zone oluşturmaktan DNSSEC’e kadar her şeyi bu araçla yapabilirsiniz.
# Yeni bir zone oluştur (native mod - replikasyon yok)
pdnsutil create-zone ornek.com.tr
# Zone'u master olarak oluştur (slave sunuculara notify gönderir)
pdnsutil create-zone ornek.com.tr master
# Zone'un SOA kaydını kontrol et
pdnsutil show-zone ornek.com.tr
Zone oluşturduktan sonra temel kayıtları ekleyelim. Gerçek bir senaryo düşünelim: Yeni kurulan bir e-ticaret sitesi için DNS kayıtlarını yapılandırıyoruz.
# SOA kaydını güncelle (zaten otomatik oluşur ama düzenleyelim)
pdnsutil replace-rrset ornek.com.tr ornek.com.tr SOA
"ns1.ornek.com.tr. hostmaster.ornek.com.tr. 2024010101 3600 900 604800 300"
# A kayıtları ekle
pdnsutil add-record ornek.com.tr ornek.com.tr A 300 "185.100.20.10"
pdnsutil add-record ornek.com.tr www A 300 "185.100.20.10"
pdnsutil add-record ornek.com.tr mail A 300 "185.100.20.20"
pdnsutil add-record ornek.com.tr ns1 A 300 "185.100.20.1"
pdnsutil add-record ornek.com.tr ns2 A 300 "185.100.20.2"
# NS kayıtları
pdnsutil add-record ornek.com.tr ornek.com.tr NS 3600 "ns1.ornek.com.tr."
pdnsutil add-record ornek.com.tr ornek.com.tr NS 3600 "ns2.ornek.com.tr."
# MX kaydı ekle
pdnsutil add-record ornek.com.tr ornek.com.tr MX 3600 "10 mail.ornek.com.tr."
# TXT kayıtları (SPF ve domain doğrulama için)
pdnsutil add-record ornek.com.tr ornek.com.tr TXT 300
""v=spf1 ip4:185.100.20.20 include:_spf.google.com ~all""
# DMARC kaydı
pdnsutil add-record ornek.com.tr _dmarc TXT 3600
""v=DMARC1; p=quarantine; rua=mailto:[email protected]""
# Zone'u listele
pdnsutil list-zone ornek.com.tr
Zone Kayıtlarını Toplu Yükleme
Bind formatındaki zone dosyalarını PowerDNS’e aktarmak mümkün. Özellikle migration senaryolarında bu çok işe yarıyor:
# Mevcut bind zone dosyasını PowerDNS'e aktar
pdnsutil load-zone ornek.com.tr /tmp/ornek.com.tr.zone
# Aktar ve hataları görmek için verbose mod
pdnsutil load-zone ornek.com.tr /tmp/ornek.com.tr.zone 2>&1 | tee /var/log/zone-import.log
# Zone'u bind formatında dışa aktar
pdnsutil export-zone ornek.com.tr > /tmp/ornek_backup.zone
REST API ile Programatik Zone Yönetimi
PowerDNS API’si özellikle otomasyon senaryolarında vazgeçilmez hale gelir. Yüzlerce domain yönetiyorsanız veya CI/CD pipeline’ınıza DNS güncellemelerini entegre etmek istiyorsanız API tam size göre.
# Sunucu bilgisini al
curl -s -H "X-API-Key: supersecretapikey"
http://127.0.0.1:8081/api/v1/servers/localhost | python3 -m json.tool
# Tüm zone'ları listele
curl -s -H "X-API-Key: supersecretapikey"
http://127.0.0.1:8081/api/v1/servers/localhost/zones | python3 -m json.tool
# Yeni zone oluştur
curl -s -X POST
-H "X-API-Key: supersecretapikey"
-H "Content-Type: application/json"
http://127.0.0.1:8081/api/v1/servers/localhost/zones
-d '{
"name": "yenidomain.com.tr.",
"kind": "Native",
"nameservers": ["ns1.ornek.com.tr.", "ns2.ornek.com.tr."]
}'
# Kayıt ekle veya güncelle (PATCH metodu ile)
curl -s -X PATCH
-H "X-API-Key: supersecretapikey"
-H "Content-Type: application/json"
http://127.0.0.1:8081/api/v1/servers/localhost/zones/yenidomain.com.tr.
-d '{
"rrsets": [
{
"name": "www.yenidomain.com.tr.",
"type": "A",
"ttl": 300,
"changetype": "REPLACE",
"records": [
{
"content": "192.168.1.100",
"disabled": false
}
]
}
]
}'
Master-Slave Replikasyon Kurulumu
Gerçek üretim ortamlarında tek nameserver asla yeterli değil. Master-slave yapısını kuralım.
Master sunucu yapılandırması (/etc/powerdns/pdns.conf):
# Master sunucu ek ayarları
master=yes
also-notify=185.100.20.2 # Slave IP
allow-axfr-ips=185.100.20.2 # Sadece slave'in zone transferine izin ver
Slave sunucu yapılandırması:
# Slave sunucu pdns.conf
slave=yes
slave-cycle-interval=60
# Master sunucu adresini zone'a ekle (pdnsutil ile)
# Slave sunucuda çalıştır:
pdnsutil create-zone ornek.com.tr slave
pdnsutil change-slave-zone-metadata ornek.com.tr MASTERS "185.100.20.1"
# Zone transferini manuel tetikle
pdns_control retrieve ornek.com.tr
Master üzerinde zone’a slave’i tanıt:
# Master'da slave bilgisini ekle
pdnsutil add-slave-zone ornek.com.tr 185.100.20.2
# Notify gönder
pdns_control notify ornek.com.tr
DNSSEC Yapılandırması
DNSSEC bugün artık bir lüks değil, güvenlik açısından kritik bir gereklilik. PowerDNS ile DNSSEC kurulumu oldukça basit:
# Zone için DNSSEC'i etkinleştir
pdnsutil secure-zone ornek.com.tr
# Anahtar bilgilerini görüntüle
pdnsutil show-zone ornek.com.tr
# DS kaydını al (registrar'a verilecek)
pdnsutil export-zone-ds ornek.com.tr
# NSEC veya NSEC3 kullanımı
pdnsutil set-nsec3 ornek.com.tr
# DNSSEC doğrulama yap
pdnsutil check-zone ornek.com.tr
# Periyodik key rollover için mevcut anahtarları listele
pdnsutil list-keys ornek.com.tr
Önemli bir nokta: DNSSEC’i etkinleştirdikten sonra registrar’ınızın panelinden DS kaydını domain kaydınıza eklemeniz gerekiyor. pdnsutil export-zone-ds çıktısını alıp registrar’a gireceksiniz.
Yaygın Sorunlar ve Çözümleri
Zone Seri Numarası Güncelleme
Kayıt eklediğinizde SOA seri numarasının otomatik artmaması bazen sorun çıkarır. Özellikle slave sunucular güncellemeyi fark etmeyebilir:
# SOA seri numarasını manuel artır
pdnsutil increase-serial ornek.com.tr
# Sonucu kontrol et
pdnsutil show-zone ornek.com.tr | grep SOA
# Slave'lere notify gönder
pdns_control notify ornek.com.tr
Sorgu Testi ve Hata Ayıklama
# Zone'un doğru cevap verip vermediğini test et
dig @127.0.0.1 ornek.com.tr SOA
dig @127.0.0.1 www.ornek.com.tr A
dig @127.0.0.1 ornek.com.tr MX
# DNSSEC doğrulama testi
dig @127.0.0.1 ornek.com.tr DNSKEY +dnssec
dig @127.0.0.1 www.ornek.com.tr A +dnssec
# Zone transferini test et
dig @185.100.20.1 ornek.com.tr AXFR
# PowerDNS loglarını takip et
journalctl -u pdns -f
# Veritabanındaki kayıtları direkt kontrol et
mysql -u pdns -p pdns -e "
SELECT d.name as zone, r.name, r.type, r.content, r.ttl
FROM domains d
JOIN records r ON r.domain_id = d.id
WHERE d.name = 'ornek.com.tr'
ORDER BY r.type, r.name;"
Performans Ayarı
Yüksek sorgu yükü altında birkaç ayar hayat kurtarır:
# pdns.conf'a eklenecek performans ayarları
cat >> /etc/powerdns/pdns.conf << 'EOF'
# Thread sayısı (CPU core sayısına göre ayarla)
receiver-threads=4
distributor-threads=3
# Cache ayarları
cache-ttl=20
query-cache-ttl=20
negquery-cache-ttl=60
# Paket cache
packetcache-ttl=20
packetcache-negative-ttl=60
# Max sorgu boyutu
max-tcp-connections=200
EOF
systemctl restart pdns
Yedekleme ve Disaster Recovery
Veritabanı tabanlı çalıştığı için yedekleme stratejisi hem basit hem de kritik:
#!/bin/bash
# PowerDNS zone yedekleme scripti
# /usr/local/bin/pdns-backup.sh
BACKUP_DIR="/var/backups/pdns"
DATE=$(date +%Y%m%d_%H%M%S)
MYSQL_USER="pdns"
MYSQL_PASS="guclu_bir_sifre"
MYSQL_DB="pdns"
mkdir -p "$BACKUP_DIR"
# MySQL dump al
mysqldump -u "$MYSQL_USER" -p"$MYSQL_PASS"
--single-transaction
--routines
"$MYSQL_DB" > "$BACKUP_DIR/pdns_full_$DATE.sql"
# Zone'ları ayrı ayrı bind formatında yedekle
for zone in $(pdnsutil list-all-zones 2>/dev/null | grep -v "^$"); do
pdnsutil export-zone "$zone" > "$BACKUP_DIR/${zone%%.}_$DATE.zone" 2>/dev/null
done
# 7 günden eski yedekleri temizle
find "$BACKUP_DIR" -name "*.sql" -mtime +7 -delete
find "$BACKUP_DIR" -name "*.zone" -mtime +7 -delete
echo "Yedekleme tamamlandi: $DATE"
# Script'i çalıştırılabilir yap
chmod +x /usr/local/bin/pdns-backup.sh
# Cron'a ekle (her gece 02:00'de)
echo "0 2 * * * root /usr/local/bin/pdns-backup.sh >> /var/log/pdns-backup.log 2>&1"
>> /etc/cron.d/pdns-backup
Zone Şablonu ile Hızlı Domain Ekleme
Onlarca domain yönetiyorsanız her seferinde kayıtları tek tek girmek yerine bir şablon scripti hazırlamak mantıklı:
#!/bin/bash
# Yeni domain eklemek için şablon script
# Kullanim: ./add-domain.sh domain.com.tr "185.100.20.10" "185.100.20.20"
DOMAIN=$1
WEB_IP=$2
MAIL_IP=${3:-$2}
NS1="ns1.hosting.com.tr"
NS2="ns2.hosting.com.tr"
SERIAL=$(date +%Y%m%d01)
if [ -z "$DOMAIN" ] || [ -z "$WEB_IP" ]; then
echo "Kullanim: $0 <domain> <web_ip> [mail_ip]"
exit 1
fi
echo "Domain ekleniyor: $DOMAIN"
# Zone oluştur
pdnsutil create-zone "$DOMAIN"
# SOA kaydını güncelle
pdnsutil replace-rrset "$DOMAIN" "$DOMAIN" SOA
"$NS1. hostmaster.$DOMAIN. $SERIAL 3600 900 604800 300"
# Temel kayıtlar
pdnsutil add-record "$DOMAIN" "$DOMAIN" A 300 "$WEB_IP"
pdnsutil add-record "$DOMAIN" www A 300 "$WEB_IP"
pdnsutil add-record "$DOMAIN" mail A 300 "$MAIL_IP"
pdnsutil add-record "$DOMAIN" "$DOMAIN" NS 3600 "$NS1."
pdnsutil add-record "$DOMAIN" "$DOMAIN" NS 3600 "$NS2."
pdnsutil add-record "$DOMAIN" "$DOMAIN" MX 3600 "10 mail.$DOMAIN."
pdnsutil add-record "$DOMAIN" "$DOMAIN" TXT 300
""v=spf1 ip4:$MAIL_IP ~all""
# Doğrulama
pdnsutil check-zone "$DOMAIN"
echo "Zone kontrolu tamamlandi."
pdnsutil list-zone "$DOMAIN"
Sonuç
PowerDNS Authoritative Server, veritabanı backend’i ve zengin API desteğiyle geleneksel Bind kurulumlarına kıyasla çok daha esnek bir DNS yönetimi sunuyor. Özellikle birden fazla domain barındıran hosting ortamları, otomasyon gereksinimi olan DevOps ekipleri ve kurumsal altyapılar için güçlü bir tercih.
Bu yazıda ele aldığımız konuları özetlemek gerekirse:
- MySQL backend ile sağlam bir temel kurulumu yaptık
pdnsutilile zone oluşturma, kayıt yönetimi ve DNSSEC yapılandırmasını inceledik- REST API ile programatik zone yönetimini gördük
- Master-slave replikasyonunu pratik olarak kurduk
- Yedekleme ve toplu domain ekleme scriptleri hazırladık
Bir sonraki adım olarak PowerDNS Admin gibi web arayüzlerini veya Lua scripting ile dinamik DNS yanıtlarını incelemenizi öneririm. Özellikle Lua backend, GeoDNS veya yük dengeleme senaryolarında inanılmaz esneklik sağlıyor.
Herhangi bir konuda takılırsanız pdnsutil check-all-zones komutu ve journalctl -u pdns -f log takibi çoğu sorunu hızlıca teşhis etmenizi sağlar. Sorularınızı yorumlara bırakabilirsiniz.