PowerDNS - Install PowerDNS di Ubuntu Server

PowerDNS - Install PowerDNS di Ubuntu Server

Pada artikel ini saya akan membuat langkah - langkah instalasi PowerDNS pada sistem operasi Ubuntu Server

Arman Dwi Pangestu
Arman Dwi PangestuJuly 3, 2023
0 views
8 min read

Mengapa Menggunakan PowerDNS?

PowerDNS menawarkan 2 solusi nameserver:

  • The Authoritative Server atau Server Resmi, yang dimana menggunakan database untuk me-resolve query mengenai domain.
  • The Recursor atau Perulangan, yang dimana membuat konsultasi dengan Authoritative Server lainnya untuk me-resolve query

Nameserver lain menggabungkan kedua fungsi tersebut secara otomatis. PowerDNS menawarkannya secara terpisah, dan memungkinkan perpaduan dua solusi secara mulus untuk pengaturan modular.

Selain itu, PowerDNS adalah sumber terbuka, berfungsi sama baiknya untuk volume query kecil dan besar, dan menawarkan banyak kemungkinan untuk solusi backend.

List Backend PowerDNS

Berikut ini adalah list backend yang tersedia untuk PowerDNS

NameNativePrimarySecondaryProducerConsumerAutoprimaryDNS UpdateDNSSECLaunch
BINDYesYesYesNoNoYesNoYesBind
Generic MySQL/MariaDBYesYesYesYesYesYesYesYesgmysql
Generic ODBCYesYesYesYesYesYesYesYesgodbc
Generic PostgreSQLYesYesYesYesYesYesYesYesgpgsql
Generic SQLite3YesYesYesYesYesYesYesYesgsqlite3
Generic GeoIPYesNoNoNoNoNoNoYesgeoip
Generic LDAPYesYesNoNoNoNoNoNoldap
Generic LMDBYesYesYesYesYesNoNoYeslmdb
Generic Lua2YesYesNoNoNoNoNoYeslua2
Generic PipeYesNoNoNoNoNoNoNopipe
Generic RandomYesNoNoNoNoNoNoNorandom
Generic RemoteYesYes*Yes*NoNoYes*NoYes*remote
Generic TinyDNSYesYesNoNoNoNoNoNotinydns

Installasi PowerDNS di Ubuntu Server

Ikuti langkah dibawah ini untuk instalassi dan konfigurasi PowerDNS dengan MySQL atau MariaDB sebagai backend database. Selain itu langkah-langkah ada tambahan instalasi untuk setup untuk PowerDNS Admin sebagai web interface dan API.

Langkah 1: Install dan Konfigurasi MariaDB Server

  • Update dan Upgrade sistem package:
bash
sudo apt update && sudo apt upgrade
  • Install MariaDB Server dan Client:
bash
sudo apt install mariadb-server mariadb-client
  • Membuat database untuk powerdns di MariaDB
bash
sudo mysql -u root -p
MySQL/MariaDB
CREATE DATABASE `powerdns` CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
  • Membuat akun atau user untuk powerdns kemudian berikan akses ke database powerdns
MySQL/MariaDB
GRANT ALL PRIVILEGES ON `powerdns`.* TO 'powerdnsuser'@'localhost' IDENTIFIED BY 'YOUR_PASSWORD_HERE';

Langkah 2: Install PowerDNS

  • Menontaktifkan service systemd-resolved karena akan bentrok dengan PowerDNS nantinya
bash
sudo systemctl disable --now systemd-resolved
  • Menghapus file konfigurasi system service
bash
sudo rm -rf /etc/resolv.conf
  • Membuat file /etc/resolv.conf baru dengan nameserver atau DNS Google
bash
sudo echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
  • Install package PowerDNS Server dan PowerDNS Database Backend
bash
sudo apt-get install pdns-server pdns-backend-mysql -y
  • Membuat skema database dari bawaan PowerDNS
bash
sudo mysql -u root -p powerdns < /usr/share/doc/pdns-backend-mysql/schema.mysql.sql

Langkah 3: Konfigurasi PowerDNS

Melakukan konfigurasi file lokal PowerDNS agar konek ke dalam Database

  • Backup file konfigurasi origin powerdns
