PowerDNS, klasik zone file mantığından farklı olarak DNS kayıtlarını database backend üzerinde tutabilen, API ile yönetilebilen ve modern DNS operasyonlarına daha uygun bir yapı sunan güçlü bir DNS server çözümüdür.
Özellikle çok sayıda domain yönetilen ortamlarda kayıtların manuel dosyalar yerine MariaDB, PostgreSQL veya farklı backend’lerde tutulması ciddi bir yönetim kolaylığı sağlar.
Bu makalemde Ubuntu Server 24.04 üzerinde tek node PowerDNS Authoritative Server kurulumu yapılacaktır.
Kurulumda PowerDNS’in MariaDB/MySQL backend desteği kullanılacak DNS kayıtları database üzerinde saklanacak ve yönetim için hem pdnsutil hem de local HTTP API aktif hale getirilecektir.
Ubuntu Server 24.04’ün resmi paket deposunda pdns-server paketi 4.8.3 sürümüyle gelir PowerDNS kurulumu dağıtım paketleriyle veya PowerDNS’in kendi repository’si üzerinden yapılabilir. Bu makalemde daha sade ve LTS uyumlu olması için Ubuntu repository’si temel alınmıştır.
Kurulacak Yapı Ne Olacak?
Bu kurulumda tek bir Ubuntu Server üzerinde şu bileşenler yer alacaktır;
Ubuntu Server 24.04
│
├── PowerDNS Authoritative Server
│ ├── UDP 53
│ ├── TCP 53
│ └── Local HTTP API: 127.0.0.1:8081
│
└── MariaDB
└── PowerDNS gmysql backend database
Buradaki PowerDNS server Authoritative Server olarak çalışacaktır. Yani yalnızca kendi üzerinde tanımlı domain ve zone kayıtları için cevap verecektir. Örneğin kadirkozan.com zone’u bu sunucuda tanımlıysa www.kadirkozan.com, mail.kadirkozan.com, ns1.kadirkozan.com gibi kayıtlar için cevap döner.
Bu yapı bir Recursor değildir. Yani client’lar bu sunucuya google.com veya openai.com gibi dış domain’leri sorduğunda recursive çözümleme yapması beklenmez. PowerDNS Authoritative Server’ın görevi sahip olduğu zone’lar için kesin DNS cevabı üretmektir.
Tek Node Yapı Ne Zaman Tercih Edilir?
Tek node PowerDNS kurulumu özellikle şu senaryolarda mantıklıdır;
Küçük ölçekli hosting ortamlarında, test ve lab çalışmalarında, tek bir kurumun az sayıda domain yönettiği yapılarda, DNS otomasyonu denemelerinde veya PowerDNS mimarisini öğrenmek için başlangıç ortamlarında kullanılabilir.
Ancak production DNS yapısında tek node önerilen bir mimari değildir. DNS servisinin doğası gereği en az iki farklı nameserver kullanılması daha sağlıklıdır. Örneğin:
ns1.kadirkozan.com -> 192.168.100.10
ns2.kadirkozan.com -> 192.168.100.20
Tek node kullanımda sunucu kapanırsa network erişimi kesilirse veya PowerDNS servisi durursa ilgili domain’lerin DNS cevapları da etkilenir. Bu nedenle bu makaledeki yapı “başlangıç, test veya küçük ölçekli kullanım” için uygundur ilerleyen aşamada secondary node, AXFR, TSIG ve DNSSEC gibi konularla genişletilmelidir.
Kullanılacak Örnek Bilgiler
Makalede örnek olması için aşağıdaki değerleri kullanacağım. Gerçek kurulumda bunları kendi domain ve IP adreslerine göre değiştirmelisin.
Sunucu IP adresi : 192.168.100.10
Hostname : ns1.kadirkozan.com
Yönetilecek domain : kadirkozan.com
PowerDNS database : pdns
Database user : pdns
PowerDNS API adresi : 127.0.0.1:8081
192.168.100.10 dokümantasyonlarda kullanılan örnek IP bloklarından biridir. Gerçek ortamda buraya kendi public IP adresin yazılmalıdır.
Kurulum Öncesi Dikkat Edilmesi Gerekenler
PowerDNS kurulmadan önce birkaç tasarım kararı netleştirilmelidir.
- İlk karar: kurulacak PowerDNS rolüdür. Bu makalede Authoritative Server kurulacaktır. Eğer amaç şirket içindeki kullanıcıların internetteki domain’leri çözmesi ise ayrıca PowerDNS Recursor gerekir. İkisi aynı yazılım ailesinden gelse de görevleri farklıdır.
- İkinci karar backend seçimidir. PowerDNS farklı backend’ler destekler. Küçük testlerde SQLite kullanılabilir, ancak üretime yakın yapılarda MariaDB veya PostgreSQL daha doğru bir tercihtir. PowerDNS’in generic SQL backend yapısı, DNS kayıtlarını SQL database üzerinde saklamak için kullanılır; MySQL/MariaDB backend tarafında kullanılan backend adı
gmysqlolarak geçer.
- Üçüncü karar API erişimidir. PowerDNS’in built-in webserver özelliği JSON/REST API sunar. Bu API ile zone içeriği, DNSSEC key material ve bazı yönetim işlemleri yapılabilir. Bu nedenle API mutlaka güçlü bir key ile korunmalı ve mümkünse sadece localhost üzerinde dinletilmelidir.
İşletim Sisteminin Güncellemesi
Kuruluma başlamadan önce sistemi güncellemek gerekir.
sudo apt update
sudo apt -y upgrade
işletim sistemi güncellemesi tamamlandıktan sonra yeniden başlatılır.

