[TR] Ubuntu Server 24.04 işletim Sistemi Üzerine Tek Node PowerDNS Kurulumu (Backend olarak MariaDB Kullanımı)

[TR] Ubuntu Server 24.04 işletim Sistemi Üzerine Tek Node PowerDNS Kurulumu (Backend olarak MariaDB Kullanımı)

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ı gmysql olarak 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.

Comments

No comments yet. Why don’t you start the discussion?

Leave a Reply

Your email address will not be published. Required fields are marked *