Tutorial Proses Instalasi dan Konfigurasi PowerDNS di Ubuntu | UNIX LINUX EXPLORE
Edit

Tutorial Proses Instalasi dan Konfigurasi PowerDNS di Ubuntu

2024/08/05
PowerDNS adalah nameserver serbaguna yang mendukung sejumlah besar backend berbeda mulai dari zonefile sederhana hingga database relasional dan algoritma penyeimbangan beban/failover. PowerDNS mencoba untuk menekankan kecepatan dan keamanan. Dari faktor kestabilan, PowerDNS juga dapat dihandalkan tak kalah dengan server DNS seperti Bind atau lainnya.

Karena berbagai macam kelebihan yang dimiliki PowerDNS, server DNS ini dapat anda jadikan solusi server DNS, karena memiliki kode sumber terbuka yang membantu menyelesaikan namespace. PowerDNS juga mendukung kecepatan tingkat tinggi, redundansi data, dan berbagai backend, yang menjadikannya solusi yang fleksibel dan tangguh.




Panduan ini menunjukkan cara menginstal PowerDNS dan antarmuka Admin PowerDNS di Ubuntu.


1. Persyaratan Sistem

Agar PowerDNS dapat berjaaln secara sempurna dan berdaya guna, ada beberapa persyaraan sistem yang harus anda penuhi diantaranya adalah:

a. IP Addresses

Server akan memerlukan alamat IPv4 privat khusus yang telah anda setup di router, pada artikel ini kami menggunakan IP private 192.168.5.3. Agar lebih sempurna lagi anda juga harus mengetahui alamat IPv4 publik di gateway router anda. Pada contoh ini, kami menggunakan router Indihome dengan gateway IPv4 publik 36.90.11.52.

b. Router Firewall Gateway

Karena kami menggunakan internet Indihome, jadi kita jadikan router Indihome sebagai router firewall gatewaynya. Fungsi router disini untuk meneruskan lalu lintas IPv4 eksternal yang masuk pada port TCP dan UDP 53 ke alamat IPv4 privat server DNS anda.

c. Database server

Anda bebas memilih database server yang akan digunakan sebagai backend PowerDNS. Umumnya MySQL server banyak digunaakn sebagai backen PowerDNS.

d. Server Ubuntu

Ini sudah pasti, karena PowerDNS akan kita jalankan di Ubuntu. Versi Ubuntu yang anda gunakan terserah anda, tapi kami sarankan versi terakhir dan terbaru.


2. Proses Instalasi PowerDNS

Perangkat lunak server PowerDNS ada di repositori paket perangkat lunak Ubuntu. Pada artikel ini kami memasang server dan backend basis data MariaDB.

Install PowerDNS
$ sudo apt-get install pdns-server pdns-backend-mysql
Selama proses instalasi berlangsung, anda akan dimintai kata sandi pengguna root MySQL, sehingga basis data dapat dibuat dan disinkronkan. Dan selama proses instalasi, ada file dan folder yang dibuat secara otomatis sebagai reaksi dari perintah install yang anda jalankan. Berikut ini file dan folder yang akan anda gunakan untuk proses konfigurasi PowerDNS.
  • /etc/powerdns/pdns.conf.
  • /etc/default/pdns.
  • /etc/powerdns/pdns.d/pdns.local.conf.
  • /etc/powerdns/pdns.d/pdns.simplebind.conf.
  • /etc/powerdns/pdns.d/pdns.local.gmysql.conf
Jangan lupa, anda juga harus membuat user dan group yang kan dikoneksikan ke database MySQL server.


3. Edit Systemd Service Dependencies

Karena kami menggunakan MariaDB server sebagai backend basis data untuk PowerDNS, kita pastikan bahwa PowerDNS selalu dapat terhubung ke server basis data sebelum dijalankan.

File layanan Systemd untuk server PowerDNS /lib/systemd/system/pdns.service dibuat sebagai bagian dari instalasi paket perangkat lunak. Metode yang disarankan adalah membuat file override Systemd dan tidak mengubah apa pun dalam file layanan yang disediakan, karena file tersebut akan hilang saat pembaruan paket perangkat lunak.

