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