PowerDNS + PowerAdmin Master-Slave

Panduan Instalasi, Konfigurasi, dan Optimasi DNS Server High-Availability

Debian 13 (Trixie) · MariaDB · Nginx · PHP-FPM · Certbot SSL

5.1.x
PowerDNS Auth
Debian 13
OS Platform
15
Modul Panduan
Riset & Audit Teknis oleh HARRY DERTIN SUTISNA — ALSYUNDAWY IT SOLUTION
0

Ringkasan Status Komponen & Arsitektur

Tabel komponen software utama yang diuji dan dikonfigurasi dalam arsitektur Master-Slave modern ini:

Komponen Versi Rekomendasi Status Peran & Catatan
PowerDNS Authoritative 5.1.x Stabil & Production Ready DNS Server Utama (Master & Slave) dengan backend MariaDB
PowerAdmin Web UI v3.x / v4.x Aktif Management Control Panel DNS via Web Browser
MariaDB Server 11.x Aktif Penyimpanan Zona DNS & User Credentials
Nginx + PHP 8.4 Debian 13 Native Aktif Web Server & SSL
Certbot Let's Encrypt Latest Aktif Reverse Proxy & Web Server PowerAdmin dengan auto-renewal SSL
1

Pendahuluan & Konsep Utama

DNS (Domain Name System) merupakan fondasi utama infrastruktur jaringan internet. Dalam lingkungan enterprise maupun ISP, keandalan DNS Authoritative yang cepat dan aman adalah kebutuhan mutlak. Tutorial ini memberikan panduan langkah demi langkah untuk membangun PowerDNS Authoritative 5.1.x dalam mode Primary-Secondary (Master-Slave) berbasis MariaDB Backend di sistem operasi Debian 13 (Trixie).

Keunggulan PowerDNS 5.x: Mendukung arsitektur primary & secondary secara native, menggantikan sintaks lama master=yes / slave=yes dan superslave.

PowerDNS dipilih karena kecepatan kueri yang luar biasa, fleksibilitas database backend (MariaDB/MySQL), serta fitur replikasi otomatis NOTIFY & AXFR. Manajemen zona DNS dimudahkan melalui interface modern PowerAdmin yang diamankan dengan sertifikat SSL gratis dari Let's Encrypt (Certbot).

2

Persyaratan Sistem

Spesifikasi Minimal Rekomendasi Production
CPU 1 Core vCPU 2+ vCPU Core
RAM 1 GB 2 GB – 4 GB
Storage 10 GB SSD 25+ GB NVMe / SSD Storage
OS Platform Debian 13 (Trixie) 64-bit
Port Jaringan Terbuka (Firewall Rules)
PortProtokolArah (Direction)Fungsi
53UDP / TCPInbound / OutboundLayanan Kueri DNS & Transfer Zona AXFR
80TCPInboundHTTP Web Server & Certbot ACME Validation
443TCPInboundHTTPS Access PowerAdmin UI
22TCPInboundSSH Secure Access Management
3

Skema Jaringan & Arsitektur

Dalam panduan ini digunakan penamaan hostname dan alokasi IP sebagai berikut:

Peran Node Hostname Sample IP Publik / IP Server Layanan Aktif
Primary (Master) ns1.example.com 202.157.102.1 PowerDNS Auth, PowerAdmin, MariaDB, Nginx, Certbot
Secondary (Slave) ns2.example.com 202.157.103.1 PowerDNS Auth (Slave Mode), MariaDB Backend
Penting: NS1 202.157.102.1 (Primary + PowerAdmin, PTR 202.157.102.0/20 + ±10 domain). NS2 202.157.103.1 (Secondary/autosecondary). Sesuaikan hostname example.com dengan domain Anda.
4

Persiapan Kedua Server (Master & Slave)

Jalankan perintah ini di NS1 (Master) dan NS2 (Slave) untuk memperbarui repositori dan mengisolasi port 53 dari service bawaan OS:

Bash — Master & Slave
# Update repository & upgrade sistem
sudo apt update && sudo apt upgrade -y

# Install utility dasar
sudo apt install -y curl wget gnupg2 lsb-release \
  software-properties-common dnsutils net-tools \
  ca-certificates apt-transport-https ufw

# Nonaktifkan systemd-resolved agar Port 53 tidak bentrok
sudo systemctl stop systemd-resolved
sudo systemctl disable systemd-resolved
sudo rm -f /etc/resolv.conf

