Giới thiệu tổng quan PowerDNS là một phần mềm DNS server mã nguồn mở có thể nói là kế thừa và tích hợp nhiều ưu điểm của các loại DNS Server khác. Nó được thiết kế để cung cấp hiệu suất cao, mở rộng và linh hoạt. Nó có thể hoạt động như một server DNS chính (authoritative server) hoặc một server DNS phân giải (recursive resolver).
Với kiến trúc phân tán, có thể xử lý hàng triệu yêu cầu DNS mỗi giây. Nó hỗ trợ nhiều giao thức, bao gồm DNSSEC, DNS-over-HTTP, DNS-over-TLS và DNS-over-HTTPS để đảm bảo tính bảo mật và riêng tư.
Ngoài ra còn có khả năng tích hợp với các hệ thống cơ sở dữ liệu như MySQL, PostgreSQL,BIND zone file,… cho phép quản lý dữ liệu DNS dễ dàng và linh hoạt. Nó cũng hỗ trợ các công nghệ như Anycast và GeoDNS để cải thiện hiệu suất và độ tin cậy.
Với cộng đồng lớn và nhiều tài liệu hướng dẫn, đây sẽ là một giải pháp DNS mạnh mẽ và linh hoạt cho các tổ chức và nhà cung cấp dịch vụ tên miền.
Bài viết này mình sẽ hướng dẫn các bạn cài đặt PowerDNS server trên Debian 12.
- Chuẩn bị môi trường
Một Server Debian 12
CPU: 2 core
Ram: 2 GB
Disk: 20 GB
Một domain trỏ tới địa chỉ IP của Server
Quyền truy cập root
- Cập nhật hệ thống
Trước khi cài đặt, hãy update và upgrade hệ thống
apt update -y apt upgrade -y apt install apt-transport-https lsb-release ca-certificates curl dirmngr gnupg
- Cài đặt MySQL
Để cài đặt MySQL 8.0 trên Debian, các bạn có thể xem hướng dẫn tại bài viết sau:
Hướng dẫn cài đặt MySQL trên Debian 12
- Cài đặt PowerDNS
Vô hiệu hoá systemd-resolved. Đây là một service phân giải dns cho các ứng dụng cục bộ mặc định. Chúng ta sẽ thay thế nó bằng PowerDNS nên vì thế hãy tắt nó đi.
systemctl disable --now systemd-resolved
Chỉnh sửa lại file /etc/resolve.conf để đảm bảo server có thể phân giải dns để tải các gói cần thiết
echo "nameserver 8.8.8.8" > /etc/resolv.conf #DNS Recursor của Google echo "nameserver 1.1.1.1" > /etc/resolv.conf #DNS Recursor của Cloudflare
Tiếp theo, chúng ta sẽ cài đặt PowerDNS trên Debian 12.
PowerDNS chia ra thành các gói Backend khác nhau, tuỳ thuộc vào nhu cầu sử dụng mà chúng ta sẽ tải những gói backend cần thiết. Để kiểm tra các phiên bản mới nhất hãy truy cập repositories tại đây. Phiên bản 4.8 là bản phát hành ổn định hiện tại tính đến thời điểm viết bài này.
Ở đây chúng ta sẽ cần tải pdns-server và pdns-backend-mysql
echo 'deb [signed-by=/etc/apt/keyrings/auth-48-pub.asc arch=amd64] http://repo.powerdns.com/debian bookworm-auth-48 main' > /etc/apt/sources.list.d/pdns.list
cat > /etc/apt/preferences.d/auth-48 << EOL Package: auth* Pin: origin repo.powerdns.com Pin-Priority: 600 EOL
install -d /etc/apt/keyrings; curl https://repo.powerdns.com/FD380FBB-pub.asc |tee /etc/apt/keyrings/auth-48-pub.asc
apt update apt install pdns-server pdns-backend-mysql systemctl enable pdns systemctl start pdns systemctl status pdns
- Tạo Database và User
Bây giờ chúng ta hãy tạo một Database với tên là powerdns và User powerdns_admin để PowerDNS có thể truy cập MySQL .
mysql -u root -p #Nhập mật khẩu root để truy cập
CREATE DATABASE powerdns; CREATE USER 'powerdns_admin'@'localhost' IDENTIFIED BY 'Strongpassword'; GRANT ALL ON powerdns.* TO 'powerdns_admin'@'localhost'; FLUSH PRIVILEGES; exit
- Nhập cấu trúc bảng Database của PowerDNS
Thông thường cấu trúc bảng database của PowerDNS sẽ được lưu trong đường dẫn /usr/share/pdns-backend-mysql/schema/ với tên file là schema.mysql.sql.
mysql -u powerdns_admin -p powerdns < /usr/share/pdns-backend-mysql/schema/schema.mysql.sql
Để kiểm tra, hãy sử dụng lệnh sau
mysqlshow -u powerdns_admin -p powerdns
Database: powerdns +----------------+ | Tables | +----------------+ | comments | | cryptokeys | | domainmetadata | | domains | | records | | supermasters | | tsigkeys | +----------------+
8.Tạo tệp cấu hình để PowerDNS kết nối đến database MySQL
Để kiểm tra, hãy sử dụng lệnh sau
cat > /etc/powerdns/pdns.d/pdns.local.gmysql.conf << 'EOL'
MySQL Configuration
Launch gmysql backend
launch+=gmysql
gmysql parameters
gmysql-host=127.0.0.1 gmysql-port=3306 gmysql-dbname=powerdns gmysql-user=powerdns_admin gmysql-password=Strongpassword gmysql-dnssec=yes
gmysql-socket=
EOL
Sau đó, các bạn cần tuỳ chỉnh lại quyền của file để PowerDNS có thể sử dụng file này kết nối đến MySQL
chown pdns: /etc/powerdns/pdns.d/pdns.local.gmysql.conf chmod 640 /etc/powerdns/pdns.d/pdns.local.gmysql.conf
Tiếp theo, chạy lệnh sau để kiểm tra kết nối có thành công hay không?
systemctl stop pdns.service pdns_server --daemon=no --guardian=no --loglevel=9
Bước cuối cùng, khởi động lại và kích hoạt dịch vụ PowerDNS bằng cách chạy lệnh sau:
systemctl restart pdns systemctl enable pdns systemctl status pdns
Đảm bảo port 53 đang mở bằng lệnh sau:
ss -alnp4 | grep pdns
#Kết quả udp UNCONN 0 0 0.0.0.0:53 0.0.0.0:* users:(("pdns_server",pid=60399,fd=5)) tcp LISTEN 0 128 0.0.0.0:53 0.0.0.0:* users:(("pdns_server",pid=60399,fd=7))
9.Tạo Zone và Record trên PowerDNS
Chúng ta sẽ sử dụng domain nin.id.vn và địa chỉ IP: 123.123.123.123
Để tạo zone, hãy sử dụng lệnh sau:
pdnsutil create-zone nin.id.vn pdnsutil list-all-zones
Tiếp theo chúng ta sẽ tạo thêm một Record A
pdnsutil add-record nin.id.vn @ A 123.123.123.123 pdnsutil add-record nin.id.vn www A 123.123.123.123
Khi bạn tạo một Zone, record SOA (Start Of Authority) sẽ được toạ tự động. Đây là record dùng để xác định các thông tin quản lý cho một Zone cụ thể. Nếu thiếu Record này, tên miền của bạn sẽ không thể phân giải được.
Định dạng record SOA sẽ có dạng:
primary hostmaster serial refresh retry expire default_ttl
Trong đó:
primary: Đây là tên mặc định của SOA và đại diện cho tên máy chủ chính (Master) quản lý Zone.
hostmaster: Đại diện cho địa chỉ email của người quản lý (hostmaster) của Zone.
serial: Số phiên bản của zone file, dùng để xác định sự thay đổi của dữ liệu.
refresh: Thời gian giữa hai lần máy chủ chính(Master) yêu cầu cập nhật dữ liệu từ máy chủ phụ (Slave).
retry: Thời gian mà máy chủ Slave chờ đợi trước khi yêu cầu cập nhật lại từ máy chủ Master nếu quá trình cập nhật trước đó thất bại.
expire: Thời gian tối đa mà máy chủ Slave có thể giữ dữ liệu mà không nhận được sự cập nhật từ máy chủ Master.
default_ttl: Thời gian “sống” mặc định của các record DNS trong một Zone.
Bạn có thể hiển thị chi tiết bằng cách chạy lệnh:
pdnsutil list-zone nin.id.vn
#Kết quả $ORIGIN . nin.id.vn 86400 IN SOA ns2-prodns.vinahost.vn ns1-prodns.vinahost.vn 2024022902 28800 7200 604800 86400 nin.id.vn 86400 IN A 123.123.123.123 www.nin.id.vn 86400 IN A 123.123.123.123
Kết luận
Như vậy là chúng ta đã cài đặt thành công PowerDNS + MySQL trên Debian 12. Nhưng để thêm mới, xoá, sửa một Zone và record trên dòng lệnh thật khó phải không nào!
Trong bài hướng dẫn tiếp theo, mình sẽ hướng dẫn cài đặt giao diện quản trị web PowerAdmin để có thể dễ dàng thao tác hơn.
Tài liệu tham khảo
https://doc.powerdns.com/authoritative/installation.html
https://doc.powerdns.com/authoritative/backends/generic-mysql.html#setting-gmysql-host