bash
sudo mv /etc/powerdns/pdns.conf /etc/powerdns/pdns.conf.orig
  • Membuka file konfigurasi untuk mengedit
bash
sudo vim /etc/powerdns/pdns.conf
/etc/powerdns/pdns.conf
# MySQL Configuration
launch=gmysql
gmysql-host=127.0.0.1
gmysql-port=3306
gmysql-dbname=powerdns
gmysql-user=powerdnsuser
gmysql-password=YOUR_PASSWORD_HERE
gmysql-dnssec=yes
 
# API
api=yes
api-key=YOUR_API_KEY_HERE
 
# Webserver
webserver=yes
webserver-address=<loopback/your_second_ip>
webserver-port=8081
webserver-allow-from=127.0.0.1,<your_second_ip>
webserver-password=<YOUR_WEB_SERVER_PASSWORD>
  • Menonaktifkan service pdns
bash
sudo systemctl stop pdns
  • Tes koneksi ke database
bash
sudo pdns_server --daemon=no --guardian=no --loglevel=9

Catatan:

Bisa dilihat digambar dibawah ini, bahwa powerdns berhasil melakukan koneksi ke dalam database

plaintext
gmysql Connection successful. Connected to database 'powerdns' on '127.0.0.1'.
  • Menjalankan service powerdns
bash
sudo systemctl start pdns
  • Mengecek koneksi pdns dengan package ss atau Socket Statistics
bash
sudo ss -alnp4 | grep pdns

Catatan:

Bisa dilihat digambar dibawah ini, bahwa powerdns berhasil bejalan pada protocol tcp dan udp dengan state UNCONN dan LISTEN di port 53 dan 8081

plaintext
udp   UNCONN 0      0            0.0.0.0:53        0.0.0.0:*    users:(("pdns_server",pid=27734,fd=5))
tcp   LISTEN 0      10         127.0.0.1:8081      0.0.0.0:*    users:(("pdns_server",pid=27734,fd=9))
tcp   LISTEN 0      128          0.0.0.0:53        0.0.0.0:*    users:(("pdns_server",pid=27734,fd=7))

Langkah 4: Install PowerDNS Admin Dependencies

PowerDNS Admin membantu me-manage PowerDNS dengan Web Interface. Untuk menginstall dashboard secara lokal, ikuti dibawah ini

  • Install Python development package dan dependencies nya
bash
sudo apt install -y python3-dev git libsasl2-dev libldap2-dev python3-venv libmariadb-dev pkg-config build-essential curl libpq-dev
  • Install NodeJS
bash
curl -sL https://deb.nodesource.com/setup_18.x | sudo bash -
bash
sudo apt install -y nodejs
  • Install yarn package manager untuk build asset file
bash
curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | gpg --dearmor | sudo tee /usr/share/keyrings/yarnkey.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/yarnkey.gpg] https://dl.yarnpkg.com/debian stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt update && sudo apt install -y yarn
  • Masuk sebagai root user
bash
sudo su
  • Clone Repository PowerDNS Admin di PATH /opt/web/powerdns-admin
bash
git clone https://github.com/PowerDNS-Admin/PowerDNS-Admin.git /opt/web/powerdns-admin
cd /opt/web/powerdns-admin
  • Membuat virtualenv
bash
python3 -mvenv ./venv
  • Aktifkan virtual environment
bash
source ./venv/bin/activate
  • Upgrade pip ke versi terbaru
bash
pip install --upgrade pip
  • Install dependencies atau requirements dari file requirements.txt

Catatan:

Jika mengalami error: xmlsec1 is not installed or not in path. install dev-lib berikut ini

shell
apt install libxmlsec1 libxmlsec1-dev
bash
pip install -r requirements.txt

Langkah 5: Melakukan konfigurasi dan menjalankan PowerDNS Admin

  • Membuat salinan file development.py ke production.py
shell
cp configs/development.py configs/production.py
  • Membuka file konfigurasi production.py
shell
vim configs/production.py
  • Melakukan perubahan file production.py

Catatan:

Untuk bagiian SECRET_KEY kalian generate sendiri menggunakan perintah dibawah ini

