Hiện nay có rất nhiều nền tảng/công cụ có thể được sử dụng để làm DNS Server chẳng hạn như: BIND, Knot DNS, CoreDNS,… thậm chí có một số Control Panel vẫn có thể làm DNS Server có thể kể đến như Cpanel, Directadmin… Theo đánh giá từ các công ty có triển khai dịch vụ tên miền tại Việt Nam thì đa số tin tưởng và chọn PowerDNS để triển khai DNS Server.
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.
1. 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
2. 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
3. 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:
4. 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
6. 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
7. 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 gocit.vn và địa chỉ IP: 123.123.123.123
Để tạo zone, hãy sử dụng lệnh sau:
pdnsutil create-zone gocit.vn
pdnsutil list-all-zones
Tiếp theo chúng ta sẽ tạo thêm một Record A
pdnsutil add-record gocit.vn @ A 123.123.123.123
pdnsutil add-record gocit.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 gocit.vn
#Kết quả
$ORIGIN .
gocit.vn 86400 IN SOA ns2-prodns.vinahost.vn ns1-prodns.vinahost.vn 2024022902 28800 7200 604800 86400
gocit.vn 86400 IN A 123.123.123.123
www.gocit.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.