reboot
Sunucu yeniden başladıktan sonra işletim sistemi ismi ve ntp yapılandırılır.
İşletim Sisteminin Adının Değiştirilmesi
PowerDNS gibi DNS altyapısı sunan bir server’da hostname seçimi önemlidir. Hostname yalnızca terminal ekranında görünen bir isim değildir, log kayıtlarında, monitoring sistemlerinde, mail bildirimlerinde, inventory araçlarında ve bazı servislerin local çözümleme davranışında kullanılır.
Bu nedenle PowerDNS server için anlamlı kısa ve DNS rolünü ifade eden bir hostname seçmek daha doğru olur.
Örneğin bu makaledeki senaryoda server’ın hostname değeri şu şekilde ayarlanabilir;
ns1.kadirkozan.com
Ubuntu üzerinde hostname yönetimi için en pratik yöntem hostnamectl komutudur.
hostnamectl systemd tabanlı sistemlerde hostname bilgisini görüntülemek ve değiştirmek için kullanılır. Static hostname kalıcı sistem adıdır ve reboot sonrasında da korunur.
Mevcut hostname’i kontrol etmek için:
hostnamectl
veya daha kısa şekilde:
hostname

Hostname’i değiştirmek için:
hostnamectl set-hostname ns1.kadirkozan.com
Değişiklikten sonra tekrar kontrol edelim:
hostnamectl
Beklenen çıktıda şuna benzer bir satır görülmelidir.

Hostname değiştirildikten sonra /etc/hosts dosyası da güncellenmelidir. Bu dosya güncellenmezse bazı local servisler yeni hostname’i çözerken sorun yaşayabilir. Ubuntu 24.04 üzerinde hostname değişimi yapılırken /etc/hosts içindeki 127.0.1.1 satırının yeni hostname ile uyumlu hale getirilmesi önerilir.
Dosyayı açalım:
nano /etc/hosts
Örnek içerik şu şekilde düzenlenebilir;
Öncesi;

127.0.0.1 localhost
127.0.1.1 ns1.kadirkozan.com ns1
# IPv6 default entries
::1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
Burada iki isim birlikte yazılmıştır:
ns1.example.com -> FQDN
ns1 -> kısa hostname
Bu kullanım pratikte faydalıdır. Bazı komutlar ve servisler kısa hostname’i kullanırken bazıları FQDN bilgisinden yararlanabilir.

Hostname çözümlemesini test etmek için;
hostname
hostname -f
getent hosts ns1.kadirkozan.com
getent hosts ns1
Beklenen çıktı şu mantıkta olmalıdır.

Hostname değişimi genellikle anında uygulanır ancak servislerin tamamının yeni hostname ile sorunsuz çalıştığından emin olmak için kurulum öncesinde bir reboot yapılması temiz bir yaklaşımdır.
reboot
Server yeniden başladıktan sonra tekrar kontrol edilir:
hostnamectl
hostname -f
Bu noktadan sonra PowerDNS kurulumu bu hostname üzerinden devam ettirilebilir.

Zaman Dilimi ve NTP Yapılandırması
DNS server’larda zaman senkronizasyonu kritik öneme sahiptir.
Normal DNS kayıtlarında bile log analizi, troubleshooting, backup zamanlaması ve monitoring için doğru saat bilgisi gerekir.
DNSSEC kullanılacaksa zaman senkronizasyonu daha da önemli hale gelir çünkü DNSSEC imzaları belirli zaman aralıklarına göre geçerli olur.
Ubuntu’da zaman ve tarih ayarları timedatectl ile kontrol edilebilir. Ubuntu dokümantasyonuna göre timedatectl timezone ayarını ve kalıcı zaman senkronizasyonunun aktif olup olmadığını yönetmek için de kullanılabilir.
Önce mevcut zaman durumunu kontrol edelim:
timedatectl status
Örnek çıktı:

Türkiye için timezone ayarı şu şekilde yapılabilir.
sudo timedatectl set-timezone Europe/Istanbul
NTP senkronizasyonunu aktif etmek için;
sudo timedatectl set-ntp true
Tekrar kontrol edelim:
timedatectl status
Burada özellikle şu satırlar kontrol edilmelidir.

systemd-timesyncd ile NTP Server Tanımlama
Ubuntu Server üzerinde basit NTP client ihtiyacı için systemd-timesyncd yeterlidir. Bu servis, server’ın zamanını dış NTP kaynaklarıyla senkronize eder. Ubuntu dokümantasyonu, timedatectl ve timesyncd kullanılarak zaman senkronizasyonu yapılabileceğini; NTP server adreslerinin /etc/systemd/timesyncd.conf veya drop-in config dosyalarıyla tanımlanabileceğini belirtir.
Servis durumunu kontrol etmek için:
systemctl status systemd-timesyncd --no-pager

Eğer servis kurulu değilse:
sudo apt install -y systemd-timesyncd
Servisi aktif hale getirelim.
sudo systemctl enable --now systemd-timesyncd
NTP server’ları doğrudan ana config dosyasına yazmak yerine drop-in config dosyası oluşturmak daha temizdir. timesyncd.conf man page dokümantasyonu local override işlemleri için drop-in dosyalarının kullanılmasını önerir.
Drop-in dizinini oluşturalım.
sudo mkdir -p /etc/systemd/timesyncd.conf.d
PowerDNS server için özel NTP ayar dosyasını oluşturalım.
sudo nano /etc/systemd/timesyncd.conf.d/10-ntp.conf

Oluşturulan dosyasının içeriği şu şekilde olabilir.

[Time]
NTP=tr.pool.ntp.org pool.ntp.org
FallbackNTP=ntp.ubuntu.com
NTP= ve FallbackNTP= satırlarında birden fazla NTP server boşlukla ayrılarak yazılabilir. Ubuntu dokümantasyonu da bu alanların space-separated list şeklinde kullanılabileceğini belirtir.
Servisi yeniden başlatalım.
sudo systemctl restart systemd-timesyncd
Durumu kontrol edelim:
timedatectl status
systemctl status systemd-timesyncd --no-pager

Daha detaylı log görmek için:
journalctl -u systemd-timesyncd -n 50 --no-pager
Başarılı bir senkronizasyonda loglarda benzer bir ifade görülebilir.

Synchronized to time server ...
Yardımcı Paketlerinin Kurulması
Kurulum öncesinde sistem üzerinde bazı yardımcı paketlerin bulunması faydalı olacaktır. Bu paketler doğrudan PowerDNS’in çalışması için zorunlu olmasa da kurulum, test, API kontrolü ve troubleshooting aşamalarında işleri oldukça kolaylaştırır.
sudo apt install -y curl gnupg ca-certificates lsb-release dnsutils jq

Bu komutta kurulan paketlerin amacı kısaca şöyledir:
- curl -> HTTP/HTTPS istekleri yapmak için kullanılır.
- gnupg -> Repository imza anahtarlarını yönetmek için gereklidir.
- ca-certificates -> HTTPS bağlantılarında sertifika doğrulaması için kullanılır.
- lsb-release -> Ubuntu sürüm bilgisini komut satırından almak için kullanılır.
- dnsutils -> dig, nslookup gibi DNS test araçlarını sağlar.
- jq -> JSON çıktıları okunabilir şekilde biçimlendirmek için kullanılır.
Özellikle dnsutils paketi PowerDNS kurulumundan sonra DNS sorgularını test etmek için kullanacağımız dig komutunu sağlar.
dig bir DNS server’ın ilgili zone ve record’lara doğru cevap verip vermediğini kontrol etmek için en pratik araçlardan biridir.
Örneğin kurulumdan sonra şu şekilde test yapılacaktır;
dig @127.0.0.1 kadirkozan.com SOA
dig @127.0.0.1 www.kadirkozan.com A
jq paketi ise PowerDNS API’den dönen JSON çıktıları daha okunabilir hale getirmek için kullanılır. API testlerinde ham JSON çıktısı tek satır halinde ve zor okunabilir gelebilir. jq ile bu çıktı düzenli ve anlaşılır bir formata dönüştürülür.
curl -s \
-H "X-API-Key: CHANGE_ME_API_KEY" \
http://127.0.0.1:8081/api/v1/servers/localhost \
| jq
Bu yardımcı araçların kurulum başında hazırlanması, ilerleyen adımlarda hem DNS sorgu testlerini hem de PowerDNS API kontrollerini daha rahat yapmamızı sağlar.
PowerDNS ve MariaDB Paketlerinin Kurulması
Ubuntu Server 24.04 üzerinde PowerDNS Authoritative Server ve MySQL/MariaDB backend için aşağıdaki paketler yeterlidir:
sudo apt install -y mariadb-server pdns-server pdns-backend-mysql