shell
python -c 'import os; print(os.urandom(16))'
configs/production.py
import os
import urllib.parse
basedir = os.path.abspath(os.path.dirname(__file__))
 
### BASIC APP CONFIG
SALT = '$2b$12$yLUMTIfl21FKJQpTkRQXCu'
SECRET_KEY = 'YOU_SECRET_KEY'
BIND_ADDRESS = '0.0.0.0'
PORT = 9191
SERVER_EXTERNAL_SSL = None
 
### DATABASE CONFIG
SQLA_DB_USER = 'powerdnsuser'
SQLA_DB_PASSWORD = 'YOUR_PASSWORD_HERE'
SQLA_DB_HOST = '127.0.0.1'
SQLA_DB_NAME = 'powerdns'
SQLALCHEMY_TRACK_MODIFICATIONS = True
 
#CAPTCHA Config
CAPTCHA_ENABLE = True
CAPTCHA_LENGTH = 6
CAPTCHA_WIDTH = 160
CAPTCHA_HEIGHT = 60
CAPTCHA_SESSION_KEY = 'captcha_image'
 
#Server side sessions tracking
#Set to TRUE for CAPTCHA, or enable another stateful session tracking system
SESSION_TYPE = 'sqlalchemy'

Dikarenakan default config flask menggunakan database SQLite maka kita perlu mengubah konfigurasi nya agar menggunakan MySQL. Untuk melakukan nya masih di dalam file yang sama yaitu production.py di baris 30 - 49

Pythonconfigs/production.py
### DATABASE - MySQL
## Don't forget to uncomment the import in the top
SQLALCHEMY_DATABASE_URI = 'mysql://{}:{}@{}/{}'.format(
     urllib.parse.quote_plus(SQLA_DB_USER),
     urllib.parse.quote_plus(SQLA_DB_PASSWORD),
     SQLA_DB_HOST,
     SQLA_DB_NAME
)
 
### DATABASE - PostgreSQL
## Don't forget to uncomment the import in the top
#SQLALCHEMY_DATABASE_URI = 'postgres://{}:{}@{}/{}'.format(
#    urllib.parse.quote_plus(SQLA_DB_USER),
#    urllib.parse.quote_plus(SQLA_DB_PASSWORD),
#    SQLA_DB_HOST,
#    SQLA_DB_NAME
#)
 
### DATABASE - SQLite
#SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'pdns.db')
  • Export konfigurasi production ke dalam variable FLASK_CONF
bash
export FLASK_CONF=../configs/production.py
  • Export konfigurasi flask ke dalam variable FLASK_APP
bash
export FLASK_APP=powerdnsadmin/__init__.py
  • Upgrade skema database
bash
flask db upgrade
  • Install project dependencies menggunakan yarn
bash
yarn install --pure-lockfile
  • Build assets untuk aplikasi flask
shell
flask assets build
  • Menjalankan aplikasi flask di virtual env
shell
./run.py
  • Membuka aplikasi yang sudah di running pada port 9191

Catatan:

Untuk membuka aplikasi nya masukan URL pada web browser dengan format

plaintext
http://<ip_address>:9191

Catatan:

Jika mengalami error seperti gambar dibawah ini ketika berada di halaman register, maka perlu melakukan downgrade untuk dependency package pillow

Error tersebut terjadi karena pada aplikasi flask (PowerDNS Admin) ini menggunakan library pillow untuk mengenerate CAPTCHA

  • Menghapus package pillow
shell
pip uninstall pillow
  • Install pillow versi 9.4.0
shell
pip install pillow==9.4.0
  • Menjalankan kembali aplikasi flask di virtual env
shell
./run.py

Sampai proses ini, kita telah berhasil melakukan install PowerDNS sebagai DNS Service, MySQL sebagai backend dari PowerDNS dan PowerDNS Admin sebagai web interface nya.

Untuk langkah selanjutnya kita memerlukan web server seperti Nginx atau Apache agar aplikasi flask dari PowerDNS Admin ini bisa berjalan tanpa standalone

Untuk melakukan hal tersebut ikuti langkah dibawah ini

Langkah 6: Membuat PowerDNS Admin Service