# Set DNS resolver independen
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
echo "nameserver 1.1.1.1" | sudo tee -a /etc/resolv.conf

# Konfigurasi UFW Firewall
sudo ufw allow 22/tcp
sudo ufw allow 53/tcp
sudo ufw allow 53/udp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw --force enable
sudo ufw status verbose
5

Instalasi & Pengamanan Database MariaDB

Database MariaDB digunakan oleh PowerDNS untuk menyimpan rekaman DNS. Lakukan instalasi pada kedua server (NS1 & NS2):

Bash — Master & Slave
# Install MariaDB Server & Client
sudo apt install -y mariadb-server mariadb-client

# Pastikan service MariaDB berjalan
sudo systemctl enable --now mariadb

# Amankan instalasi MariaDB
sudo mysql_secure_installation

Petunjuk wizard mysql_secure_installation:

  • Switch to unix_socket authentication → N (atau Y sesuai preferensi)
  • Change the root password? → Y (Buat password root MariaDB yang kuat)
  • Remove anonymous users? → Y
  • Disallow root login remotely? → Y
  • Remove test database and access to it? → Y
  • Reload privilege tables now? → Y
6

Instalasi PowerDNS Authoritative Server

Gunakan repositori resmi PowerDNS 5.1.x agar mendapatkan versi terbaru yang teruji di Debian 13 (Trixie). Jalankan pada Master & Slave:

Bash — Master & Slave
# Buat direktori keyring
sudo install -d -m 0755 /etc/apt/keyrings

# Download & simpan GPG Public Key PowerDNS
curl -fsSL https://repo.powerdns.com/FD380FBB-pub.asc | \
  sudo tee /etc/apt/keyrings/auth-51-pub.asc > /dev/null

# Tambahkan APT repository PowerDNS Auth 5.1 untuk Debian Trixie
echo "deb [signed-by=/etc/apt/keyrings/auth-51-pub.asc] http://repo.powerdns.com/debian trixie-auth-51 main" | \
  sudo tee /etc/apt/sources.list.d/pdns.list

# Set APT Preference Pinning
cat <<EOF | sudo tee /etc/apt/preferences.d/auth-51
Package: pdns-*
Pin: origin repo.powerdns.com
Pin-Priority: 600
EOF

# Update & Install PowerDNS dengan MySQL/MariaDB Backend
sudo apt update
sudo apt install -y pdns-server pdns-backend-mysql

# Hapus file konfigurasi backend BIND default
sudo rm -f /etc/powerdns/pdns.d/bind.conf
7

Konfigurasi Server Master (NS1 – 202.157.102.1)

7.1 Buat Database & User Privileges di NS1
MySQL Command Prompt — NS1
sudo mysql -u root -p
SQL Query
CREATE DATABASE powerdns CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- User khusus daemon PowerDNS
CREATE USER 'pdns'@'localhost' IDENTIFIED BY 'PasswordPdnsSangatKuat123!';
GRANT ALL PRIVILEGES ON powerdns.* TO 'pdns'@'localhost';

-- User khusus PowerAdmin Web UI
CREATE USER 'poweradmin'@'localhost' IDENTIFIED BY 'PasswordPoweradminSangatKuat123!';
GRANT ALL PRIVILEGES ON powerdns.* TO 'poweradmin'@'localhost';

FLUSH PRIVILEGES;
EXIT;
7.2 Import Schema PowerDNS Database
Bash — NS1
# Import schema SQL standar PowerDNS
sudo mysql -u pdns -p'PasswordPdnsSangatKuat123!' powerdns < /usr/share/pdns-backend-mysql/schema/schema.mysql.sql

# Verifikasi tabel tersimpan
sudo mysql -u pdns -p'PasswordPdnsSangatKuat123!' powerdns -e "SHOW TABLES;"
7.3 Konfigurasi Backend MySQL PowerDNS
/etc/powerdns/pdns.d/pdns.local.gmysql.conf
launch+=gmysql
gmysql-host=127.0.0.1
gmysql-port=3306
gmysql-dbname=powerdns
gmysql-user=pdns
gmysql-password=PasswordPdnsSangatKuat123!
gmysql-dnssec=yes
7.4 Konfigurasi Utama Master (/etc/powerdns/pdns.conf)
/etc/powerdns/pdns.conf — NS1
# Mode Primary/Master
primary=yes
secondary=no