Aşağıdaki komut üç temel bileşeni kurar;
mariadb-server -> DNS kayıtlarının tutulacağı database server
pdns-server -> PowerDNS Authoritative Server
pdns-backend-mysql -> PowerDNS ile MariaDB/MySQL arasındaki backend modülü
Kurulum sırasında PowerDNS servisi otomatik başlamaya çalışabilir. Database backend henüz hazırlanmadığı için servis ilk aşamada hata verebilir. Bu normaldir. Database ve config tamamlandıktan sonra servis yeniden başlatılacaktır.
MariaDB Database Hazırlığı
PowerDNS kayıtlarını saklamak için ayrı bir database ve ayrı bir database user oluşturmak daha güvenlidir.
Root database kullanıcısı doğrudan PowerDNS’e verilmemelidir.
Önce güçlü bir database şifresi üretelim.
openssl rand -base64 32
b+Xdb4n9+zDmv0l0OuIrIvrZIwsjLQk09uPx0CQo+Gk=

MariaDB shell’e girelim.
sudo mariadb
Aşağıdaki SQL komutlarını çalıştır.
CREATE DATABASE pdns CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'pdns'@'localhost'
IDENTIFIED BY 'CHANGE_ME_STRONG_PASSWORD';
GRANT ALL PRIVILEGES ON pdns.* TO 'pdns'@'localhost';
FLUSH PRIVILEGES;
EXIT;
Burada CHANGE_ME_STRONG_PASSWORD yerine kendi ürettiğin güçlü şifreyi yazmalısınız.
CREATE DATABASE pdns CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'pdns'@'localhost'
IDENTIFIED BY 'Ankara123*ewq!@';
GRANT ALL PRIVILEGES ON pdns.* TO 'pdns'@'localhost';
FLUSH PRIVILEGES;
EXIT;

Şimdi PowerDNS’in MariaDB schema dosyasını database içine aktaralım.
sudo mariadb pdns < /usr/share/pdns-backend-mysql/schema/schema.mysql.sql
Tabloların oluştuğunu kontrol edelim:
sudo mariadb -e "SHOW TABLES FROM pdns;"
Beklenen çıktıda aşağıdakilere benzer tablolar görünmelidir.

comments
cryptokeys
domainmetadata
domains
records
supermasters
tsigkeys
PowerDNS’in MySQL/MariaDB backend schema’sı master, slave ve superslave operasyonları için gerekli database elemanlarını içerir.
Ubuntu Server 24.04 üzerinde port 53 kontrolü
DNS servisleri için hem UDP 53 hem de TCP 53 portu önemlidir. Ubuntu sistemlerde systemd-resolved bazı durumlarda local DNS stub listener olarak port 53 üzerinde dinleyebilir.
PowerDNS’in public DNS servisi verebilmesi için port 53’ü kullanabilmesi gerekir.
Önce port 53’ü kimin kullandığını kontrol edelim.
sudo ss -lntup | grep ':53' || true
sudo ss -lnuup | grep ':53' || true

Eğer systemd-resolved port 53 üzerinde görünüyorsa stub listener devre dışı bırakılabilir:
sudo mkdir -p /etc/systemd/resolved.conf.d
cat <<'EOF' | sudo tee /etc/systemd/resolved.conf.d/no-stub.conf
[Resolve]
DNSStubListener=no
EOF

Ardından servisi yeniden başlatılır.
sudo systemctl restart systemd-resolved
/etc/resolv.conf dosyasını systemd-resolved’ın gerçek resolver dosyasına yönlendirmek için;
sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf
Tekrar kontrol etmek için;
sudo ss -lntup | grep ':53' || true
sudo ss -lnuup | grep ':53' || true
PowerDNS başlamadan önce port 53’ün boşta olması kurulumun sorunsuz ilerlemesini sağlar.

PowerDNS gmysql backend yapılandırması
PowerDNS’in MariaDB ile konuşabilmesi için gmysql backend aktif edilmelidir.
Önce varsa default BIND backend config dosyasını devre dışı bırakalım.
sudo mv /etc/powerdns/pdns.d/pdns.simplebind.conf \
/etc/powerdns/pdns.d/pdns.simplebind.conf.bak 2>/dev/null || true
Şimdi MariaDB backend config dosyasını oluşturalım.
sudo nano /etc/powerdns/pdns.d/pdns.local.gmysql.conf

İçeriği şu şekilde olmalıdır;
launch=gmysql
gmysql-host=127.0.0.1
gmysql-port=3306
gmysql-dbname=pdns
gmysql-user=pdns
gmysql-password=CHANGE_ME_STRONG_PASSWORD
gmysql-dnssec=yes
launch=gmysql
gmysql-host=127.0.0.1
gmysql-port=3306
gmysql-dbname=pdns
gmysql-user=pdns
gmysql-password=Ankara123*ewq!@
gmysql-dnssec=yes