Anda dapat membuat file override dengan mudah menggunakan perintah systemctl.

Edit pdns.service
$ sudo systemctl edit pdns.service
Perintah di atas digunakan untuk memulai editor dengan file kosong, tempat Anda dapat menambahkan opsi konfigurasi layanan Systemd kustom Anda sendiri.


[Unit]
BindsTo=mariadb.service
Pernyataan konfigurasi After=mariadb.service memastikan bahwa mariadb.service telah dimulai sepenuhnya sebelum pdns.service dimulai. Layanan ini sudah disertakan dalam berkas layanan yang diinstal oleh paket perangkat lunak.

Baris BindsTo=mariadb.service memastikan bahwa jika layanan Basis Data dihentikan, server PowerDNS juga akan dihentikan. Setelah Anda menyimpan dan keluar dari editor, berkas akan disimpan sebagai /etc/systemd/system/pdns.service.d/override.conf dan Systemd akan memuat ulang konfigurasinya.


systemctl show pdns.service |grep -E "After=|BindsTo="
Secara default PowerDNS menggunakan file zona bergaya BIND untuk menyimpan data DNS.

Karena hanya satu backend yang dapat aktif pada satu waktu dan kami memasang backend MariaDB, kami perlu menghapus "backend BIND" default Ubuntu. Hal ini dapat anda lakukan hanya dengan menghapus file konfigurasinya.

Edit pdns.service
$ sudo rm /etc/powerdns/pdns.d/pdns.simplebind.conf
Setelah itu, anda perlu mengubah file /etc/powerdns/pdns.d/pdns.local.gmysql.conf, seperti contoh di bawah ini.

/etc/powerdns/pdns.d/pdns.local.gmysql.conf
# MySQL Configuration
#
# Launch gmysql backend
launch=gmysql

# gmysql parameters
#gmysql-host=localhost
#gmysql-port=
gmysql-dbname=pdns
gmysql-user=pdns
gmysql-password=********
gmysql-dnssec=yes
gmysql-socket=/var/run/mysqld/mysqld.sock


4. Membuat Backend Data Base Server

Pada proses ini anda harus membuat database kosong baru bernama pdns di server MariaDB atau MySQL.

Buat database baru
$ mysql -u root -p
GRANT SELECT ON pdns.* TO 'pdns'@'127.0.0.1'
    IDENTIFIED BY 'password123';
FLUSH PRIVILEGES;
EXIT;
File powerdns.sql berisi struktur database PowerDNS seperti yang ditunjukkan dalam dokumentasi PoweDNS. Di bawah ini kami berikan contoh file script powerdns.sql yang harus anda jalankan di database MariaDB/MySQL.


Script file powerdns.sql
CREATE TABLE domains (
  id                    INT AUTO_INCREMENT,
  name                  VARCHAR(255) NOT NULL,
  master                VARCHAR(128) DEFAULT NULL,
  last_check            INT DEFAULT NULL,
  type                  VARCHAR(6) NOT NULL,
  notified_serial       INT DEFAULT NULL,
  account               VARCHAR(40) DEFAULT NULL,
  PRIMARY KEY (id)
) Engine=InnoDB;

CREATE UNIQUE INDEX name_index ON domains(name);


CREATE TABLE records (
  id                    INT AUTO_INCREMENT,
  domain_id             INT DEFAULT NULL,
  name                  VARCHAR(255) DEFAULT NULL,
  type                  VARCHAR(10) DEFAULT NULL,
  content               VARCHAR(64000) DEFAULT NULL,
  ttl                   INT DEFAULT NULL,
  prio                  INT DEFAULT NULL,
  change_date           INT DEFAULT NULL,
  disabled              TINYINT(1) DEFAULT 0,
  ordername             VARCHAR(255) BINARY DEFAULT NULL,
  auth                  TINYINT(1) DEFAULT 1,
  PRIMARY KEY (id),

) Engine=InnoDB;

CREATE INDEX nametype_index ON records(name,type);
CREATE INDEX domain_id ON records(domain_id);
CREATE INDEX recordorder ON records (domain_id, ordername);