# Izinkan AXFR Transfer ke IP Slave
allow-axfr-ips=202.157.103.1

# Kirim DNS NOTIFY otomatis ke IP Slave saat zona diperbarui
also-notify=202.157.103.1

# Binding Port & IP
local-address=0.0.0.0
local-port=53

# Integrasi API & Webserver Internal (untuk PowerAdmin)
api=yes
api-key=APIKeySangatRahasiaDanPanjang123!
webserver=yes
webserver-address=127.0.0.1
webserver-port=8081
webserver-allow-from=127.0.0.1

# Default Content SOA
default-soa-content=ns1.example.com hostmaster.example.com 0 10800 3600 604800 3600
include-dir=/etc/powerdns/pdns.d
7.5 Hak Akses File & Restart Service
Bash — NS1
sudo chown -R pdns:pdns /etc/powerdns/pdns.d/pdns.local.gmysql.conf
sudo chmod 640 /etc/powerdns/pdns.d/pdns.local.gmysql.conf
sudo systemctl restart pdns
sudo systemctl enable pdns
sudo systemctl status pdns
8

Konfigurasi Server Slave (NS2 – 202.157.103.1)

8.1 Buat Database & User di NS2
Bash — NS2
sudo mysql -u root -p -e "
CREATE DATABASE powerdns CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'pdns'@'localhost' IDENTIFIED BY 'PasswordPdnsSangatKuat123!';
GRANT ALL PRIVILEGES ON powerdns.* TO 'pdns'@'localhost';
FLUSH PRIVILEGES;"

# Import schema
sudo mysql -u pdns -p'PasswordPdnsSangatKuat123!' powerdns < /usr/share/pdns-backend-mysql/schema/schema.mysql.sql
8.2 File Backend MySQL Slave
/etc/powerdns/pdns.d/pdns.local.gmysql.conf — NS2
launch+=gmysql
gmysql-host=127.0.0.1
gmysql-port=3306
gmysql-dbname=powerdns
gmysql-user=pdns
gmysql-password=PasswordPdnsSangatKuat123!
gmysql-dnssec=yes
8.3 Konfigurasi Utama Slave (/etc/powerdns/pdns.conf)
/etc/powerdns/pdns.conf — NS2
# Mode Secondary/Slave
primary=no
secondary=yes

# Aktifkan Autosecondary (Supermaster Auto Provisioning)
autosecondary=yes

# Terbuka menerima NOTIFY dari IP Master
allow-notify-from=202.157.102.1

# Durasi cek rutin perubahan zona
xfr-cycle-interval=60

local-address=0.0.0.0
local-port=53
include-dir=/etc/powerdns/pdns.d
8.4 Mendaftarkan Supermaster di NS2 (PENTING & SOLUSI BUG!)
KOREKSI BUG SUPERMASTER: Kolom nameserver dalam tabel supermasters di server Slave HARUS MATCH dengan nilai SOA MNAME / NOTIFY origin yang dikirimkan oleh server Master (misalnya ns1.example.com), BUKAN ns2.example.com! Jika salah, Slave akan menolak replikasi otomatis!
SQL Command — NS2
sudo mysql -u pdns -p'PasswordPdnsSangatKuat123!' powerdns -e "
INSERT INTO supermasters (ip, nameserver, account)
VALUES ('202.157.102.1', 'ns1.example.com', 'admin');"
Bash — NS2 Restart
sudo chown -R pdns:pdns /etc/powerdns/pdns.d/pdns.local.gmysql.conf
sudo chmod 640 /etc/powerdns/pdns.d/pdns.local.gmysql.conf
sudo systemctl restart pdns
sudo systemctl enable pdns
sudo systemctl status pdns
9

Instalasi Nginx + PHP-FPM + PowerAdmin (Master Only)

Komponen Web UI PowerAdmin dipasang hanya di Server Master (NS1):

9.1 Install Nginx & Module PHP Debian 13
Bash — NS1
# Install Nginx & PHP FPM beserta ekstensi pendukung
sudo apt install -y nginx php-fpm php-cli php-mysql \
  php-intl php-mbstring php-xml php-curl php-gd php-zip unzip