Bu dosyada dikkat edilmesi gereken en önemli satır launch=gmysql satırıdır. PowerDNS bu satır sayesinde MySQL/MariaDB backend modülünü yükler.
gmysql-dnssec=yes ayarı ileride DNSSEC kullanmak istediğinde backend’in DNSSEC verilerini desteklemesini sağlar.
Database şifresi bu dosyada tutulduğu için dosya izinlerini sıkılaştırmak gerekir.
sudo chown root:pdns /etc/powerdns/pdns.d/pdns.local.gmysql.conf
sudo chmod 640 /etc/powerdns/pdns.d/pdns.local.gmysql.conf

PowerDNS Ana Yapılandırması
Şimdi PowerDNS’in genel çalışma ayarlarını yapalım.
sudo nano /etc/powerdns/pdns.d/pdns.local.conf
Aşağıdaki örnek config tek node Authoritative Server için sade, güvenli ve anlaşılır bir başlangıç sağlar.
# PowerDNS Authoritative Server - Local Configuration
# DNS listen ayarları
local-address=0.0.0.0
local-port=53
# Dışarıya detaylı sürüm bilgisi vermemek için
version-string=anonymous
# Default TTL
default-ttl=3600
# PowerDNS built-in webserver ve API
webserver=yes
webserver-address=127.0.0.1
webserver-port=8081
webserver-allow-from=127.0.0.1,::1
api=yes
api-key=CHANGE_ME_API_KEY
# Log seviyesi
loglevel=4
# Tek node başlangıç senaryosu için AXFR kapalı tutulabilir.
# Secondary node eklenecekse ayrıca allow-axfr-ips ve TSIG planlanmalıdır.
disable-axfr=yes
# PowerDNS Authoritative Server - Local Configuration
# DNS listen ayarları
local-address=192.168.100.11
local-port=53
# Dışarıya detaylı sürüm bilgisi vermemek için
version-string=anonymous
# Default TTL
default-ttl=3600
# PowerDNS built-in webserver ve API
webserver=yes
webserver-address=127.0.0.1
webserver-port=8081
webserver-allow-from=127.0.0.1,::1
api=yes
api-key=82350ac7c807b424f60d2b8ecc708500b6e23f5d7d158a28a772d83d1c89b7e5
# Log seviyesi
loglevel=4
# Tek node başlangıç senaryosu için AXFR kapalı tutulabilir.
# Secondary node eklenecekse ayrıca allow-axfr-ips ve TSIG planlanmalıdır.
disable-axfr=yes

API key üretmek için:
openssl rand -hex 32
Üretilen değeri CHANGE_ME_API_KEY yerine yazılır.
root@ns1:/home/sysadmin# openssl rand -hex 32
82350ac7c807b424f60d2b8ecc708500b6e23f5d7d158a28a772d83d1c89b7e5
root@ns1:/home/sysadmin#

Burada API’nin sadece 127.0.0.1 üzerinde dinlemesi özellikle önemlidir.
PowerDNS API güçlü bir yönetim arayüzüdür. Dış network’e açık bırakılmamalıdır. PowerDNS HTTP API, zone content ve DNSSEC key material gibi kritik veriler üzerinde işlem yapabildiği için erişimi sınırlandırılmalıdır.
Config kontrolü ve servisin başlatılması
Önce PowerDNS config dosyalarını syntax açısından kontrol edelim.
sudo pdns_server --config=check

Fatal error: Trying to set unknown setting 'bind-config'
config kontrol işleminde yukarıdaki hata ile karşılaşılması durumunda aşağıdaki komut çalıştırılır.
# PowerDNS'i durdur.
sudo systemctl stop pdns
sudo systemctl reset-failed pdns
#bind-config in bulunduğu dizini bul.
sudo grep -Rni "bind-config" /etc/powerdns/
# BIND config dosyalarını /etc/powerdns/pdns.d/ dışına taşınması
sudo mkdir -p /root/pdns-disabled
sudo find /etc/powerdns/pdns.d/ -maxdepth 1 -type f -iname "*bind*" -exec mv {} /root/pdns-disabled/ \;
ls -la /etc/powerdns/pdns.d/
# bind-config tamamen temizlendi mi kontrol edilmesi
sudo grep -Rni "bind-config" /etc/powerdns/

Ardından servisi yeniden başlatıp enable edelim.
sudo systemctl enable --now pdns
sudo systemctl restart pdns
Servis durumunu kontrol edilir.
sudo systemctl status pdns --no-pager

Logları incelemek için;
sudo journalctl -u pdns -n 100 --no-pager

