PowerDNS + PowerAdmin Master-Slave
Panduan Instalasi, Konfigurasi, dan Optimasi DNS Server High-Availability
Debian 13 (Trixie) · MariaDB · Nginx · PHP-FPM · Certbot SSL
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 |
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).
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).
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)
| Port | Protokol | Arah (Direction) | Fungsi |
|---|---|---|---|
53 | UDP / TCP | Inbound / Outbound | Layanan Kueri DNS & Transfer Zona AXFR |
80 | TCP | Inbound | HTTP Web Server & Certbot ACME Validation |
443 | TCP | Inbound | HTTPS Access PowerAdmin UI |
22 | TCP | Inbound | SSH Secure Access Management |
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 |
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.
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:
# 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
Instalasi & Pengamanan Database MariaDB
Database MariaDB digunakan oleh PowerDNS untuk menyimpan rekaman DNS. Lakukan instalasi pada kedua server (NS1 & NS2):
# 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
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:
# 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
Konfigurasi Server Master (NS1 – 202.157.102.1)
7.1 Buat Database & User Privileges di NS1
sudo mysql -u root -p
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
# 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
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)
# 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
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
Konfigurasi Server Slave (NS2 – 202.157.103.1)
8.1 Buat Database & User di 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
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)
# 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!)
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!
sudo mysql -u pdns -p'PasswordPdnsSangatKuat123!' powerdns -e "
INSERT INTO supermasters (ip, nameserver, account)
VALUES ('202.157.102.1', 'ns1.example.com', 'admin');"
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
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
# 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
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
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;
}
}
# 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
Konfigurasi SSL HTTPS dengan Certbot (Let's Encrypt)
Amankan antarmuka PowerAdmin dengan enkripsi SSL/TLS gratis dari Let's Encrypt:
# 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
Instalasi PowerAdmin via Web Installer Interface
- Buka browser favorit Anda lalu akses URL:
https://poweradmin.example.com/install/ - Pilih Bahasa (Select Language) lalu klik Go to step 2.
- Isi parameter database PowerDNS:
- Database Type: MySQL
- Hostname:
127.0.0.1 - DB Port:
3306 - Database Name:
powerdns - Username:
poweradmin - Password:
PasswordPoweradminSangatKuat123!
- Isi detail PowerDNS API & Name Server default:
- Primary Nameserver:
ns1.example.com - Secondary Nameserver:
ns2.example.com - Hostmaster:
hostmaster.example.com
- Primary Nameserver:
- Set Password Administrator PowerAdmin (Admin User Web UI).
- Setelah instalasi berhasil, HAPUS FOLDER INSTALL demi keamanan:
sudo rm -rf /var/www/poweradmin/install
Import & Migrasi Zone dari BIND9 dengan zone2sql
Jika Anda melakukan migrasi dari server BIND9 lama, gunakan perkakas bawaan zone2sql:
# 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 *
Sync Zone Existing dari NS1 ke NS2
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
# 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)
# 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
autosecondary=yes.
Verifikasi Replikasi Master-Slave
Lakukan uji validasi untuk memastikan zona ter-replikasi sempurna dari Master ke Slave:
14.1 Pengujian di Server Master (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)
# 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
202.157.102.1) dan Slave (202.157.103.1) harus persis identik!
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
# 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
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.1padapdns.confagar port API 8081 tidak terekspos langsung ke internet publik. - Otomatisasi Backup Database: Pasang cronjob harian untuk melakukan backup dump schema & data MariaDB secara berkala:
0 2 * * * mysqldump -u pdns -p'PasswordPdnsSangatKuat123!' powerdns | gzip > /var/backups/powerdns-$(date +\%F).sql.gz