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
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
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/