Hướng dẫn cài đặt và cấu hình powerDNS trên Ubuntu 22-04

PowerDNS là một phần mềm DNS server mã nguồn mở, phổ biến nhờ khả năng mở rộng và tích hợp cơ sở dữ liệu mạnh mẽ. Trong bài viết này, bạn sẽ học cách cài đặt PowerDNS sử dụng backend MySQL trên Ubuntu, bao gồm cả cấu hình firewall, MariaDB, và khởi tạo cơ sở dữ liệu cần thiết.

Bước 1: Mở port cần thiết bằng UFW

Trước tiên, bạn nên cấu hình firewall để cho phép các dịch vụ cần thiết hoạt động:

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 allow 22/tcp
ufw reload

Bước 2: Cài đặt và bảo mật MariaDB

MariaDB là hệ quản trị cơ sở dữ liệu mã nguồn mở tương thích với MySQL.

sudo apt update
sudo apt install mariadb-server -y
mysql_secure_installation

Thay đổi mật khẩu root của MariaDB:

ALTER USER 'root'@'localhost' IDENTIFIED BY 'Str0ngPasswOrd';

Bước 3: Tạo database và user cho PowerDNS

CREATE DATABASE powerdns;
GRANT ALL ON powerdns.* TO 'powerdns'@'localhost' IDENTIFIED BY 'Str0ngPasswOrd';
FLUSH PRIVILEGES;

Bước 4: Tạo bảng cho PowerDNS backend

Sử dụng MySQL Shell:

sudo mysql -u root -p

Sau đó nhập các lệnh SQL sau để tạo bảng:

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);

Bước 5: Cấu hình hệ thống DNS Resolver

Tắt dịch vụ systemd-resolved:

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

Xóa symlink /etc/resolv.conf và tạo mới:

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

Bước 6: Cài đặt PowerDNS và cấu hình backend MySQL

Thêm repo PowerDNS:

echo "deb [arch=amd64] http://repo.powerdns.com/ubuntu jammy-auth-master main" | sudo tee /etc/apt/sources.list.d/pdns.list
curl -fsSL https://repo.powerdns.com/CBC8B383-pub.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/powerdns.gpg
sudo apt update
sudo apt install pdns-server pdns-backend-mysql

Bước 7: Cấu hình PowerDNS để dùng MySQL

Chỉnh file cấu hình:

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

Nội dung mẫu:

launch+=gmysql
gmysql-host=localhost
gmysql-port=3306
gmysql-dbname=powerdns
gmysql-user=powerdns
gmysql-password=Str0ngPasswOrd
gmysql-dnssec=yes

Bước 8: Khởi động và kích hoạt PowerDNS

sudo systemctl restart pdns
sudo systemctl enable pdns

Tổng kết

Qua bài viết này, bạn đã hoàn tất cài đặt PowerDNS với backend MySQL trên Ubuntu, một cấu hình mạnh mẽ cho việc vận hành DNS server nội bộ hoặc công khai. Việc sử dụng PowerDNS kết hợp với cơ sở dữ liệu giúp bạn dễ dàng quản lý record qua giao diện hoặc tích hợp với các hệ thống tự động hóa DNS.

✨ Nếu bạn là sysadmin hoặc DevOps đang muốn tối ưu hoá hạ tầng DNS, đừng quên lưu lại bài viết này hoặc ghé thăm SysadminSkills.com để xem thêm các hướng dẫn chuyên sâu khác.

Tác giả: Mạnh Hoàng

Tôi là Hoàng Mạnh, người sáng lập blog SysadminSkills.com. Tôi viết về quản trị hệ thống, bảo mật máy chủ, DevOps và cách ứng dụng AI để tự động hóa công việc IT. Blog này là nơi tôi chia sẻ những gì đã học được từ thực tế – đơn giản, ngắn gọn và áp dụng được ngay.

Để 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 *