Instalasi PowerDNS Di Debian 12 Sebagai Authoritative DNS Server (Master & Slave)

Di post kali ini saya akan mencoba menginstall PowerDNS sebagai Authoritative DNS Server.
Pada percobaan kali ini saya menggunakan PowerDNS versi 4.9.x (stable) yang berjalan diatas distro linux Debian 12 (Bookworm) dengan domain yang digunakan adalah warscloud.online yang telah saya beli/sewa dari salahsatu domain registar di indonesia.

Pre Installation

Jika menggunakan VPS atau Cloud Image kita stop & disable terlebihdahulu service systemd-resolved karena service tersebut menggunakan port 53 yang akan kita gunakan untuk PowerDNS.
Jika tidak menggunakan VPS atau Cloud Image Silakan skip bagian ini, dan bisa langsung ke bagian Instalasi dan Konfigurasi

sudo systemctl disable systemd-resolved
sudo systemctl stop systemd-resolved

Lalu reboot

reboot now

Jika setelah reboot tidak bisa ping ke domain seperti google.com maka buat file /etc/resolv.conf

sudo nano /etc/resolv.conf

Lalu masukkan baris berikut

nameserver 1.1.1.1
nameserver 8.8.8.8

Lalu simpan.

Troubleshoot

Jika tidak bisa menyimpan dengan otuput error Error writing resolv.conf: No such file or directory

Caranya kita buat terlebihdahulu file dengan nama yang berbeda seperti /etc/resolv.conf.txt lalu kita rename menjadi /etc/resolv.conf

nano /etc/resolv.conf.txt
mv /etc/resolv.conf.txt /etc/resolv.conf

Instalasi Dan Konfigurasi PowerDNS (Master)

Install PowerDNS melalui official repository PowerDNS di link berikut

https://repo.powerdns.com

Di halaman tersebut juga disediakan baris perintah untuk menginstall nya, namun akan saya tulis juga di post ini

Install curl

apt install curl

Create the file ‘/etc/apt/sources.list.d/pdns.list’ with this content:

nano /etc/apt/sources.list.d/pdns.list

And insert this line

deb [signed-by=/etc/apt/keyrings/auth-49-pub.asc arch=amd64] http://repo.powerdns.com/debian bookworm-auth-49 main

Put this in ‘/etc/apt/preferences.d/auth-49’:

nano /etc/apt/preferences.d/auth-49

And insert this line

Package: auth*
Pin: origin repo.powerdns.com
Pin-Priority: 600

and execute the following commands:

sudo install -d /etc/apt/keyrings; curl https://repo.powerdns.com/FD380FBB-pub.asc | sudo tee /etc/apt/keyrings/auth-49-pub.asc &&
sudo apt-get update &&
sudo apt-get install pdns-server

Dan install juga pdns-backend-mysql karena kali ini kita menggunakan mysql sebagai backend dari PowerDNS, nantinya MySQL ini akan berfungsi sebagai penyimpanan DNS record kita

apt install pdns-backend-mysql

Install MariaDB (MySQL)

apt install mariadb-server mariadb-client

Jalankan secure installation

mysql_secure_installation

Buat database untuk PowerDNS

Login kedalam MySQL (menggunakan user root)

mysql

Buat database

MariaDB [(none)]> create database pdnsdb;

Buat user

MariaDB [(none)]> create user 'pdns'@'localhost' identified by 'PasswordAman';

Berikan izin

MariaDB [(none)]> grant all privileges on pdnsdb.* to 'pdns'@'localhost';

Flush!

MariaDB [(none)]> flush privileges;

Keluar

MariaDB [(none)]> quit

Export PowerDNS database Schema

mysql -u pdns -p pdnsdb < /usr/share/pdns-backend-mysql/schema/schema.mysql.sql

Verifikasi apakah schema sudah berhasil di export

mysql -u pdns -p -e "USE pdnsdb; SHOW TABLES;"

Konfigurasi PowerDNS

Buat file /etc/powerdns/pdns.d/pdns.local.gmysql.conf

nano /etc/powerdns/pdns.d/pdns.local.gmysql.conf

Masukkan baris berikut

# MySQL Configuration
#
# Launch gmysql backend
launch+=gmysql

# gmysql parameters
gmysql-host=127.0.0.1
gmysql-port=3306
gmysql-dbname=pdnsdb
gmysql-user=pdns
gmysql-password=PasswordAman
gmysql-dnssec=yes
# gmysql-socket=

Berikan permission ke file /etc/powerdns/pdns.d/pdns.local.gmysql.conf

chmod 640 /etc/powerdns/pdns.d/pdns.local.gmysql.conf
chown pdns:pdns /etc/powerdns/pdns.d/pdns.local.gmysql.conf

Tes connection PowerDNS ke database

systemctl stop pdns
pdns_server --daemon=no --guardian=no --loglevel=9

Jika koneksi PowerDNS sudah berhasil maka akan muncul output sebagai berikut

Jun 18 12:42:50 Loading '/usr/lib/x86_64-linux-gnu/pdns/libbindbackend.so'
Jun 18 12:42:50 [bind2backend] This is the bind backend version 4.9.1 (May 28 2024 07:46:05) (with bind-dnssec-db support) reporting
Jun 18 12:42:50 Loading '/usr/lib/x86_64-linux-gnu/pdns/libgmysqlbackend.so'
Jun 18 12:42:50 [gmysqlbackend] This is the gmysql backend version 4.9.1 (May 28 2024 07:46:05) reporting
Jun 18 12:42:50 This is a standalone pdns
Jun 18 12:42:50 Created local state directory '/var/run/pdns/'
Jun 18 12:42:50 Listening on controlsocket in '/var/run/pdns/pdns.controlsocket'
Jun 18 12:42:50 UDP server bound to 0.0.0.0:53
Jun 18 12:42:50 UDP server bound to [::]:53
Jun 18 12:42:50 TCP server bound to 0.0.0.0:53
Jun 18 12:42:50 TCP server bound to [::]:53
Jun 18 12:42:50 PowerDNS Authoritative Server 4.9.1 (C) PowerDNS.COM BV
Jun 18 12:42:50 Using 64-bits mode. Built using gcc 12.2.0 on May 28 2024 07:46:05 by root@localhost.
Jun 18 12:42:50 PowerDNS comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it according to the terms of the GPL version 2.
Jun 18 12:42:50 [stub-resolver] Doing stub resolving for 'auth-4.9.1.security-status.secpoll.powerdns.com.|TXT', using resolvers: 108.61.10.10, 2001:19f0:300:1704::6
Jun 18 12:42:50 [stub-resolver] Question for 'auth-4.9.1.security-status.secpoll.powerdns.com.|TXT' got answered by 108.61.10.10
Jun 18 12:42:50 Polled security status of version 4.9.1 at startup, no known issues reported: OK
Jun 18 12:42:50 [bindbackend] Parsing 0 domain(s), will report when done
Jun 18 12:42:50 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed
Jun 18 12:42:50 gmysql Connection successful. Connected to database 'pdnsdb' on '127.0.0.1'.
Jun 18 12:42:50 Creating backend connection for TCP
Jun 18 12:42:50 gmysql Connection successful. Connected to database 'pdnsdb' on '127.0.0.1'.
Jun 18 12:42:50 About to create 3 backend threads for UDP
Jun 18 12:42:50 gmysql Connection successful. Connected to database 'pdnsdb' on '127.0.0.1'.
Jun 18 12:42:50 gmysql Connection successful. Connected to database 'pdnsdb' on '127.0.0.1'.
Jun 18 12:42:50 gmysql Connection successful. Connected to database 'pdnsdb' on '127.0.0.1'.
Jun 18 12:42:50 Done launching threads, ready to distribute questions

Tekan CTRL+C untuk stop test

Konfigurasi Tambahan Untuk DNS Server Master

Edit File /etc/powerdns/pdns.conf

nano /etc/powerdns/pdns.conf

Tambahkan baris berikut di paling bawah

primary=yes
allow-axfr-ips=103.152.233.107
also-notify=103.152.233.107
xfr-cycle-interval=60

IP yang saya tandai warna oranye adalah IP dari DNS Server Slave, sesuaikan dengan IP DNS Server Slave kamu.
Dan untuk xfr-cycle-interval=60 adalah berapa lama interval refresh/sinkronisasi kembali antara DNS Server Slave Dan DNS Server Master

Jalankan kembali service PowerDNS

systemctl start pdns

Agar memastikan service PowerDNS auto start pada saat mesin reboot ketikkan perintah berikut

systemctl enable pdns

Pastikan service PowerDNS berjalan dengan baik

systemctl status pdns
● pdns.service - PowerDNS Authoritative Server
     Loaded: loaded (/lib/systemd/system/pdns.service; enabled; preset: enabled)
     Active: active (running) since Tue 2024-06-18 12:44:47 UTC; 1min 19s ago
       Docs: man:pdns_server(1)
             man:pdns_control(1)
             https://doc.powerdns.com
   Main PID: 4530 (pdns_server)
      Tasks: 8 (limit: 1092)
     Memory: 48.2M
        CPU: 58ms
     CGroup: /system.slice/pdns.service
             └─4530 /usr/sbin/pdns_server --guardian=no --daemon=no --disable-syslog --log-timestamp=no --write>

Jun 18 12:44:47 ns1 pdns_server[4530]: PowerDNS Authoritative Server 4.9.1 (C) PowerDNS.COM BV
Jun 18 12:44:47 ns1 pdns_server[4530]: Using 64-bits mode. Built using gcc 12.2.0 on May 28 2024 07:46:05 by ro>
Jun 18 12:44:47 ns1 pdns_server[4530]: PowerDNS comes with ABSOLUTELY NO WARRANTY. This is free software, and y>
Jun 18 12:44:47 ns1 pdns_server[4530]: Polled security status of version 4.9.1 at startup, no known issues repo>
Jun 18 12:44:47 ns1 pdns_server[4530]: [bindbackend] Parsing 0 domain(s), will report when done
Jun 18 12:44:47 ns1 pdns_server[4530]: [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed
Jun 18 12:44:47 ns1 pdns_server[4530]: Creating backend connection for TCP
Jun 18 12:44:47 ns1 systemd[1]: Started pdns.service - PowerDNS Authoritative Server.
Jun 18 12:44:47 ns1 pdns_server[4530]: About to create 3 backend threads for UDP
Jun 18 12:44:47 ns1 pdns_server[4530]: Done launching threads, ready to distribute questions
lines 1-23/23 (END)

(Optional, Jika terinstall UFW) Izinkan port 53 (DNS) diakses dari publik

ufw allow dns

Sampai tahap ini instalasi PowerDNS sudah selesai dan sudah bisa digunakan untuk menambah record secara CLI menggunakan perintah pdnsutil, namun kali ini saya akan menggunakan PowerAdmin untuk manajemen record secara GUI melalui tampilah WEB (WebUI)

Instalasi PowerAdmin

Untuk mendownload PowerAdmin bisa melalui official github PowerAdmin di link berikut

https://github.com/poweradmin/poweradmin/releases

Kali ini saya mengguanakan PowerAdmin dengan versi 3.7.0 dan saya menggunakan LAMP Stack untuk menginstall PowerAdmin, cara install LAMP Stack bisa dilihat di link berikut.

*Note: pastikan juga menginstall extension dan requirement yang dibutuhkan

  • PHP 8.1
  • PHP intl extension
  • PHP gettext extension
  • PHP openssl extension
  • PHP pdo extension
  • PHP pdo-mysql, pdo-pgsql or pdo-sqlite extension
  • PHP ldap extension (optional)
  • MySQL 5.7.x/8.x, MariaDB, PostgreSQL or SQLite database ✅
  • PowerDNS authoritative server 4.0.0+ ✅

Izinkan port 80 dan 443 (https & https) diakses dari publik

ufw allow http
ufw allow https

Ketika LAMP Stack dan source code PowerAdmin sudah di install, untuk mengakses PowerAdmin installer nya adalah

namadomain.com/install

Atau

IP-ADDRESS/install

Maka akan muncul tampilan installer seperti berikut

Pilih bahasa yang ingin kamu gunakan, lalu klik Go to step 2

Baca dan pahami mengenai PowerAdmin, jika sudah klik Go to step 3

Konfigurasi database yang telah kita buat, Jika sudah klik Go to step 4

Di halaman ini saya terdapat kesalahan pengetikan pada saat mengisikan secondary server yang harusnya adalah ns2.warscloud.online namun bisa di edit pada saat selesai instalasi, Jika sudah klik Go to step 5

Membuat user baru untuk manage zone dan records

MariaDB [(none)]> CREATE USER 'user1'@'localhost' IDENTIFIED  BY 'PasswordAman';
MariaDB [(none)]> GRANT SELECT, INSERT, UPDATE, DELETE ON pdnsdb.* TO 'user1'@'localhost';
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> quit

Jika sudah klik Go to step 6

Buat file konfigurasi

nano /var/www/html/inc/config.inc.php

Lalu masukkan baris sesuai dengan yang tertampil di installer, untuk case kali ini baris yang dimasukkan adalah

<?php
$db_host = 'localhost';
$db_name = 'pdnsdb';
$db_user = 'user1';
$db_pass = 'PasswordAman';
$db_type = 'mysql';

$session_key = 'xQEA0MO6vZuTcGBTMJF_IMwrD9dt0zq6Wv6sc#Vs*BMlWC';

$iface_lang = 'en_EN';

$dns_hostmaster = 'hostmaster.warscloud.online';
$dns_ns1 = 'ns1.warscloud.online';
$dns_ns2 = 'n2.warscloud.online';

$ignore_install_dir = true;

Jika sudah klik Go to step 7

Proses Instalasi selesai, namun agar lebih aman lanjut proses hapus direktori installer

Hapus direktori ../installer dari root directory PowerAdmin

rm -r /var/www/html/install/

Dan kamu bisa login kedalam Dashboard PowerAdmin menggunakan IP atau Domain

namadomain.com

Atau

IP-ADDRESS

Dalam case kali ini zone baru yang telah kita definisikan pada saat setup installer tidak terbuat, Dan saya akan membuatnya secara manual dengan cara masuk ke menu List Zone

Tambahkan Master Zone baru

Sesuaikan domain yang akan di manage contoh disini domain yang akan saya manage adalah warscloud.online

Penambahan Zone Master sudah selesai dan sukses

Klik edit untuk menyesuaikan NS record atau DNS server yang berhak melakukan management terhadap domain tersebut

Tambahkan record NS dan sesuaikan content nya

Dalam percobaan kali ini saya isikan ns1.warscloud.online dan ns2.warscloud.online dan jangan lupa juga mendefinisikan A records dari ns1.warscloud.online dan ns2.warscloud.online sehingga seperti berikut:

Instalasi PowerAdmin sudah selesai

Instalasi Dan Konfigurasi PowerDNS (Slave)

Untuk membuat DNS Server Slave cara instalasinya sama seperti kita menginstall PowerDNS Master hanya saja terdapat perbedaan pada saat kita menambahkan zone, jika pada DNS server master kita memilih type nya master maka pada DNS Server Slave kita memilih type nya Slave.
Untuk DNS server slave kita tidak akan menginstall PowerAdmin, karena DNS Server Slave hanya bertindak sebagai Replikasi zone dan record dari DNS Server Master

Lanjut, Install PowerDNS

Install PowerDNS melalui official repository PowerDNS di link berikut

https://repo.powerdns.com

Di halaman tersebut juga disediakan baris perintah untuk menginstall nya, namun akan saya tulis juga di post ini

Install curl

apt install curl

Create the file ‘/etc/apt/sources.list.d/pdns.list’ with this content:

nano /etc/apt/sources.list.d/pdns.list

And insert this line

deb [signed-by=/etc/apt/keyrings/auth-49-pub.asc arch=amd64] http://repo.powerdns.com/debian bookworm-auth-49 main

Put this in ‘/etc/apt/preferences.d/auth-49’:

nano /etc/apt/preferences.d/auth-49

And insert this line

Package: auth*
Pin: origin repo.powerdns.com
Pin-Priority: 600

and execute the following commands:

sudo install -d /etc/apt/keyrings; curl https://repo.powerdns.com/FD380FBB-pub.asc | sudo tee /etc/apt/keyrings/auth-49-pub.asc &&
sudo apt-get update &&
sudo apt-get install pdns-server

Dan install juga pdns-backend-mysql karena kali ini kita menggunakan mysql sebagai backend dari PowerDNS, nantinya MySQL ini akan berfungsi sebagai penyimpanan DNS record kita

apt install pdns-backend-mysql

Install MariaDB (MySQL)

apt install mariadb-server mariadb-client

Jalankan secure installation

mysql_secure_installation

Buat database untuk PowerDNS

Login kedalam MySQL (menggunakan user root)

mysql

Buat database

MariaDB [(none)]> create database pdnsdb;

Buat user

MariaDB [(none)]> create user 'pdns'@'localhost' identified by 'PasswordAman';

Berikan izin

MariaDB [(none)]> grant all privileges on pdnsdb.* to 'pdns'@'localhost';

Flush!

MariaDB [(none)]> flush privileges;

Keluar

MariaDB [(none)]> quit

Export PowerDNS database Schema

mysql -u pdns -p pdnsdb < /usr/share/pdns-backend-mysql/schema/schema.mysql.sql

Verifikasi apakah schema sudah berhasil di export

mysql -u pdns -p -e "USE pdnsdb; SHOW TABLES;"

Konfigurasi PowerDNS

Buat file /etc/powerdns/pdns.d/pdns.local.gmysql.conf

nano /etc/powerdns/pdns.d/pdns.local.gmysql.conf

Masukkan baris berikut

# MySQL Configuration
#
# Launch gmysql backend
launch+=gmysql

# gmysql parameters
gmysql-host=127.0.0.1
gmysql-port=3306
gmysql-dbname=pdnsdb
gmysql-user=pdns
gmysql-password=PasswordAman
gmysql-dnssec=yes
# gmysql-socket=

Berikan permission ke file /etc/powerdns/pdns.d/pdns.local.gmysql.conf

chmod 640 /etc/powerdns/pdns.d/pdns.local.gmysql.conf
chown pdns:pdns /etc/powerdns/pdns.d/pdns.local.gmysql.conf

Tes connection PowerDNS ke database

systemctl stop pdns
pdns_server --daemon=no --guardian=no --loglevel=9

Jika koneksi PowerDNS sudah berhasil maka akan muncul output sebagai berikut

Jun 18 12:42:50 Loading '/usr/lib/x86_64-linux-gnu/pdns/libbindbackend.so'
Jun 18 12:42:50 [bind2backend] This is the bind backend version 4.9.1 (May 28 2024 07:46:05) (with bind-dnssec-db support) reporting
Jun 18 12:42:50 Loading '/usr/lib/x86_64-linux-gnu/pdns/libgmysqlbackend.so'
Jun 18 12:42:50 [gmysqlbackend] This is the gmysql backend version 4.9.1 (May 28 2024 07:46:05) reporting
Jun 18 12:42:50 This is a standalone pdns
Jun 18 12:42:50 Created local state directory '/var/run/pdns/'
Jun 18 12:42:50 Listening on controlsocket in '/var/run/pdns/pdns.controlsocket'
Jun 18 12:42:50 UDP server bound to 0.0.0.0:53
Jun 18 12:42:50 UDP server bound to [::]:53
Jun 18 12:42:50 TCP server bound to 0.0.0.0:53
Jun 18 12:42:50 TCP server bound to [::]:53
Jun 18 12:42:50 PowerDNS Authoritative Server 4.9.1 (C) PowerDNS.COM BV
Jun 18 12:42:50 Using 64-bits mode. Built using gcc 12.2.0 on May 28 2024 07:46:05 by root@localhost.
Jun 18 12:42:50 PowerDNS comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it according to the terms of the GPL version 2.
Jun 18 12:42:50 [stub-resolver] Doing stub resolving for 'auth-4.9.1.security-status.secpoll.powerdns.com.|TXT', using resolvers: 108.61.10.10, 2001:19f0:300:1704::6
Jun 18 12:42:50 [stub-resolver] Question for 'auth-4.9.1.security-status.secpoll.powerdns.com.|TXT' got answered by 108.61.10.10
Jun 18 12:42:50 Polled security status of version 4.9.1 at startup, no known issues reported: OK
Jun 18 12:42:50 [bindbackend] Parsing 0 domain(s), will report when done
Jun 18 12:42:50 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed
Jun 18 12:42:50 gmysql Connection successful. Connected to database 'pdnsdb' on '127.0.0.1'.
Jun 18 12:42:50 Creating backend connection for TCP
Jun 18 12:42:50 gmysql Connection successful. Connected to database 'pdnsdb' on '127.0.0.1'.
Jun 18 12:42:50 About to create 3 backend threads for UDP
Jun 18 12:42:50 gmysql Connection successful. Connected to database 'pdnsdb' on '127.0.0.1'.
Jun 18 12:42:50 gmysql Connection successful. Connected to database 'pdnsdb' on '127.0.0.1'.
Jun 18 12:42:50 gmysql Connection successful. Connected to database 'pdnsdb' on '127.0.0.1'.
Jun 18 12:42:50 Done launching threads, ready to distribute questions

Tekan CTRL+C untuk stop test

Konfigurasi Tambahan Untuk DNS Server Slave

Edit File /etc/powerdns/pdns.conf

nano /etc/powerdns/pdns.conf

Lalu tambahkan baris berikut di paling bawah

secondary=yes
allow-dnsupdate-from=103.152.233.106

*IP yang saya tandai warna oranye adalah IP dari DNS Server Master

Jalankan kembali service PowerDNS

systemctl start pdns
systemctl enable pdns

Pastikan service PowerDNS berhasil running dan aktif

systemctl status pdns

Tambahkan zone yang sudah dibuat di DNS Server Master namun pada type kita pilih slave

pdnsutil create-secondary-zone warscloud.online 103.152.233.106

*IP yang saya tandai warna oranye adalah IP dari DNS Server Master

Konfigurasi DNS Server Slave telah selesai, untuk memverifikasi apakah didalam database sudah ada zone slave dan terupdate otomatis records nya caranya sebagai berikut

Login kedalam MySQL

mysql
MariaDB [(none)]> use pdnsdb;

Untuk melihat tabel apa saja yang ada didalam database pdnsdb ketikkan perintah berikut

MariaDB [pdnsdb]> show tables;

Untuk melihat zone apa saja yang sudah terbuat ketikkan perintah berikut

MariaDB [pdnsdb]> SELECT * FROM domains;

Output yang dihasilkan seperti berikut

MariaDB [pdnsdb]> select * from domains;
+----+------------------+-----------------+------------+-------+-----------------+---------+---------+---------+
| id | name             | master          | last_check | type  | notified_serial | account | options | catalog |
+----+------------------+-----------------+------------+-------+-----------------+---------+---------+---------+
|  1 | warscloud.online | 103.152.233.106 | 1719221219 | SLAVE |            NULL |         | NULL    | NULL    |
+----+------------------+-----------------+------------+-------+-----------------+---------+---------+---------+
1 row in set (0.000 sec)

Untuk melihat apakah records sudah bertambah secara otomatis dari hasil replikasi DNS Server Master ketikkan perintah berikut

MariaDB [pdnsdb]> select * from records;

Output yang dihasilkan seperti berikut

MariaDB [pdnsdb]> select * from records;
+----+-----------+----------------------+------+-------------------------------------------------------------------------------------+-------+------+----------+-----------+------+
| id | domain_id | name | type | content | ttl | prio | disabled | ordername | auth |
+----+-----------+----------------------+------+-------------------------------------------------------------------------------------+-------+------+----------+-----------+------+
| 13 | 1 | warscloud.online | SOA | ns1.warscloud.online hostmaster.warscloud.online 2024062405 28800 7200 604800 86400 | 86400 | 0 | 0 | NULL | 1 |
| 14 | 1 | ns1.warscloud.online | A | 103.152.233.106 | 30 | 0 | 0 | NULL | 1 |
| 15 | 1 | ns2.warscloud.online | A | 103.152.233.107 | 30 | 0 | 0 | NULL | 1 |
| 16 | 1 | warscloud.online | NS | ns1.warscloud.online | 30 | 0 | 0 | NULL | 1 |
| 17 | 1 | warscloud.online | NS | ns2.warscloud.online | 30 | 0 | 0 | NULL | 1 |
+----+-----------+----------------------+------+-------------------------------------------------------------------------------------+-------+------+----------+-----------+------+
5 rows in set (0.000 sec)

Delegasi Domain

Langkah terkahir adalah mendelegasikan nameserver dari Domain Restistrar ke DNS Server yang telah kita buat

Pergi ke tempat kamu membeli domain (Domain Registrar)

Klik Private Nameserver

Definisikan Domain dan IP DNS Server Master

Definisikan Domain dan IP DNS Server Slave

Setelah kamu mendefinisikan Domain dan IP dari DNS Server kamu selanjutnya adalah mendaftarkan DNS Server kamu sebagai Nameserver untuk domain kamu, dalam hal ini adalah domain warscloud.online. Klik Nameserver Setting

Isikan Domain dari DNS Server Master dan Slave kamu

Instalasi dan konfigurasi PowerDNS sudah selesai, terimakasih.

Pengembangan Lebih Lanjut (Opsional)

Instalasi dan Konfigurasi PowerDNS dengan remote Database

Berikut adalah gambaran diagram hasil akhir

  • Database NS1 hanya di ekspose untuk Node/VM 3

Dengan arsitektur seperti ini PowerAdmin (Web UI) hanya di install di Node/VM 3

Dengan arsitektur tersebut kita lebih fleksibel untuk menerapkan kebijakan/firewall, salah satu contoh implementasinya adalah PowerAdmin (Web GUI) hanya bisa diakses di jaringan Internal kita

Konfigurasi Node/VM 1

Buat salinan konfigurasi MariaDB

cp /etc/mysql/mariadb.conf.d/50-server.cnf /etc/mysql/mariadb.conf.d/50-server.cnf.bak

Buat agar MariaDB di ekspose keluar

Edit konfigurasi

nano /etc/mysql/mariadb.conf.d/50-server.cnf

Pada bagian

bind-address            = 127.0.0.1

Ubah menjadi

bind-address            = 0.0.0.0

Atau, dengan spesifik IP address yang terpasang

bind-address            = 10.0.0.1

Jika bind ke spesifik IP pastikan tidak ada aplikasi (didalam host yang sama) yang merujuk ke database dengan IP 127.0.0.1, jika ada silakan diganti dengan localhost.

Saya juga akan merubah port default 3306 menjadi port custom 13306, pada file yang sama silakan tambahkan baris berikut

port                    = 13306

Sehingga menjadi seperti berikut

Restart service MariaDB

systemctl restart mariadb

Jika sebelumnya sudah melakukan konfigurasi untuk PowerDNS nya maka ubah kembali konfigurasi nya hingga sesuai seperti contoh berikut

nano /etc/powerdns/pdns.d/pdns.local.gmysql.conf

Lalu sesuaikan gmysql-host dan gmysql-port
gmysql-port walaupun tidak sesuai namun masih bisa bekerja dengan normal karena berkomunikasi dengan database melalui Unix Socket (localhost) saran saya tetap diganti port nya agar tidak keliru dan sebagai dokumentasi saja.

# MySQL Configuration
#
# Launch gmysql backend
launch+=gmysql

# gmysql parameters
gmysql-host=localhost
gmysql-port=13306
gmysql-dbname=pdnsdb
gmysql-user=pdns
gmysql-password=PasswordAman
gmysql-dnssec=yes
# gmysql-socket=

Buat user remote database dan berikan izin untuk mengelola database powerdns yang telah kita buat di awal.

mysql
MariaDB [(none)]> create user 'pdns-remote'@'10.0.0.2' identified by 'PasswordAman';
MariaDB [(none)]> grant all privileges on pdnsdb.* to 'pdns-remote'@'10.0.0.2';
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> quit;

Catatan terbaru: Untuk username user database disarankan menggunakan underscore (_) daripada dash (-), karena di Poweradmin v3.9.4 untuk username tidak mendukung dash (-)

Sebagai Persiapan pada saat instalasi PowerAdmin nantinya pada Node/VM 3 nanti, disini kita juga buat user database untuk PowerAdmin (Limited-Rights User)

mysql
MariaDB [(none)]> CREATE USER 'poweradmin-remote'@'10.0.0.2' IDENTIFIED  BY 'PasswordAman';
MariaDB [(none)]> GRANT SELECT, INSERT, UPDATE, DELETE ON pdnsdb.* TO 'poweradmin-remote'@'10.0.0.2';
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> quit;

Catatan terbaru: Untuk username user database disarankan menggunakan underscore (_) daripada dash (-), karena di Poweradmin v3.9.4 untuk username tidak mendukung dash (-)

Lakukan test pengujian apakah PowerDNS masih bisa bisa berkomunikasi dengan database dan normal.

Stop service PowerDNS terlebihdahulu

systemctl stop pdns

Jalankan pengujian

pdns_server --daemon=no --guardian=no --loglevel=9

Jika outputnya seperti berikut maka berjalan dengan normal

Jul 22 06:36:57 Loading '/usr/lib/x86_64-linux-gnu/pdns/libbindbackend.so'
Jul 22 06:36:57 [bind2backend] This is the bind backend version 4.9.7 (Jul  7 2025 07:43:42) (with bind-dnssec-db support) reporting
Jul 22 06:36:57 Loading '/usr/lib/x86_64-linux-gnu/pdns/libgmysqlbackend.so'
Jul 22 06:36:57 [gmysqlbackend] This is the gmysql backend version 4.9.7 (Jul  7 2025 07:43:42) reporting
Jul 22 06:36:57 This is a standalone pdns
Jul 22 06:36:57 Listening on controlsocket in '/var/run/pdns/pdns.controlsocket'
Jul 22 06:36:57 UDP server bound to 0.0.0.0:53
Jul 22 06:36:57 UDP server bound to [::]:53
Jul 22 06:36:57 TCP server bound to 0.0.0.0:53
Jul 22 06:36:57 TCP server bound to [::]:53
Jul 22 06:36:57 PowerDNS Authoritative Server 4.9.7 (C) PowerDNS.COM BV
Jul 22 06:36:57 Using 64-bits mode. Built using gcc 12.2.0 on Jul  7 2025 07:43:42 by root@localhost.
Jul 22 06:36:57 PowerDNS comes with ABSOLUTELY NO WARRANTY. This is free software, and you are welcome to redistribute it according to the terms of the GPL version 2.
Jul 22 06:36:57 [stub-resolver] Doing stub resolving for 'auth-4.9.7.security-status.secpoll.powerdns.com.|TXT', using resolvers: 1.1.1.1, 8.8.8.8
Jul 22 06:36:58 [stub-resolver] Question for 'auth-4.9.7.security-status.secpoll.powerdns.com.|TXT' got answered by 1.1.1.1
Jul 22 06:36:58 Polled security status of version 4.9.7 at startup, no known issues reported: OK
Jul 22 06:36:58 [bindbackend] Parsing 0 domain(s), will report when done
Jul 22 06:36:58 [bindbackend] Done parsing domains, 0 rejected, 0 new, 0 removed
Jul 22 06:36:58 gmysql Connection successful. Connected to database 'pdnsdb' on 'localhost'.
Jul 22 06:36:58 Creating backend connection for TCP
Jul 22 06:36:58 gmysql Connection successful. Connected to database 'pdnsdb' on 'localhost'.
Jul 22 06:36:58 Primary/secondary communicator launching
Jul 22 06:36:58 gmysql Connection successful. Connected to database 'pdnsdb' on 'localhost'.
Jul 22 06:36:58 no primary or producer domains need notifications
Jul 22 06:36:58 About to create 3 backend threads for UDP
Jul 22 06:36:58 gmysql Connection successful. Connected to database 'pdnsdb' on 'localhost'.
Jul 22 06:36:58 gmysql Connection successful. Connected to database 'pdnsdb' on 'localhost'.
Jul 22 06:36:58 gmysql Connection successful. Connected to database 'pdnsdb' on 'localhost'.
Jul 22 06:36:58 Done launching threads, ready to distribute questions

Tekan CTRL+C untuk stop pengujian

Jalankan kembali service PowerDNS

systemctl start pdns

Install UFW untuk firewall

sudo apt install ufw

Set default tolak untuk traffic incoming

ufw default deny incoming

Set default allow untuk traffic outgoing

ufw default allow outgoing

Izinkan port 53 (DNS)

ufw allow dns

Izinkan port custom database yang telah kita sesuaikan diatas hanya dari IP tertentu contoh dari IP 10.0.0.2

ufw allow from 10.0.0.2 to any port 13306 proto tcp

Silakan allow port yang digunakan seperti SSH atau lainnya, Sesuaikan.
Contoh

ufw allow ssh

Terakhir, aktifkan/jalankan UFW

ufw enable

Untuk melihat list daftar rules yang telah kita tambahkan ketikkan perintah berikut

ufw status

Akan muncul output list port yang di izinkan seperti berikut

ufw status
Status: active

To                         Action      From
--                         ------      ----
DNS                        ALLOW       Anywhere                  
13306/tcp                  ALLOW       10.0.0.2            
22                         ALLOW       Anywhere                  
DNS (v6)                   ALLOW       Anywhere (v6)             
22 (v6)                    ALLOW       Anywhere (v6)          

Konfigurasi di sisi Node/VM 1 selesai.

Konfigurasi Node/VM 3

Install Apache, dan PHP (Abaikan MariaDB)

Silakan download source code PowerAdmin Disini

Setelah Virtualhost dibuat dan source code sudah ditempatkan ke root directory virtualhost selanjutnya silakan akses alamat virtualhost tersebut melalui web browser (jika menggunakan virtualhost)

http://IPorDomain/install

Berikut saya lampirkan tangkapan layar step initial configuration nya

Pada bagian Step 3 ini, silakan sesuaikan dengan yang telah kita konfigurasi pada Node/VM 1, dan pada bagian Poweradmin administrator password silakan sesuaikan, passsword ini digunakan untuk login ke WEB UI Poweradmin untuk user admin

Pada bagian step 4 ini, silakan sesuaikan username dan password dengan yang telah kita konfigurasi pada Node/VM 1 (Limited-Rights User)

Pada bagian step 5 ini, karena kita sudah membuat user nya pada konfigurasi Node/VM 1 sebelumnya. maka kita bisa langsung Go to step 6

Pada step 6 ini, kita buat configuration file

nano /var/www/dirvirtualhost/inc/config.inc.php

Copy semua konfigurasi php yang ditampilkan lalu paste dan simpan.

Pada bagian step 7 ini, kita hapus directory ./install agar aman dan bersih.

rm -r /var/www/dirvirtualhost/install/

Instalasi dan konfigurasi selesai. silakan akses kembali

http://IPorDomain

Lalu login menggunakan user admin dan password yang telah kita set di step 3

Keterangan Artikel:

Tested on: Debian 12 (Bookworm), PowerDNS 4.9.1
Penulis: Fariz Anwar
Sumber/Referensi:
https://repo.powerdns.com/
https://www.howtoforge.com/how-to-install-powerdns-on-ubuntu-22-04/