CREATE TABLE supermasters (
  ip                    VARCHAR(64) NOT NULL,
  nameserver            VARCHAR(255) NOT NULL,
  account               VARCHAR(40) NOT NULL,
  PRIMARY KEY (ip, nameserver)
) Engine=InnoDB;


CREATE TABLE comments (
  id                    INT AUTO_INCREMENT,
  domain_id             INT NOT NULL,
  name                  VARCHAR(255) NOT NULL,
  type                  VARCHAR(10) NOT NULL,
  modified_at           INT NOT NULL,
  account               VARCHAR(40) NOT NULL,
  comment               VARCHAR(64000) NOT NULL,
  PRIMARY KEY (id)
) Engine=InnoDB;

CREATE INDEX comments_domain_id_idx ON comments (domain_id);
CREATE INDEX comments_name_type_idx ON comments (name, type);
CREATE INDEX comments_order_idx ON comments (domain_id, modified_at);


CREATE TABLE domainmetadata (
  id                    INT AUTO_INCREMENT,
  domain_id             INT NOT NULL,
  kind                  VARCHAR(32),
  content               TEXT,
  PRIMARY KEY (id)
) Engine=InnoDB;

CREATE INDEX domainmetadata_idx ON domainmetadata (domain_id, kind);


CREATE TABLE cryptokeys (
  id                    INT AUTO_INCREMENT,
  domain_id             INT NOT NULL,
  flags                 INT NOT NULL,
  active                BOOL,
  content               TEXT,
  PRIMARY KEY(id)
) Engine=InnoDB;

CREATE INDEX domainidindex ON cryptokeys(domain_id);


CREATE TABLE tsigkeys (
  id                    INT AUTO_INCREMENT,
  name                  VARCHAR(255),
  algorithm             VARCHAR(50),
  secret                VARCHAR(255),
  PRIMARY KEY (id)
) Engine=InnoDB;

CREATE UNIQUE INDEX namealgoindex ON tsigkeys(name, algorithm);

ALTER TABLE `records` ADD CONSTRAINT `records_ibfk_1` FOREIGN KEY (`domain_id`)
REFERENCES `domains` (`id`) ON DELETE CASCADE;
Setelah anda menjalankan script di atas, lanjutkan dengan membuat struktur tabel di bawah ini di database PowerDNS yang baru kita buat.


$ mysql -u root -p pdns < powerdns.sql


5. Konfigurasi PowerDNS

Langkah ini merupakan langkah terpenting selama proses pemasangan PowerDNS. setelah instalasi selesai, PowerDNS memiliki file konfigurasi utama, anda harus mengedit file tersebut (sesuaikan dengan kebutuhan sistem anda). Berikut ini kami berikan contoh script file /etc/powerdns/pdns.conf.

/etc/powerdns/pdns.conf
# Autogenerated configuration file template
#

#################################
# Secondary slaves
#
# puck.nether.net
# 204.42.254.5
# 2001:418:3f4::5 - notify, axfr
# 
# ns1.rollernet.us
# 208.79.240.3
# 2607:fe70:0:3::b - notify, axfr
#
# ns2.rollernet.us
# 208.79.241.3
# 2607:fe70:0:4::b - notify, axfr
# 
# ns2.afraid.org
# 208.43.71.243 - notify
# 2607:f0d0:3001:e::2
# 174.37.196.55 - axfr
#

#################################
# only-notify		Only send AXFR NOTIFY to these IP addresses or netmasks. 
# 					The default is to notify the world.
#
#only-notify=204.42.254.5 2001:418:3f4::5 2607:fe70:0:3::b 2607:fe70:0:4::b 208.43.71.243

#################################
# allow-axfr-ips    If enabled, restrict zonetransfers to originate from these
#                   IP addresses
allow-axfr-ips=127.0.0.1 ::1 192.0.2.0/24 2001:db8::/64

#################################
# allow-recursion	List of netmasks that are allowed to recurse
#
allow-recursion=127.0.0.1

#################################
# allow-recursion-override   Local data even about hosts that don't exist will
#                            override the internet. (on/off)
#
# allow-recursion-override=

#################################
# cache-ttl	Seconds to store packets in the PacketCache
#
# cache-ttl=20

#################################
# chroot	If set, chroot to this directory for more security
#
# chroot=/var/spool/powerdns