Port kontrolü;
sudo ss -lntup | grep ':53'
sudo ss -lnuup | grep ':53'
sudo ss -lntup | grep ':8081'
Beklenen durum şudur;

PowerDNS API testi
API’nin çalışıp çalışmadığını test edelim:
curl -s \
-H "X-API-Key: 82350ac7c807b424f60d2b8ecc708500b6e23f5d7d158a28a772d83d1c89b7e5" \
http://127.0.0.1:8081/api/v1/servers/localhost \
| jq
Başarılı bir cevapta PowerDNS server bilgileri JSON olarak döner.

PowerDNS Authoritative Server API’de server endpoint için server_id değeri genellikle localhost olarak kullanılır.
İlk zone oluşturma
Şimdi example.com için bir DNS zone oluşturalım.
Ubuntu Server 24.04’te gelen PowerDNS 4.8.x için klasik pdnsutil komutları kullanılabilir.
PowerDNS’in yeni dokümantasyonunda daha düzenli pdnsutil <object> <action> formatı öne çıkmıştır eski syntax hâlâ tanınsa da yeni syntax’a geçiş önerilir.
Bu makalede Ubuntu 24.04 default paketleriyle uyumlu olması için klasik syntax kullanılacaktır.
Zone oluşturulması
sudo pdnsutil create-zone kadirkozan.com ns1.kadirkozan.com
Zone türünü native olarak bırakabiliriz. Tek node ve database backend kullanılan başlangıç senaryosunda NATIVE yapı yeterlidir.
Kayıtları listele:
sudo pdnsutil list-zone kadirkozan.com
PowerDNS zone oluştururken otomatik bir SOA record üretebilir. Ancak production’a yakın bir yapı için SOA record’u bilinçli şekilde düzenlemek daha doğru olur.

SOA, NS ve A record yapılandırması
SOA record, zone’un temel otorite bilgisidir. İçinde primary nameserver, responsible mail adresi, serial, refresh, retry, expire ve minimum TTL gibi değerler bulunur.
Örnek SOA record:
ns1.kadirkozan.com. hostmaster.kadirkozan.com. 2026052601 10800 3600 604800 3600
Burada:
ns1.kadirkozan.com. -> Primary nameserver
hostmaster.kadirkozan.com. -> Sorumlu e-posta adresi, @ yerine nokta kullanılır
2026052601 -> Serial
10800 -> Refresh
3600 -> Retry
604800 -> Expire
3600 -> Minimum TTL
SOA record’u düzenlemek için:
sudo pdnsutil replace-rrset kadirkozan.com @ SOA 3600 \
"ns1.kadirkozan.com. hostmaster.kadirkozan.com. 2026052601 10800 3600 604800 3600"

NS record eklemek:
sudo pdnsutil replace-rrset kadirkozan.com @ NS 3600 \
"ns1.kadirkozan.com."

Nameserver için A record eklemek:
sudo pdnsutil replace-rrset kadirkozan.com ns1 A 3600 \
"192.168.100.11"

Web kaydı için A record ekle:
sudo pdnsutil replace-rrset kadirkozan.com www A 300 \
"192.168.100.11"

Mail server için örnek kayıtlar:
sudo pdnsutil replace-rrset kadirkozan.com mail A 300 \
"192.168.100.11"
sudo pdnsutil replace-rrset kadirkozan.com @ MX 3600 \
"10 mail.kadirkozan.com."

TXT/SPF örneği:
sudo pdnsutil replace-rrset kadirkozan.com @ TXT 3600 '"v=spf1 mx -all"'

Kayıtları listele:
sudo pdnsutil list-zone kadirkozan.com

Zone kontrolü:
sudo pdnsutil check-zone kadirkozan.com

PowerDNS, zone ve DNSSEC yönetimi için pdnsutil aracını sağlar bu araç backend database üzerinde çalışır ve raw SQL ile kayıt değiştirmek yerine pdnsutil veya HTTP API kullanılması önerilir.
DNS sorgu testleri
Önce localhost üzerinden test edelim:
dig @192.168.100.11 kadirkozan.com SOA +short
dig @192.168.100.11 kadirkozan.com NS +short
dig @192.168.100.11 ns1.kadirkozan.com A +short
dig @192.168.100.11 www.kadirkozan.com A +short
Beklenen cevaplar;

Burada cevap alınabiliyorsa PowerDNS dışarıdan DNS query kabul edebiliyor demektir.
Firewall yapılandırması
DNS servisinde UDP 53 ve TCP 53 birlikte açılmalıdır. UDP DNS sorguları için en yaygın kullanılan protokoldür; TCP ise büyük cevaplar, zone transfer ve bazı özel durumlar için gereklidir.
UFW kullanıyorsan:
sudo ufw allow OpenSSH
sudo ufw allow 53/udp
sudo ufw allow 53/tcp
sudo ufw enable
sudo ufw status verbose

