Xây dựng hệ thống DNS PowerDNS 4.1.0 chịu tải cao trên Ubuntu 16, Ubuntu 18 chạy Standalone, HA từ A-Z.
Build PowerDNS 4.1.0 on Ubuntu 16, Ubuntu 18
Phần 1: Cài đặt PowerDns Standalone
Link tham khảo
- Ưu điểm của PowerDNS 
 
Có hỗ trợ DB: MySQL, PostgreSQL, Oracle, Sybase, Microsoft SQL Server, LDAP, SQLite3
○ Including replication
○ Near instant startup time
Có giao diện thân thiện.
Hỗ trợ secure DNS
Các tính năng khác của PowerDNS
- Authoritative DNS server (hosting) 
- Resolving DNS server (caching) 
- API to provision zones and records 
- DNSSEC support (as of 3.x) 
- Web-based management options 
- DNS data stored in plaintext (BIND compatible) 
- IPv4 and IPv6, UDP/TCP, 100% compliant 
- MySQL, PostgreSQL, Microsoft SQL Server, Oracle, Sybase database back ends 
- Load balancing/failover algorithms 
- SNMP support 
- Remotely pollable statistics for real-time graphing 
- Optional built-in web server 
- Debugging tools 
- Support for Linux, BSD, Unix 
The PowerDNS recursor supports:
- All relevant standards 
- Advanced anti-spoofing measures 
- Reconfiguration without downtime 
- Plain BIND zone files for “resolved hosting” 
- Question interception, answer reconditioning, NXDOMAIN redirection (including “block lists” and security measures) 
- The rec_control utility, an API for direct control of the PowerDNS recursor and to output data to MRTG and RDD for pretty network graphs 
- Local and remote access 
- DNS64 
- Cấu hình database: 
 
# https://computingforgeeks.com/install-mariadb-10-on-ubuntu-18-04-and-centos-7/
Các bạn có thể cấu hình database theo link hướng dẫn trên.
- Cài đặt powerdns và powerdns-admin 
 
Làm theo các bước cài đặt, thay đổi password user powerdns và powerdnsadmin.
- FIX LỗI 
 
Jul 11 17:11:57 srv038 gunicorn[4221]: RuntimeError: Error while fetching http://127.0.0.1:8081/api/v1/servers/localhost/zones
Nếu gặp lỗi này thì cần xử lý như sau
# https://doc.powerdns.com/authoritative/http-api/index.html
nano /etc/powerdns/pdns.conf
# chỉnh như sau
api=yes
api-key=changeme
api-key=123456@@
systemctl restart powerdns-admin.service
systemctl restart pdns
# sau đó điền key 123456@@ vào mục PDNS API KEY
# mục PDNS API URL điền http://127.0.0.1:8081/
Để kiểm tra trực quan các bạn có thể sử dụng phần mềm hedissql để kết nối vào DB vào kiểm tra các bảng mà PDNS đã tạo ra.
Tạo 1 domain và trỏ Test chỉ định DNS bất kì
Fix lỗi
(flask) root@srv039:/opt/web/powerdns-admin# flask db upgrade
 * Tip: There are .env files present. Do "pip install python-dotenv" to use them.
Traceback (most recent call last):
 File "/opt/web/powerdns-admin/flask/bin/flask", line 10, in <module>
   sys.exit(main())
 File "/opt/web/powerdns-admin/flask/lib/python3.6/site-packages/flask/cli.py", line 894, in main
   cli.main(args=args, prog_name=name)
 File "/opt/web/powerdns-admin/flask/lib/python3.6/site-packages/flask/cli.py", line 557, in main
   return super(FlaskGroup, self).main(*args, **kwargs)
 File "/opt/web/powerdns-admin/flask/lib/python3.6/site-packages/click/core.py", line 717, in main
   rv = self.invoke(ctx)
 File "/opt/web/powerdns-admin/flask/lib/python3.6/site-packages/click/core.py", line 1137, in invoke
   return _process_result(sub_ctx.command.invoke(sub_ctx))
 File "/opt/web/powerdns-admin/flask/lib/python3.6/site-packages/click/core.py", line 1137, in invoke
   return _process_result(sub_ctx.command.invoke(sub_ctx))
 File "/opt/web/powerdns-admin/flask/lib/python3.6/site-packages/click/core.py", line 956, in invoke
   return ctx.invoke(self.callback, **ctx.params)
 File "/opt/web/powerdns-admin/flask/lib/python3.6/site-packages/click/core.py", line 555, in invoke
   return callback(*args, **kwargs)
 File "/opt/web/powerdns-admin/flask/lib/python3.6/site-packages/click/decorators.py", line 17, in new_func
   return f(get_current_context(), *args, **kwargs)
 File "/opt/web/powerdns-admin/flask/lib/python3.6/site-packages/flask/cli.py", line 411, in decorator
   with __ctx.ensure_object(ScriptInfo).load_app().app_context():
 File "/opt/web/powerdns-admin/flask/lib/python3.6/site-packages/flask/cli.py", line 372, in load_app
   app = locate_app(self, import_name, name)
 File "/opt/web/powerdns-admin/flask/lib/python3.6/site-packages/flask/cli.py", line 235, in locate_app
   __import__(module_name)
 File "/opt/web/powerdns-admin/app/__init__.py", line 24, in <module>
   app.config.from_object('config')
 File "/opt/web/powerdns-admin/flask/lib/python3.6/site-packages/flask/config.py", line 170, in from_object
   obj = import_string(obj)
 File "/opt/web/powerdns-admin/flask/lib/python3.6/site-packages/werkzeug/utils.py", line 547, in import_string
   __import__(import_name)
 File "/opt/web/powerdns-admin/config.py", line 1
   SQLA_DB_USERimport os
                       ^
