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.

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)

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.

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/