#################################
# config-dir	Location of configuration directory (pdns.conf)
#
config-dir=/etc/powerdns

#################################
# config-name	Name of this virtual configuration - will rename the binary image
#
# config-name=

#################################
# control-console	Debugging switch - don't use
#
# control-console=no

#################################
# daemon	Operate as a daemon
#
daemon=yes

#################################
# default-soa-name	name to insert in the SOA record if none set in the backend
#
# default-soa-name=a.misconfigured.powerdns.server

#################################
# disable-axfr	Disable zonetransfers but do allow TCP queries
#
disable-axfr=no

#################################
# disable-tcp	Do not listen to TCP queries
#
# disable-tcp=no

#################################
# distributor-threads	Default number of Distributor (backend) threads to start
#
# distributor-threads=3

#################################
# fancy-records	Process URL and MBOXFW records
#
# fancy-records=no

#################################
# guardian	Run within a guardian process
#
guardian=yes

#################################
# launch	Which backends to launch and order to query them in
#
# launch=

#################################
# load-modules	Load this module - supply absolute or relative path
#
# load-modules=

#################################
# local-address	Local IP address to which we bind
#
local-address=192.0.2.41

#################################
# local-ipv6	Local IP address to which we bind
#
local-ipv6=2001:db8::41

#################################
# local-port	The port on which we listen
#
local-port=53

#################################
# log-dns-details	If PDNS should log failed update requests
#
log-dns-details=yes

#################################
# log-failed-updates	If PDNS should log failed update requests
#
log-failed-updates=yes

#################################
# use-logfile	Use a log file
#
#use-logfile=yes

#################################
# logfile	Logfile to use
#
#logfile=/var/log/pdns.log

#################################
# logging-facility	Log under a specific facility
#
logging-facility=0

#################################
# loglevel	Amount of logging. Higher is more. Do not set below 3
#
loglevel=4

#################################
# master	Act as a master
#
master=yes

#################################
# max-queue-length	Maximum queuelength before considering situation lost
#
# max-queue-length=5000

#################################
# max-tcp-connections	Maximum number of TCP connections
#
# max-tcp-connections=10

#################################
# module-dir	Default directory for modules
#
module-dir=/usr/lib/powerdns

#################################
# negquery-cache-ttl	Seconds to store packets in the PacketCache
#
# negquery-cache-ttl=60

#################################
# out-of-zone-additional-processing	Do out of zone additional processing
#
# out-of-zone-additional-processing=no

#################################
# query-cache-ttl	Seconds to store packets in the PacketCache
#
# query-cache-ttl=20

#################################
# query-logging	Hint backends that queries should be logged
#
# query-logging=no

#################################
# queue-limit	Maximum number of milliseconds to queue a query
#
# queue-limit=1500

#################################
# query-local-address   The IP address to use as a source address for sending
#                       queries.
query-local-address=192.0.2.41
query-local-address6=2001:db8::41

#################################
# receiver-threads	Number of receiver threads to launch
#
# receiver-threads=1

#################################
# recursive-cache-ttl	Seconds to store packets in the PacketCache
#
# recursive-cache-ttl=10

#################################
# recursor	If recursion is desired, IP address of a recursing nameserver
#
# recursor=

#################################
# setgid	If set, change group id to this gid for more security
#
setgid=pdns

#################################
# setuid	If set, change user id to this uid for more security
#
setuid=pdns

#################################
# skip-cname	Do not perform CNAME indirection for each query
#
# skip-cname=no

#################################
# slave	Act as a slave
#
# slave=no

#################################
# slave-cycle-interval	Reschedule failed SOA serial checks once every .. seconds
#
# slave-cycle-interval=60

#################################
# smtpredirector	Our smtpredir MX host
#
# smtpredirector=a.misconfigured.powerdns.smtp.server

#################################
# soa-minimum-ttl	Default SOA mininum ttl
#
# soa-minimum-ttl=3600

#################################
# soa-refresh-default  Default SOA refresh
#
# soa-refresh-default=10800

#################################
# soa-retry-default    Default SOA retry
#
# soa-retry-default=3600