# Cek socket PHP-FPM terpasang
ls -la /run/php/
9.2 Download & Ekstrak PowerAdmin
Bash — NS1
cd /tmp
# Ambil rilis PowerAdmin resmi via GitHub API
PA_VER=$(curl -s https://api.github.com/repos/poweradmin/poweradmin/releases/latest | grep tag_name | cut -d '"' -f 4 | tr -d 'v')
wget https://github.com/poweradmin/poweradmin/archive/refs/tags/v${PA_VER}.zip
unzip v${PA_VER}.zip

sudo mkdir -p /var/www/poweradmin
sudo cp -r poweradmin-${PA_VER}/* /var/www/poweradmin/
sudo chown -R www-data:www-data /var/www/poweradmin
sudo chmod -R 755 /var/www/poweradmin
9.3 Konfigurasi Server Block Nginx
/etc/nginx/sites-available/poweradmin
server {
    listen 80;
    listen [::]:80;
    server_name poweradmin.example.com;

    root /var/www/poweradmin;
    index index.php index.html;

    access_log /var/log/nginx/poweradmin.access.log;
    error_log  /var/log/nginx/poweradmin.error.log;

    # Security Headers
    add_header X-Frame-Options "SAMEORIGIN" always;
    add_header X-Content-Type-Options "nosniff" always;
    add_header X-XSS-Protection "1; mode=block" always;
    add_header Referrer-Policy "strict-origin-when-cross-origin" always;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        # Menggunakan wildcard socket PHP Debian
        fastcgi_pass unix:/run/php/php-fpm.sock;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\. {
        deny all;
    }
}
Bash — Active Link Nginx
# Buat symlink socket fpm jika bernama php8.x-fpm.sock
PHP_SOCK=$(ls /run/php/php*-fpm.sock 2>/dev/null | head -n 1)
if [ -n "$PHP_SOCK" ] && [ ! -e /run/php/php-fpm.sock ]; then
    sudo ln -s "$PHP_SOCK" /run/php/php-fpm.sock
fi

sudo ln -sf /etc/nginx/sites-available/poweradmin /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
10

Konfigurasi SSL HTTPS dengan Certbot (Let's Encrypt)

Amankan antarmuka PowerAdmin dengan enkripsi SSL/TLS gratis dari Let's Encrypt:

Bash — NS1 Certbot
# Install Certbot Nginx Plugin
sudo apt install -y certbot python3-certbot-nginx

# Request sertifikat SSL & Otomatisasi HTTPS Redirect
sudo certbot --nginx -d poweradmin.example.com \
  --agree-tos -m [email protected] --redirect

# Test Auto Renewal Timer
sudo certbot renew --dry-run
11

Instalasi PowerAdmin via Web Installer Interface

  1. Buka browser favorit Anda lalu akses URL: https://poweradmin.example.com/install/
  2. Pilih Bahasa (Select Language) lalu klik Go to step 2.
  3. Isi parameter database PowerDNS:
    • Database Type: MySQL
    • Hostname: 127.0.0.1
    • DB Port: 3306
    • Database Name: powerdns
    • Username: poweradmin
    • Password: PasswordPoweradminSangatKuat123!
  4. Isi detail PowerDNS API & Name Server default:
    • Primary Nameserver: ns1.example.com
    • Secondary Nameserver: ns2.example.com
    • Hostmaster: hostmaster.example.com
  5. Set Password Administrator PowerAdmin (Admin User Web UI).
  6. Setelah instalasi berhasil, HAPUS FOLDER INSTALL demi keamanan:
Bash — Hapus Directory Install
sudo rm -rf /var/www/poweradmin/install
12

Import & Migrasi Zone dari BIND9 dengan zone2sql

Jika Anda melakukan migrasi dari server BIND9 lama, gunakan perkakas bawaan zone2sql:

Bash — Import Zone BIND9
# Convert BIND9 config & zone files ke sintaks SQL PowerDNS
zone2sql --named-conf=/etc/bind/named.conf \
         --gmysql \
         --transactions \
         --delete-matching-domains \
         > /tmp/bind-import.sql

# Import kueri SQL ke Database MariaDB
mysql -u pdns -p'PasswordPdnsSangatKuat123!' powerdns < /tmp/bind-import.sql

# Set tipe zona yang diimport agar menjadi MASTER
mysql -u pdns -p'PasswordPdnsSangatKuat123!' powerdns -e \
  "UPDATE domains SET type='MASTER' WHERE type='NATIVE' OR type IS NULL;"

# Trigger NOTIFY ke Slave
sudo pdns_control notify *
13

Sync Zone Existing dari NS1 ke NS2

Kasus Anda: NS1 (202.157.102.1) sudah berisi ±10 domain + PTR 202.157.102.0/20 hasil zone2sql. NS2 dibuat belakangan sehingga database-nya masih kosong. Fitur autosecondary hanya otomatis untuk zone baru yang dikirim NOTIFY — zone lama harus dipaksa sync sekali.
13.1 Cara Terbaik — Paksa NOTIFY dari NS1
Bash — NS1 (202.157.102.1)
# Kirim NOTIFY ke semua zone yang ada
mysql -u pdns -p'PasswordPdnsSangatKuat123!' powerdns -N -e "SELECT name FROM domains;" | while read zone; do
  echo "NOTIFY → $zone"
  pdns_control notify "$zone"
done

# Atau paksa semua sekaligus (jika didukung)
# pdns_control notify *
13.2 Cara Manual di NS2 (jika NOTIFY belum cukup)
Bash — NS2 (202.157.103.1)
# Contoh satu zone (syntax PowerDNS 5.x)
pdnsutil zone create-secondary contoh.com 202.157.102.1
pdns_control retrieve contoh.com

# Script untuk banyak zone (siapkan /tmp/zones.txt dari NS1)
while read zone; do
  echo "=== $zone ==="
  pdnsutil zone create-secondary "$zone" 202.157.102.1
  pdns_control retrieve "$zone"
  sleep 1
done < /tmp/zones.txt
Setelah sync berhasil, zone baru yang dibuat lewat PowerAdmin di NS1 akan otomatis muncul di NS2 berkat autosecondary=yes.
14

Verifikasi Replikasi Master-Slave

Lakukan uji validasi untuk memastikan zona ter-replikasi sempurna dari Master ke Slave:

14.1 Pengujian di Server Master (NS1)
Bash — NS1
# Cek daftar zona terdaftar
mysql -u pdns -p'PasswordPdnsSangatKuat123!' powerdns -e "SELECT id, name, type FROM domains;"

# Test kueri DNS lokal ke Master
dig @202.157.102.1 example.com SOA +short
dig @202.157.102.1 example.com NS +short
14.2 Pengujian di Server Slave (NS2)
Bash — NS2
# Cek apakah domain terbuat otomatis di Slave
mysql -u pdns -p'PasswordPdnsSangatKuat123!' powerdns -e "SELECT id, name, type, master FROM domains;"

# Test kueri DNS ke Slave
dig @202.157.103.1 example.com SOA +short
Indikator Berhasil: Nomor Serial SOA pada server Master (202.157.102.1) dan Slave (202.157.103.1) harus persis identik!
15

Troubleshooting & Solusi Masalah

Gejala / Error Penyebab Utama Solusi Perbaikan
Address already in use :53 Conflict dengan service systemd-resolved Stop & disable systemd-resolved (Lihat Modul 4)
No supermaster entry found Tabel supermasters di Slave tidak match dengan SOA MNAME Master Update kolom nameserver pada tabel supermasters Slave menjadi ns1.example.com
AXFR Refused / Transfer Error IP Slave belum terdaftar di allow-axfr-ips Master Tambahkan IP Slave pada parameter allow-axfr-ips di pdns.conf Master
PowerAdmin 502 Bad Gateway Socket PHP-FPM tidak terhubung dengan Nginx Pastikan path socket di sites-available/poweradmin sesuai dengan /run/php/
Perintah Live Monitoring Log
Bash — Live Debugging
# Monitor log PowerDNS secara realtime
sudo journalctl -u pdns -f -n 100

# Monitor Nginx Error Log
sudo tail -f /var/log/nginx/poweradmin.error.log
16

Keamanan, Hardening & Best Practices

  • Batasi Akses Web UI PowerAdmin: Tambahkan direktif allow IP_ADMIN; deny all; di Nginx server block jika PowerAdmin hanya dikelola dari IP statis tertentu.
  • Isolasi PowerDNS API: Pertahankan webserver-address=127.0.0.1 pada pdns.conf agar port API 8081 tidak terekspos langsung ke internet publik.
  • Otomatisasi Backup Database: Pasang cronjob harian untuk melakukan backup dump schema & data MariaDB secara berkala:
Cronjob Backup Example
0 2 * * * mysqldump -u pdns -p'PasswordPdnsSangatKuat123!' powerdns | gzip > /var/backups/powerdns-$(date +\%F).sql.gz
Dokumentasi teknis berdasarkan riset & pengujian lapangan arsitektur PowerDNS Debian 13