SyntaxError: invalid syntax
Sửa như sau:
cd /opt/web/powerdns-admin#
nano config.py
#commend và thêm phần import
#SQLA_DB_USERimport os
import os
Phần 2: Cấu hình DNS recursor
Mục đích: Nếu DNS Local không thể biết các Domain trên internet thì nó sẽ cần hỏi DNS nào, ta cần chỉ định ra DNS sẽ bị hỏi ở đây là DNS google: 8.8.8.8. Bạn cũng có thể thay thế bằng Open DNS: 1.1.1.1 hoặc bất kì DNS nào khác public trên Internet và cho phép querry đến.
- Mô hình này dùng server dns authoritative và recursor trên cùng 1 server 
Trên dns recursor cài thêm:
apt install  pdns-recursor
- Cấu hình trên recursor: 
 
nano /etc/powerdns/recursor.conf
local-address=0.0.0.0
local-port=53
forward-zones=.=10.0.1.39:5300;8.8.8.8:53
#dấu chấm thay cho tất cả domain. Bạn có thể thay thế dấu . bởi chỉ các domain muốn querries local
cấu hình trên authoritative dns server
nano /etc/powerdns/pdns.conf 
local-port=5300
local-address=0.0.0.0 
restart dịch vụ:
/etc/init.d/pdns restart
/etc/init.d/pdns-recursor restart
- Test dịch vụ 
 
Query thử đến 1 domain local và 1 domain internet
Tạo trước bản ghi test
Như vậy DNS đã làm đúng nhiệm vụ.
Phần 3: Build powerdns Master and Slave
-  Điều kiện: 
cài đặt 2 server powerdns độc lập với nhau, allow kết nối port 53,5300,8081 giữa 2 server, hoặc trust IP full port với nhau.
master: 10.0.1.39
slave: 10.0.1.38
- Cấu hình trên server master 
 
nano /etc/powerdns/pdns.conf
allow-axfr-ips=10.0.1.38/32
also-notify=10.0.1.38
api=yes
daemon=yes
default-soa-name=srv039.local
# không có cấu hình soa sẽ không auto đẩy record từ master về salve được
disable-axfr=no
disable-tcp=no
guardian=yes
launch=
local-address=0.0.0.0
local-port=53
loglevel=4
master=yes
slave=no
webserver=yes
webserver-address=0.0.0.0
- Cấu hình trên server slave 
 
nano /etc/powerdns/pdns.conf
allow-axfr-ips=10.0.1.39,127.0.0.0/8
allow-dnsupdate-from=10.0.1.39/32
allow-notify-from=10.0.1.39/32,0.0.0.0/0
api=yes
api-key=123456@@
default-soa-name=srv038.local
# không có cấu hình soa sẽ không auto đẩy record từ master về salve được
guardian=yes
slave-cycle-interval=60
launch=
local-address=0.0.0.0
local-port=53
loglevel=4
master=no
slave=yes
Phần 4 Cấu hình 2 server recursor và authoritative trên cùng server đó
- Điều kiện: 
cài đặt 2 server powerdns độc lập với nhau, allow kết nối port 53,8081 giữa 2 server, hoặc trust IP full port với nhau.
master: 10.0.1.39 enable recursor
slave: 10.0.1.38 enable recursor
- Cấu hình trên cả master và slave: 
 
change port recursor.conf sang 53 và pdns.conf sang port 5300
cấu hình trên server slave
nano /etc/powerdns/pdns.conf
also-notify=10.0.1.39:5300
Trên powerdns-admin chuyển cấu hình port sang 5300 để listen từ master, có thể thay đổi thẳng trên DB
# https://github.com/PowerDNS/pdns/issues/5286
- Mô hình 
 
Lưu ý:
trỏ file host để test:
10.0.1.38 powerdns-admin.example.com
10.0.1.39 powerdns-admin2.example.com
Như vậy bạn đã có Full bộ công cụ cấu hình PowerDNS.
Chúc các bạn thành công!

 
																			 
																			