#################################
# soa-expire-default   Default SOA expire
#
# soa-expire-default=604800

#################################
# soa-serial-offset	Make sure that no SOA serial is less than this number
#
# soa-serial-offset=0

#################################
# socket-dir	Where the controlsocket will live
#
socket-dir=/var/run

#################################
# strict-rfc-axfrs	Perform strictly rfc compliant axfrs (very slow)
#
# strict-rfc-axfrs=no

#################################
# urlredirector	Where we send hosts to that need to be url redirected
#
# urlredirector=127.0.0.1

#################################
# webserver	Start a webserver for monitoring
#
webserver=yes

#################################
# webserver-address	IP Address of webserver to listen on
#
webserver-address=127.0.0.1

#################################
# webserver-password	Password required for accessing the webserver
#
webserver-password=********

#################################
# webserver-port	Port of webserver to listen on
#
webserver-port=8081

#################################
# webserver-print-arguments	If the webserver should print arguments
#
# webserver-print-arguments=no

#################################
# wildcard-url	Process URL and MBOXFW records
#
# wildcard-url=no

#################################
# wildcards	Honor wildcards in the database
#
# wildcards=

#################################
# version-string   What should PowerDNS return for version
#                  allowed methods are anonymous / powerdns / full / custom
version-string=powerdns

include-dir=/etc/powerdns/pdns.d

a. REST API

Buat string acak untuk digunakan sebagai kunci API untuk mengakses server oleh aplikasi lain.


$ pwgen -cns 64 1

# cache-ttl=20
#################################
# chroot	If set, chroot to this directory for more security
#
# chroot=/var/spool/powerdns

#################################
# config-dir	Location of configuration directory (pdns.conf)
#
config-dir=/etc/powerdns

#################################
# config-name	Name of this virtual configuration - will rename the binary image
#
# config-name=

#################################
# control-console	Debugging switch - don't use

b. Izinkan Transfer Zona


#################################
# allow-axfr-ips    If enabled, restrict zonetransfers to originate from these
#                   IP addresses
allow-axfr-ips=127.0.0.1 ::1 192.0.2.0/24 2001:db8::/64

#################################

c. Mengaktifkan Transfer Zona


#################################
# disable-axfr	Disable zonetransfers but do allow TCP queries
#
disable-axfr=no

#################################

d. Alamat IP Server


#################################
# local-address	Local IP address to which we bind
#
local-address=192.0.2.41

#################################
# local-ipv6	Local IP address to which we bind
#
local-ipv6=2001:db8::41

#################################

e. Buat Server Master


#################################
# master	Act as a master
#
master=yes

#################################
Secara default PowerDNS akan menggunakan alamat IP terakhir yang ditetapkan sebagai alamat sumber untuk mengirimkan pesan PEMBERITAHUAN DNS ke server slave.

Server slave tidak akan menerima pesan PEMBERITAHUAN apa pun, jika pesan tersebut tidak berasal dari server master yang ditetapkan dari suatu domain. Berikut ini adalah cara kami memberi tahu PowerDNS untuk menggunakan alamat IPv4 dan IPv6 khusus untuk koneksi keluar.

Buat kunci API
#################################
# query-local-address   The IP address to use as a source address for sending
#                       queries.
query-local-address=192.0.2.41
query-local-address6=2001:db8::41

#################################
Langkah selanjutnya adalah anda lakukan restart terhadap PowerDNS

Restart PowerDNS
$ sudo service pdns restart

f. Cara Import Zone-Files

Jika Anda sudah memiliki file zona, dari server DNS sebelumnya atau penyedia pihak ketiga, Anda dapat mengimpornya dengan cara berikut.

Import zona file
$ zone2sql --zone=example.net.zone \
           --zone-name=example.net \
           --gmysql --transactions --verbose \
           > example.net.zone.sql
1 domains were fully parsed, containing 49 records
$ mysql -u root -p pdns < example.net.zone.sql
Enter password:
Sampai sini proses instalasi dan konfigurasi PowerDNS telah selesai, sangat simpel dan sangat mudah bukan. Bila anda belum puas dengan satu server PowerDNS, lanutkan dengan mengkonfigurasi server PowerDNS sebagai Slave.