Skip to main content
  1. Posts/

Install PowerDNS and PowerAdmin

·6 mins·
pdns pdns
Table of Contents

PowerDNS merupakan software DNS Server free dan open source yang mendukung banyak sistem operasi seperti BSD, Linux, dan macOS.

Selain berkinerja tinggi, PowerDNS juga mendukung beberapa jenis backend seperti BIND dan backend RDBMS seperti MySQL/MariaDB, PostgreSQL, dan database Oracle.

Installing and Configuring MariaDB Database Server
#

Setting repo mariadb.

nano /etc/yum.repos.d/mariadb.repo
# MariaDB 11.0 RedHatEnterpriseLinux repository list - created 2023-08-10 04:06 UTC
# https://mariadb.org/download/
[mariadb]
name = MariaDB
# rpm.mariadb.org is a dynamic mirror if your preferred mirror goes offline. See https://mariadb.org/mirrorbits/ for details.
# baseurl = https://rpm.mariadb.org/11.0/rhel/$releasever/$basearch
baseurl = https://suro.ubaya.ac.id/mariadb/yum/11.0/rhel/$releasever/$basearch
module_hotfixes = 1
# gpgkey = https://rpm.mariadb.org/RPM-GPG-KEY-MariaDB
gpgkey = https://suro.ubaya.ac.id/mariadb/yum/RPM-GPG-KEY-MariaDB
gpgcheck = 1

Selanjutnya install MariaDB

yum install MariaDB-server MariaDB-client

Enable dan start service.

systemctl enable --now mariadb

Buat database dan user pdns

mysql
create database pdns;
create user 'pdns'@'localhost' identified by 'password';
grant all privileges on pdns.* to 'pdns'@'localhost' with grant option;
flush privileges;
quit

Installing and Configuring PowerDNS
#

Setelah menginstall dan konfigurasi database Mariadb, selanjutnya install PowerDNS dengan backend database MariaDB.

Install repo epel.

yum -y install epel-release

Lalu install pdns dan pdns-backend-mysql

yum -y install pdns pdns-tools pdns-backend-mysql

Import skema database pdns.

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

Edit file /etc/pdns/pdns.conf dengan menambahkan konfig pada bagian launch.

launch=gmysql

gmysql-host=localhost 
gmysql-user=pdns
gmysql-password=password 
gmysql-dbname=pdns

Selanjutnya uncomment bagian api dan api-key.

#################################
# api   Enable/disable the REST API (including HTTP listener)
#
api=yes

#################################
# api-key       Static pre-shared authentication key for access to the REST API
#
api-key=7c354e13f2482cd821c715b563d5f90ea4a57a

API Power DNS akan digunakan untuk mengelola server PowerDNS melalui aplikasi PowerDNS-Admin. api-key dapat Anda ganti sesuai keinginan.

Save file dan keluar dari editor setelah selesai.

Jalankan perintah berikut untuk memverifikasi dan memastikan konfigurasi PowerDNS sudah sesuai atau tidak erorr.

pdns_server --daemon=no --guardian=no --loglevel=9
Aug 10 13:42:43 gmysql Connection successful. Connected to database 'pdns' on 'localhost'.
Aug 10 13:42:43 Creating backend connection for TCP
Aug 10 13:42:43 gmysql Connection successful. Connected to database 'pdns' on 'localhost'.
Aug 10 13:42:43 About to create 3 backend threads for UDP
Aug 10 13:42:43 gmysql Connection successful. Connected to database 'pdns' on 'localhost'.
Aug 10 13:42:43 gmysql Connection successful. Connected to database 'pdns' on 'localhost'.
Aug 10 13:42:43 gmysql Connection successful. Connected to database 'pdns' on 'localhost'.
Aug 10 13:42:43 Done launching threads, ready to distribute questions

Enable dan start service pdns.

systemctl enable --now pdns

Installing PowerDNS-Admin
#

PowerDNS-Admin adalah aplikasi web berbasis Python Flask, jadi instalasi PowerDNS-Admin hampir sama dengan instalasi web framework Flask.

Installing Package Dependencies

Install python beserta dependensi package lainnya.

yum -y install python38-pip python38-devel MariaDB-devel git openldap-devel xmlsec1-devel xmlsec1-openssl libtool-ltdl-devel postgresql-devel gcc

Selanjutnya install virtualenv.

pip3.8 install -U pip
pip install -U virtualenv

Tambahkan repo NodeJS. Ini digunakan untuk generate file statis aplikasi web PowerAdmin

curl -fsSL https://rpm.nodesource.com/setup_16.x | sudo bash -

Setelah repo ditambahkan, install NodeJS dengan perintah.

yum install -y nodejs

Install juga Yarn package manager

curl -sL https://dl.yarnpkg.com/rpm/yarn.repo | tee /etc/yum.repos.d/yarn.repo
yum install yarn

Pastikan versi NodeJS yang terinstall sudah sesuai.

# node -v
v16.20.1

Setting up Python Virtual Environment

Clone source code PowerDNS-Admin ke direktori /opt/pdns.

git clone https://github.com/PowerDNS-Admin/PowerDNS-Admin.git /opt/pdns

Masuk ke direktori /opt/pdns lalu buat virtual environment python.

cd /opt/pdns
virtualenv -p /usr/bin/python3.8 venv

Activate virtual environment.

source /opt/pdns/venv/bin/activate

Installing python dependencies

Jalankan perintah pip berikut untuk menginstall dependensi python pada PowerDNS-Admin.

pip install python-dotenv
pip install -r requirements.txt