Setelah sebelumnya kita berhasil menjalankan aplikasi flask PowerDNS Admin dengan standalone (tanpa webserver) selanjutnya kita perlu membuat service sendiri agar bisa berjalan dengan webserver

  • Matikan standalone aplikasi PowerDNS Admin nya

Untuk mematikannya cukup tekan CTRL + C pada terminal nya

  • Menonaktifkan virtual env
shell
deactivate
  • Membuat file systemd service untuk PowerDNS Admin
shell
vim /etc/systemd/system/powerdns-admin.service
  • Tambahkan konfigurasi berikut ini kedalam file powerdns-admin.service
/etc/systemd/system/powerdns-admin.service
[Unit]
Description=PowerDNS-Admin
Requires=powerdns-admin.socket
After=network.target
 
[Service]
User=root
Group=root
PIDFile=/run/powerdns-admin/pid
WorkingDirectory=/opt/web/powerdns-admin
ExecStartPre=/bin/bash -c '$$(mkdir -p /run/powerdns-admin/)'
ExecStart=/opt/web/powerdns-admin/venv/bin/gunicorn --pid /run/powerdns-admin/pid --bind unix:/run/powerdns-admin/socket 'powerdnsadmin:create_app()'
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
PrivateTmp=true
 
[Install]
WantedBy=multi-user.target
  • Membuat unit file
bash
systemctl edit --force powerdns-admin.service
  • Tambahkan konfigurasi berikut
/etc/systemd/system/powerdns-admin.service.d/override.conf
[Service]
Environment="FLASK_CONF=../configs/production.py"
Membuat Unit FileHasil
  • Membuat socket file
bash
vim /etc/systemd/system/powerdns-admin.socket
  • Tambahkan konfigurasi berikut ini kedalam file powerdns-admin.socket
/etc/systemd/system/powerdns-admin.socket
[Unit]
Description=PowerDNS-Admin socket
 
[Socket]
ListenStream=/run/powerdns-admin/socket
 
[Install]
WantedBy=sockets.target
  • Membuat environment file
bash
vim /etc/tmpfiles.d/powerdns-admin.conf
  • Tambahkan konfigurasi berikut ini kedalam file powerdns-admin.conf
/etc/tmpfiles.d/powerdns-admin.conf
d /run/powerdns-admin 0755 pdns pdns -
  • Reload daemon
shell
systemctl daemon-reload
  • Menjalankan dan mengizinkan service dan socket yang sudah dibuat sebelumnya
shell
systemctl start powerdns-admin.service powerdns-admin.socket
systemctl enable powerdns-admin.service powerdns-admin.socket
  • Mengecek status service dan socket yang sudah dijalankan
shell
systemctl status powerdns-admin.service powerdns-admin.socket

Langkah 7: Install dan Konfigurasi Web Server Nginx

Disini saya memilih Nginx sebagai web server nya, namun kalian juga bisa disesuaikan dengan keinginan kalian misalkan Apache.

Untuk melakukan konfigurasi web server lainnya kalian bisa membaca dokumentasi resmi dari PowerDNS Admin nya disini

  • Install Nginx Web Server
shell
apt install nginx -y
  • Menambahkan konfigurasi Nginx untuk aplikasi PowerDNS Admin
shell
vim /etc/nginx/conf.d/pdns-admin.conf
  • Tambahkan konfigurasi berikut kedalam file pdns-admin.conf
nginx
server {
  listen *:80;
  server_name                             localhost;
  index                                   index.html index.htm index.php;
  root                                    /opt/web/powerdns-admin;
  access_log                              /var/log/nginx/powerdns-admin.local.access.log combined;
  error_log                               /var/log/nginx/powerdns-admin.local.error.log;
  client_max_body_size                    10m;
  client_body_buffer_size                 128k;
  proxy_redirect                          off;
  proxy_connect_timeout                   90;
  proxy_send_timeout                      90;
  proxy_read_timeout                      90;
  proxy_buffers                           32 4k;
  proxy_buffer_size                       8k;
  proxy_set_header                        Host $host;
  proxy_set_header                        X-Real-IP $remote_addr;
  proxy_set_header                        X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_headers_hash_bucket_size          64;
  location ~ ^/static/  {
    include                               /etc/nginx/mime.types;
    root                                  /opt/web/powerdns-admin/powerdnsadmin;
    location ~*  \.(jpg|jpeg|png|gif)$ {
      expires                             365d;
    }
    location ~* ^.+.(css|js)$ {
      expires                             7d;
    }
  }
  location / {
    proxy_pass                            http://unix:/run/powerdns-admin/socket;
    proxy_read_timeout                    120;
    proxy_connect_timeout                 120;
    proxy_redirect                        off;
  }
}
  • Mengecek atau melakukan konfirmasi file nginx yang dibuat tidak ada syntax error