PowerDNS API portu olan 8081 dışarı açılmamalıdır. Bu makaledeki config’te API zaten sadece 127.0.0.1 üzerinde dinlemektedir.
Cloud provider kullanıyorsan ayrıca provider firewall, security group veya network ACL tarafında da UDP/TCP 53 portlarının açık olduğundan emin olmalısın.
DNSSEC kullanımı için öneri
Bu kurulumda gmysql-dnssec=yes aktif edildiği için DNSSEC’e geçişe hazır bir backend yapılandırması vardır. Ancak DNSSEC’i production’da aktif etmeden önce test yapılmalıdır. Yanlış DS kaydı, hatalı key rollover veya eksik parent zone bildirimi domain’in doğrulanamamasına neden olabilir.
Test amaçlı DNSSEC aktif etmek için:
sudo pdnsutil secure-zone kadirkozan.com
Ardından zone rectify işlemi yapılır:
sudo pdnsutil rectify-zone kadirkozan.com
DS kaydını görmek için:
sudo pdnsutil show-zone kadirkozan.com
veya kullanılan PowerDNS sürümüne göre:
sudo pdnsutil export-zone-ds kadirkozan.com

PowerDNS’in güncel pdnsutil syntax’ında DNSSEC için pdnsutil zone secure ve ardından pdnsutil zone rectify komutları kullanılır; dokümantasyon DNSSEC aktif edildikten sonra rectify işleminin manuel olarak çalıştırılmasını özellikle belirtir.
Production ortamda DNSSEC aktif edilecekse şu adımlar dikkatle yapılmalıdır:
1. Zone PowerDNS üzerinde imzalanır.
2. DS record alınır.
3. Registrar / parent zone tarafına DS record eklenir.
4. DNSSEC validation test edilir.
5. Key rollover süreci dokümante edilir.
DNSSEC doğru yapıldığında güvenlik açısından önemli katkı sağlar; yanlış yapıldığında domain erişilebilirliğini bozabilir. Bu nedenle önce test domain üzerinde denenmesi önerilir.
API ile zone görüntüleme örneği
PowerDNS API aktif olduğu için local makineden zone listesi alınabilir:
curl -s \
-H "X-API-Key: CHANGE_ME_API_KEY" \
http://127.0.0.1:8081/api/v1/servers/localhost/zones \
| jq
Belirli bir zone’u görüntülemek için:
curl -s \
-H "X-API-Key: CHANGE_ME_API_KEY" \
http://127.0.0.1:8081/api/v1/servers/localhost/zones/example.com. \
| jq
API üzerinden kayıt yönetimi yapılacaksa dikkatli olunmalıdır. REST API’de RRset mantığı kullanılır; yani çoğu işlem tek bir kaydı değil, aynı isim ve tipteki record set’i değiştirir. Bu davranış otomasyon açısından avantajlıdır çünkü duplicate kayıt üretme riskini azaltır.
Backup stratejisi
PowerDNS kayıtları MariaDB üzerinde tutulduğu için en kritik backup database backup’ıdır.
Basit günlük backup için:
sudo mkdir -p /backup/pdns
sudo mysqldump --single-transaction pdns \
| gzip > /backup/pdns/pdns-$(date +%F).sql.gz
Backup dosyalarını görmek için:
ls -lh /backup/pdns/
Restore örneği:
gunzip < /backup/pdns/pdns-2026-05-26.sql.gz | sudo mariadb pdns
Önerilen backup yaklaşımı:
- Günlük database dump alınmalı.
- Backup farklı bir sunucuya kopyalanmalı.
- En az haftada bir restore testi yapılmalı.
- PowerDNS config dosyaları ayrıca yedeklenmeli.
- API key ve database password güvenli şekilde saklanmalı.
Yedeklenmesi gereken temel dosyalar:
/etc/powerdns/pdns.conf
/etc/powerdns/pdns.d/
/backup/pdns/
Loglama ve izleme önerileri
PowerDNS servisi düzenli olarak izlenmelidir. En temel kontroller şunlardır:
systemctl status pdns --no-pager
journalctl -u pdns -n 100 --no-pager
dig @127.0.0.1 kadirkozan.com SOA +short
dig @192.168.100.10 kadirkozan.com SOA +short
Production ortamda ayrıca şu kontroller önerilir:
- UDP 53 erişilebilir mi?
- TCP 53 erişilebilir mi?
- SOA serial güncel mi?
- NS kayıtları doğru mu?
- Glue record doğru mu?
- DNSSEC aktifse DS record uyumlu mu?
- Database backup alınıyor mu?
- API dışarıdan erişilemiyor mu?
Basit bir health check script örneği:
#!/bin/bash
SERVER="127.0.0.1"
ZONE="kadirkozan.com"
if dig @"$SERVER" "$ZONE" SOA +short | grep -q "$ZONE"; then
echo "PowerDNS OK"
exit 0
else
echo "PowerDNS ERROR"
exit 1
fi
Dosyayı oluştur:
sudo nano /usr/local/bin/check-pdns.sh
Çalıştırılabilir yap:
sudo chmod +x /usr/local/bin/check-pdns.sh
Test et:
/usr/local/bin/check-pdns.sh
Sık karşılaşılan sorunlar
1) PowerDNS servisi başlamıyor
İlk bakılacak yer servis loglarıdır:
sudo journalctl -u pdns -n 100 --no-pager
En yaygın nedenler:
- Database şifresi hatalıdır.
- gmysql backend config dosyası yanlış yazılmıştır.
- MariaDB servisi çalışmıyordur.
- Port 53 başka servis tarafından kullanılıyordur.
- Config dosyasında syntax hatası vardır.
MariaDB çalışıyor mu?
sudo systemctl status mariadb --no-pager
Database bağlantısını test et:
mariadb -u pdns -p -h 127.0.0.1 pdns
Port 53 kullanımda görünüyor
Kontrol:
sudo ss -lntup | grep ':53'
sudo ss -lnuup | grep ':53'
Eğer systemd-resolved görünüyorsa DNSStubListener=no ayarını kontrol et.
API çalışmıyor
Port kontrolü:
sudo ss -lntup | grep ':8081'
API test:
curl -v \
-H "X-API-Key: CHANGE_ME_API_KEY" \
http://127.0.0.1:8081/api/v1/servers/localhost
401 Unauthorized alıyorsan API key yanlıştır. Bağlantı hiç kurulamıyorsa webserver=yes, api=yes ve webserver-address ayarlarını kontrol et.
Domain dışarıdan çözülmüyor
Önce PowerDNS’in cevap verip vermediğini kontrol et:
dig @192.168.100.10 kadirkozan.com SOA
Sonra parent tarafını kontrol et:
dig NS kadirkozan.com
dig +trace kadirkozan.com
Kontrol edilmesi gerekenler:
- Registrar nameserver ayarı doğru mu?
- Glue record tanımlandı mı?
- Public IP doğru mu?
- Cloud firewall UDP/TCP 53’e izin veriyor mu?
- Sunucu üzerinde UFW açık mı?
- Zone içinde NS ve SOA kayıtları doğru mu?
Production için geliştirme önerileri
Tek node kurulum çalıştıktan sonra yapı şu şekilde geliştirilebilir:
1. İkinci PowerDNS node eklenebilir.
2. Primary/Secondary yapı kurulabilir.
3. AXFR sadece secondary IP’ye izin verecek şekilde sınırlandırılabilir.
4. TSIG ile zone transfer güvenliği artırılabilir.
5. DNSSEC kontrollü şekilde aktif edilebilir.
6. PowerDNS API bir reverse proxy arkasına alınabilir.
7. PowerDNS-Admin gibi web arayüzleri eklenebilir.
8. Database backup otomatik hale getirilebilir.
9. Prometheus/Grafana ile metrik izleme yapılabilir.
10. dnsdist ile load balancing ve DDoS azaltma katmanı eklenebilir.
Başlangıç için tek node yeterli olsa da DNS altyapısı kritik bir servis olduğu için uzun vadede en az iki node’lu yapı önerilir.
Ubuntu Server 24.04 üzerinde tek node PowerDNS kurulumu, doğru backend seçimi ve güvenli config yaklaşımıyla oldukça temiz bir şekilde yapılabilir. Bu makaledeki kurulumda PowerDNS Authoritative Server, MariaDB backend ile birlikte çalışacak şekilde yapılandırılmıştır. DNS kayıtları database üzerinde tutulur, yönetim için pdnsutil kullanılabilir ve local HTTP API sayesinde otomasyon süreçleri kolaylaştırılabilir.
Bu yapıda en önemli nokta PowerDNS’in rolünü doğru anlamaktır. Kurulan servis bir Authoritative Server’dır; yani sadece kendi zone’ları için cevap verir. Recursive çözümleme yapmaz. Bu ayrım doğru kurulduğunda PowerDNS, klasik BIND zone file yönetimine göre daha esnek, API uyumlu ve otomasyona açık bir DNS altyapısı sunar.
![[TR] Ubuntu Server 24.04 işletim Sistemi Üzerine Tek Node PowerDNS Kurulumu (Backend olarak MariaDB Kullanımı)](https://kadirkozan.com/wp-content/uploads/2026/05/PowerDNS-1024x468.png)
![[TR] Active Directory’de 15 Karakterlik Sunucu İsimlerini Listelemek](https://kadirkozan.com/wp-content/uploads/2026/02/Microsoft_Active_Directory-150x150.webp)