Configuring PowerDNS-Admin with MariaDB Database

Edit file /opt/pdns/powerdnsadmin/default_config.py untuk konfigurasi databasenya.

nano /opt/pdns/powerdnsadmin/default_config.py
### DATABASE CONFIG
SQLA_DB_USER = 'pdns'
SQLA_DB_PASSWORD = 'pdns'
SQLA_DB_HOST = '127.0.0.1'
SQLA_DB_NAME = 'pdns'
SQLALCHEMY_TRACK_MODIFICATIONS = True

### DATABASE - MySQL
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
)

Comment bagian DATABASE - SQLite.

### DATABASE - SQLite
# SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'pdns.db')

Generating Database Schema and Building Static Files

Migrasikan skema database baru ke database yang akan digunakan untuk PowerDNS-Admin.

export FLASK_APP=powerdnsadmin/__init__.py
flask db upgrade

Setelah selesai, generate file statis untuk web PowerDNS-Admin.

yarn install --pure-lockfile
flask assets build

Testing web untuk memastikan statis file berhasil digenerate.

./run.py
# ./run.py
 * Serving Flask app 'powerdnsadmin' (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: on
[2023-08-10 22:22:15,798] [_internal.py:224] INFO -  * Running on all addresses (0.0.0.0)
   WARNING: This is a development server. Do not use it in a production deployment.
 * Running on http://127.0.0.1:9191
 * Running on http://192.168.100.31:9191 (Press CTRL+C to quit)
[2023-08-10 22:22:15,802] [_internal.py:224] INFO -  * Restarting with stat
[2023-08-10 22:22:19,822] [_internal.py:224] WARNING -  * Debugger is active!
[2023-08-10 22:22:19,823] [_internal.py:224] INFO -  * Debugger PIN: 122-229-422

Akses http://IP:9191 melalui browser Anda.

Deactivate virtual environment untuk melanjutkan ke step berikutnya.

deactivate

Setting up Systemd Service for PowerDNS-Admin

Buat file service untuk aplikasi PowerDNS-Admin menggunakan systemd.

nano /etc/systemd/system/powerdns-admin.service
[Unit]
Description=PowerDNS-Admin
Requires=powerdns-admin.socket
After=network.target

[Service]
PIDFile=/run/powerdns-admin/pid
User=pdns
Group=pdns
WorkingDirectory=/opt/pdns
ExecStartPre=+mkdir -p /run/powerdns-admin/
ExecStartPre=+chown pdns:pdns -R /run/powerdns-admin/
ExecStart=/opt/pdns/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

Selanjutnya buat file socket systemd.

nano /etc/systemd/system/powerdns-admin.socket
[Unit]
Description=PowerDNS-Admin socket

[Socket]
ListenStream=/run/powerdns-admin/socket

[Install]
WantedBy=sockets.target

Buat file pada direktori /etc/tmpfiles.d lalu salin konfigurasi berikut untuk mengatur supaya direktori /run/powerdns-admin dapat dibuat secara otomatis apabila belum ada.

nano /etc/tmpfiles.d/powerdns-admin.conf
d /run/powerdns-admin 0755 pdns pdns -

Setting permission direktori /opt/pdns.

chown -R pdns:pdns /opt/pdns

Reload systemd untuk menerapkan service dan socket yang baru.

systemctl daemon-reload

Enable dsn start service powerdns-admin.service powerdns-admin.socket

systemctl enable --now powerdns-admin.service powerdns-admin.socket

Cek status service dan socket lalu pastikan statusnya running.

systemctl status powerdns-admin.service powerdns-admin.socket

Installing Nginx as a Reverse Proxy for PowerDNS-Admin

Tambahkan repo nginx.

nano /etc/yum.repos.d/nginx.repo
[nginx-stable]
name=nginx stable repo
baseurl=http://nginx.org/packages/centos/$releasever/$basearch/
gpgcheck=1
enabled=1
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

[nginx-mainline]
name=nginx mainline repo
baseurl=http://nginx.org/packages/mainline/centos/$releasever/$basearch/
gpgcheck=1
enabled=0
gpgkey=https://nginx.org/keys/nginx_signing.key
module_hotfixes=true

Install nginx

yum install nginx

Buat virtualhost nginx dengan domain local.

/etc/nginx/conf.d/pdns.conf
server {
  listen *:80;
  server_name               powerdns-admin.local www.powerdns-admin.local;

  index                     index.html index.htm index.php;
  root                      /opt/pdns;
  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/pdns/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;
  }

}

Test akses http://powerdns-admin.local

Accessing PowerDNS-Admin Installation

Klik Create an account untuk membuat akun baru.

Lalu isi semua form yang tersedia.

Setelah berhasil login, konfigurasi PowerDNS API menggunakan api-key yang sudah ditentukan pada /etc/pdns/pdns.conf

Apabila sudah terhubung selanjutnya buat zone dan tambahkan A record.

Tes untuk memastikan DNS Server dapat berjalan.

# dig muterin.local @192.168.33.22 +short
192.168.33.11

Related

DNS Manual Mode in acme.sh
·3 mins
acme.sh acme.sh
Advanced L2 Configuration with MetalLB
·3 mins
metallb metallb kubernetes
Using VLAN with MetalLB Kubernetes
·2 mins
metallb kubernetes metallb
Install MetalLB di Kubernetes
·2 mins
metallb kubernetes metallb
MetalLB BGP Routing with pfSense
·3 mins
metallb kubernetes cilium pfsense metallb
Resolving Static Route Issues on pfSense
·1 min
pfsense pfsense