bash
nginx -t
  • Mengubah permission folder /opt/web/powerdns-admin agar menjadi milik www-data:www-data
shell
chown -R www-data:www-data /opt/web/powerdns-admin
  • Restart service Nginx
shell
systemctl restart nginx
  • Mengecek webserver Nginx berjalan di port http atau 80
shell
netstat -tunlp | grep nginx

Catatan:

Dapat dilihat digambar dibawah inih, bahwa webserver Nginx berjalan di port 80

  • Membuka aplikasi yang sudah running di port 80

Catatan:

Untuk membuka aplikasi nya masukan URL pada web browser dengan format

plaintext
http://<ip_address>

Apabila muncul nya seperti gambar diatas maka ada konfigurasi yang kurang pada nginx nya, ikuti langkah dibawah ini agar default page pada port 80 yang dibuka nya adalah aplikasi PowerDNS Admin

  • Mengubah konfigurasi nginx.conf
bash
vim /etc/nginx/nginx.conf
  • Berikan komen pada konfigurasi di baris 60
/etc/nginx/nginx.conf
...
    #include /etc/nginx/sites-enabled/*;
...
  • Restart kembali service nginx nya, agar konfigurasi yang sudah diubah tadi digunakan
shell
systemctl restart nginx
  • Buka kembali alamat url http://<ip_address> di web browser

Sekarang aplikasi Flask PowerDNS Admin sudah berjalan dengan web server nginx di port 80.

Selanjutnya anda dapat melakukan daftar untuk user login di halaman PowerDNS Admin nya

Langkah 8: Konfigurasi PowerDNS API

Untuk melakukan konfigurasi PowerDNS API, ikuti langkah dibawah ini

  • Login kedalam aplikasi PowerDNS Admin menggunakan web browser

Catatan:

Jika kalian pertama kali, buat akun terlebih dahulu. Default atau bawaan akun yang pertama kali dibuat akan otomatis role user nya adalah Administrator

  • Buka tab API Keys pada menu sidebar
  • Klik Create Key
  • Pada bagian Role pilih Administrator dan untuk Description isikan My Key
  • Klik Create API Key

Setelah memilih role dan mengisikan description untuk API Key selanjutnya tekan Create API Key

Apabila terdapat alert konfirmasi, copy API Key nya kemudian klik Confirm

  • Mengisikan PowerDNS API URL, PowerDNS API Key, PowerDNS Version

Catatan:

Untuk mengetahui PowerDNS API URL dan PowerDNS Version kalian bisa lihat di server

  • Mengecek PowerDNS API URL:
  • Mengecek PowerDNS Version:
  • Mengganti API Key PowerDNS Server agar sesuai dengan PowerDNS Admin

Setelah kalian copy API Key yang sebelumnya dibuat, selanjutnya ubah atau isikan konfigurasi api-key pada file /etc/powerdns/pdns.conf dengan API Key yang di copy sebelumnya.

Setelah mengubah nya, jangan lupa restart service pdns agar perubahan nya tersimpan

bash
systemctl restart pdns

Untuk mencoba apakah API nya berjalan kalian bisa menggunakan curl

bash
curl -v -H 'X-API-Key: YOUR_SECRET_KEY' http://127.0.0.1:8081/api/v1/servers/localhost | jq .
curl -v -H 'X-API-Key: YOUR_SECRET_KEY' http://127.0.0.1:8081/api/v1/servers/localhost/zones | jq .

Kesimpulan

Setelah melalui langkah-langkah dalam panduan ini, kalian telah menyiapkan PowerDNS, PowerDNS Web Interface pada Nginx, dan menghubungkan PowerDNS API.


Related Posts