Hướng dẫn cài đặt và cấu hình PowerDNS trên Ubuntu 22.04

Powerdns

Giới thiệu PowerDNS và PowerDNS Admin

PowerDNS là một công cụ mã nguồn mở giúp bạn xây dựng một DNS Server. Ngoài ra, PowerDNS Admin là công cụ giúp quản lý PowerDNS thông qua trình duyệt web. Do đó, bạn có thể dễ dàng tạo và quản lý các DNS Record mà không cần thao tác câu lệnh. Trong bài viết hôm nay, mình sẽ hướng dẫn bạn cách cài PowerDNS và PowerDNS Admin trên Ubuntu 22.04.

Chuẩn bị môi trường

  • Server chạy Ubuntu 22.04
  • Một domain trỏ tới địa chỉ IP của Server
  • Người dùng root

Các bước cài đặt

Bước 1: Chuẩn bị môi trường để cài

Mở các port cần thiết

ufw allow 9191/tcp
ufw allow 53/tcp
ufw allow 53/udp
ufw allow 8081/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw allow 3306/tcp
ufw reload

Cài MariaDB

sudo apt update
sudo apt install mariadb-server -y

Sau khi cài xong, hãy bảo mật MariaDB bằng lệnh bên dưới

sudo mysql_secure_installation

Tạo Database cho PowerDNS

sudo mysql -u root
CREATE DATABASE powerdns;

Tạo user và gán quyền

GRANT ALL ON powerdns.* TO ‘powerdns’@’localhost’ IDENTIFIED BY ‘Str0ngPasswOrd’;
FLUSH PRIVILEGES;
Chuyển sang chế độ dùng Database để tạo table

USE powerdns;

CREATE TABLE domains (

  id                    INT AUTO_INCREMENT,
  name                  VARCHAR(255) NOT NULL,
  master                VARCHAR(128) DEFAULT NULL,
  last_check            INT DEFAULT NULL,
  type                  VARCHAR(8) NOT NULL,
  notified_serial       INT UNSIGNED DEFAULT NULL,
  account               VARCHAR(40) CHARACTER SET 'utf8' DEFAULT NULL,
  options               VARCHAR(64000) DEFAULT NULL,
  catalog               VARCHAR(255) DEFAULT NULL,
  PRIMARY KEY (id)
) Engine=InnoDB CHARACTER SET 'latin1';
CREATE UNIQUE INDEX name_index ON domains(name);
CREATE INDEX catalog_idx ON domains(catalog);
CREATE TABLE records (
  id                    BIGINT 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,
  disabled              TINYINT(1) DEFAULT 0,
  ordername             VARCHAR(255) BINARY DEFAULT NULL,
  auth                  TINYINT(1) DEFAULT 1,
  PRIMARY KEY (id)
) Engine=InnoDB CHARACTER SET 'latin1';
CREATE INDEX nametype_index ON records(name,type);
CREATE INDEX domain_id ON records(domain_id);
CREATE INDEX ordername ON records (ordername);
CREATE TABLE supermasters (
  ip                    VARCHAR(64) NOT NULL,
  nameserver            VARCHAR(255) NOT NULL,
  account               VARCHAR(40) CHARACTER SET 'utf8' NOT NULL,
  PRIMARY KEY (ip, nameserver)
) Engine=InnoDB CHARACTER SET 'latin1';
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) CHARACTER SET 'utf8' DEFAULT NULL,
  comment               TEXT CHARACTER SET 'utf8' NOT NULL,
  PRIMARY KEY (id)
) Engine=InnoDB CHARACTER SET 'latin1';
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 CHARACTER SET 'latin1';
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,
  published             BOOL DEFAULT 1,
  content               TEXT,
  PRIMARY KEY(id)
) Engine=InnoDB CHARACTER SET 'latin1';
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 CHARACTER SET 'latin1';
CREATE UNIQUE INDEX namealgoindex ON tsigkeys(name, algorithm);

Disbale resolved service

sudo systemctl disable systemd-resolved
sudo systemctl stop systemd-resolved

Xóa symlinked resolv.conf file

ls -lh /etc/resolv.conf
sudo rm /etc/resolv.conf

Tạo file resolv.conf mới

echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf

Bước 2: Cài pdns

Cập nhật hệ thống và cài một số gói cần thiết

sudo apt update
sudo apt install -y curl gnupg lsb-release

Thêm kho lưu trữ PowerDNS:

sudo curl -fsSL https://repo.powerdns.com/repo.gpg | sudo apt-key add -
echo "deb [arch=amd64] https://repo.powerdns.com/ubuntu focal main" | sudo tee /etc/apt/sources.list.d/pdns.list

Cập nhật danh sách gói và cài đặt PowerDNS:

sudo apt update
sudo apt install -y pdns-server pdns-backend-mysql

Cấu hình SQL cho pdns

vi /etc/powerdns/pdns.d/pdns.local.gmysql.conf 

# MySQL Configuration
# Launch gmysql backend
launch+=gmysql
# gmysql parameters
gmysql-host=localhost
gmysql-port=3306
gmysql-dbname=powerdns
gmysql-user=powerdns
gmysql-password=Str0ngPasswOrd
gmysql-dnssec=yes
# gmysql-socket=
Restart và enable pdns
sudo systemctl restart pdns
sudo systemctl enable pdns

Cấu hình Pdns

Các bạn hãy uncomment và sửa lại thông số như bên dưới

allow-axfr-ips=::/0, 0.0.0.0/0
allow-dnsupdate-from=127.0.0.0/8,::1
allow-notify-from=0.0.0.0/0,::/0
also-notify=0.0.0.0
api=yes
api-key=SECRET_KEY
daemon=yes
disable-axfr=no
guardian=yes
include-dir=/etc/powerdns/pdns.d
launch=
local-address=0.0.0.0
local-port=53
log-dns-details=on
log-dns-queries=no
log-timestamp=yes
loglevel=4
master=yes
slave=no
setgid=pdns
setuid=pdns
version-string=powerdns
webserver=yes
webserver-address=ip server
webserver-allow-from=0.0.0.0/0,,::1
webserver-port=8081

Lưu ý bảo mật:

  • Các cấu hình mở rộng (allow-axfr-ips, allow-notify-from, etc.): Các cấu hình này có thể tạo ra các nguy cơ bảo mật nếu không được kiểm soát chặt chẽ. Hãy đảm bảo rằng bạn chỉ cho phép các địa chỉ IP tin cậy.
  • API Key (api-key): Đảm bảo rằng khóa API được giữ bí mật và chỉ được chia sẻ với những người hoặc dịch vụ được ủy quyền.

Như vậy mình đã hướng dẫn các bạn cài đặt và cấu hình xong PowerDNS, ở bài viết sau mình sẽ hướng dẫn các bạn cài đặt PowerDNS Admin và nginx reverse proxy để sử dụng cho tên miền.

Chúc các bạn thành công!

Để lại một bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *