Tự dựng máy chủ DNS riêng bằng PowerDNS: hướng dẫn từng bước 2026

Tài liệu » Quản lý tên miền » Tự dựng máy chủ DNS riêng bằng PowerDNS: hướng dẫn từng bước 2026

Tự dựng máy chủ DNS riêng bằng PowerDNS phù hợp khi bạn cần toàn quyền với zone, bản ghi, API và dữ liệu DNS. Thay vì phụ thuộc hoàn toàn vào bảng điều khiển của bên thứ ba, bạn có thể tự dựng máy chủ authoritative DNS, lưu dữ liệu trong MySQL và tự động hóa việc tạo record cho domain, VPS, ứng dụng hoặc hạ tầng MMO.

PowerDNS là lựa chọn phổ biến vì tách phần xử lý DNS và backend dữ liệu. Bạn có thể dùng MySQL, PostgreSQL, API REST, DNSSEC và triển khai nhiều nameserver dự phòng mà không phải sửa file zone thủ công mỗi lần.

Lưu ý: Hướng dẫn này nói về authoritative DNS server, tức máy chủ trả lời DNS cho domain do bạn quản lý. Đây không phải recursive resolver dùng để thay DNS 8.8.8.8 hoặc 1.1.1.1 trên máy tính cá nhân.

Tự dựng máy chủ DNS riêng bằng PowerDNS: hướng dẫn từng bước 2026

Vì sao cần tự dựng máy chủ DNS riêng?

DNS thường bị xem là phần hạ tầng đơn giản: thêm một bản ghi A, trỏ domain về IP rồi xong. Nhưng khi số lượng domain, subdomain, máy chủ hoặc môi trường triển khai tăng lên, DNS rất dễ trở thành điểm nghẽn vận hành.

Pain point đầu tiên là phụ thuộc vào dashboard của bên thứ ba. Bạn có thể bị giới hạn API, giới hạn số lượng bản ghi, chờ đồng bộ, bị khóa tài khoản hoặc gặp sự cố ở nhà cung cấp mà không chủ động kiểm soát được.

Pain point thứ hai là quản lý DNS thủ công dễ gây lỗi. Một record sai TTL, thiếu dấu chấm cuối trong nameserver, nhầm CNAME với A record hoặc quên cập nhật MX có thể làm website, mail, game server hoặc API ngừng hoạt động.

Các tình huống nên cân nhắc tự vận hành PowerDNS:

  • Bạn quản lý nhiều domain, subdomain hoặc khách hàng.
  • Bạn cần tạo DNS record tự động khi deploy VPS, Docker, Kubernetes hoặc game server.
  • Bạn muốn dùng DNS API nội bộ thay vì cấp quyền dashboard cho nhiều người.
  • Bạn cần kiểm soát vị trí đặt nameserver và quy trình backup dữ liệu.
  • Bạn đang xây dựng hệ thống SaaS, hosting, CDN nội bộ hoặc hạ tầng MMO.

Tuy nhiên, tự dựng DNS không chỉ là cài dịch vụ. Bạn phải chịu trách nhiệm cho uptime, bảo mật API, cấu hình registrar, backup database, giám sát DNS và ít nhất hai nameserver độc lập.

Tham khảo thêm khái niệm nền tảng về DNS là gì và cách phân giải tên miền trước khi triển khai production.

Vì sao tự dựng máy chủ DNS riêng: kiểm soát, tốc độ, không phụ thuộc bên thứ ba

PowerDNS Authoritative Server cho phép bạn nắm dữ liệu zone trong database. Mỗi khi cần thay đổi record, bạn có thể thao tác bằng SQL, API hoặc tích hợp vào pipeline CI/CD.

Điểm mạnh lớn nhất là quyền kiểm soát. Bạn tự quyết định TTL, policy record, quyền truy cập API, log query, cấu trúc backup và cách đồng bộ dữ liệu giữa các nameserver.

Về tốc độ, DNS tự dựng không tự nhiên nhanh hơn mọi dịch vụ DNS công cộng. Tốc độ phụ thuộc vị trí máy chủ nameserver, tuyến mạng, cache resolver, TTL và độ ổn định của hạ tầng.

Nếu nameserver đặt gần nhóm người dùng chính hoặc có nhiều node ở các khu vực khác nhau, thời gian phản hồi DNS có thể tốt hơn. Ngược lại, một VPS duy nhất ở vị trí xa người dùng sẽ tạo thêm rủi ro và độ trễ.

Bảng dưới đây giúp bạn xác định khi nào nên tự vận hành.

Tiêu chíPowerDNS tự dựngDNS quản lý sẵn
Kiểm soát dữ liệu zoneToàn quyền MySQL, API, backupPhụ thuộc nền tảng
Tự động hóaLinh hoạt qua API, script, CI/CDTùy mức API được cấp
Chi phí ban đầuTốn VPS, thời gian vận hànhCó thể bắt đầu miễn phí
Độ khó kỹ thuậtCao hơn, cần giám sátThấp hơn
Khả năng tùy biếnRất caoBị giới hạn tính năng
Dự phòng nameserverBạn tự thiết kếThường có sẵn
Rủi ro cấu hình saiCao nếu thiếu kinh nghiệmThấp hơn

Tự dựng phù hợp nhất khi DNS là một phần của sản phẩm hoặc quy trình kỹ thuật. Nếu bạn chỉ có một vài domain cá nhân, dùng dịch vụ DNS quản lý sẵn thường tiết kiệm thời gian hơn.

Callout: Đừng vận hành authoritative DNS trên cùng một VPS duy nhất với website production nếu bạn không có phương án dự phòng. Khi VPS gặp sự cố, website và DNS cùng mất khả năng truy cập.

Cài PowerDNS + backend MySQL

Ví dụ bên dưới sử dụng Ubuntu 24.04 LTS. Bạn cần chuẩn bị một VPS có IP tĩnh, quyền root hoặc tài khoản có sudo, và domain đã đăng ký tại registrar.

Trước tiên cập nhật hệ thống và cài PowerDNS cùng backend MySQL:

sudo apt update
sudo apt upgrade -y
sudo apt install -y powerdns-server pdns-backend-mysql mariadb-server curl jq

Khởi động MariaDB và thực hiện thiết lập bảo mật cơ bản:

sudo systemctl enable --now mariadb
sudo mysql_secure_installation

Tạo database và user riêng cho PowerDNS. Không nên dùng user root của MySQL cho dịch vụ DNS.

sudo mysql -u root -p

Trong MySQL shell, chạy các lệnh sau:

CREATE DATABASE powerdns CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

CREATE USER 'pdns'@'127.0.0.1' IDENTIFIED BY 'MatKhauRatManh_2026';

GRANT ALL PRIVILEGES ON powerdns.* TO 'pdns'@'127.0.0.1';

FLUSH PRIVILEGES;
EXIT;

PowerDNS cung cấp schema MySQL mẫu. Trên Ubuntu, đường dẫn thường là /usr/share/doc/pdns-backend-mysql/schema.mysql.sql.

Import schema vào database:

sudo mysql -u pdns -p powerdns < /usr/share/doc/pdns-backend-mysql/schema.mysql.sql

Kiểm tra các bảng đã được tạo:

sudo mysql -u pdns -p -e "USE powerdns; SHOW TABLES;"

Bạn sẽ thấy các bảng như domains, records, supermasters, comments, domainmetadata và cryptokeys. Đây là nơi PowerDNS lưu zone, bản ghi, metadata DNSSEC và thông tin replication.

Tiếp theo, chỉnh file cấu hình /etc/powerdns/pdns.conf:

sudo nano /etc/powerdns/pdns.conf

Thêm hoặc cập nhật các dòng sau:

launch=gmysql

gmysql-host=127.0.0.1
gmysql-port=3306
gmysql-dbname=powerdns
gmysql-user=pdns
gmysql-password=MatKhauRatManh_2026

local-address=0.0.0.0
local-port=53

api=yes
api-key=ThayBangAPIKeyDaiVaNgauNhien
webserver=yes
webserver-address=127.0.0.1
webserver-port=8081

Không bind API vào 0.0.0.0 nếu chưa có reverse proxy, firewall và cơ chế xác thực phù hợp. API PowerDNS có quyền sửa toàn bộ zone nên việc mở cổng 8081 ra Internet là rủi ro lớn.

Tạo API key mạnh bằng OpenSSL:

openssl rand -hex 32

Khởi động lại PowerDNS và kiểm tra trạng thái:

sudo systemctl enable --now pdns
sudo systemctl restart pdns
sudo systemctl status pdns

Nếu dịch vụ không chạy, xem log để tìm lỗi kết nối MySQL hoặc lỗi cú pháp cấu hình:

sudo journalctl -u pdns -n 100 --no-pager

Mở DNS trên firewall. Authoritative DNS cần cả UDP và TCP port 53, vì một số phản hồi DNS lớn sẽ chuyển sang TCP.

sudo ufw allow 53/udp
sudo ufw allow 53/tcp
sudo ufw enable
sudo ufw status

Kiểm tra PowerDNS đang lắng nghe cổng DNS:

sudo ss -lntup | grep ':53'

Để có nền tảng bảo mật VPS tốt hơn, xem hướng dẫn cấu hình firewall UFW. Bạn cũng nên cấu hình SSH key thay vì đăng nhập mật khẩu trước khi đưa nameserver vào production.

Tạo zone và bản ghi bằng API

PowerDNS API sử dụng endpoint mặc định là http://127.0.0.1:8081/api/v1/servers/localhost. API key được gửi qua header X-API-Key.

Kiểm tra API có hoạt động hay không:

curl -H 'X-API-Key: ThayBangAPIKeyDaiVaNgauNhien' \
http://127.0.0.1:8081/api/v1/servers/localhost

Tạo file JSON tên example.com.json để tạo zone. Hãy thay example.com bằng domain thật của bạn và thay IP bằng IP VPS.

{
  "name": "example.com.",
  "kind": "Native",
  "nameservers": [
    "ns1.example.com.",
    "ns2.example.com."
  ],
  "rrsets": [
    {
      "name": "example.com.",
      "type": "SOA",
      "ttl": 3600,
      "changetype": "REPLACE",
      "records": [
        {
          "content": "ns1.example.com. hostmaster.example.com. 2026010101 10800 3600 604800 3600",
          "disabled": false
        }
      ]
    },
    {
      "name": "example.com.",
      "type": "NS",
      "ttl": 3600,
      "changetype": "REPLACE",
      "records": [
        {
          "content": "ns1.example.com.",
          "disabled": false
        },
        {
          "content": "ns2.example.com.",
          "disabled": false
        }
      ]
    },
    {
      "name": "ns1.example.com.",
      "type": "A",
      "ttl": 3600,
      "changetype": "REPLACE",
      "records": [
        {
          "content": "203.0.113.10",
          "disabled": false
        }
      ]
    },
    {
      "name": "ns2.example.com.",
      "type": "A",
      "ttl": 3600,
      "changetype": "REPLACE",
      "records": [
        {
          "content": "198.51.100.20",
          "disabled": false
        }
      ]
    },
    {
      "name": "example.com.",
      "type": "A",
      "ttl": 300,
      "changetype": "REPLACE",
      "records": [
        {
          "content": "203.0.113.10",
          "disabled": false
        }
      ]
    },
    {
      "name": "www.example.com.",
      "type": "CNAME",
      "ttl": 300,
      "changetype": "REPLACE",
      "records": [
        {
          "content": "example.com.",
          "disabled": false
        }
      ]
    }
  ]
}

Tạo zone qua API:

curl -X POST \
-H 'X-API-Key: ThayBangAPIKeyDaiVaNgauNhien' \
-H 'Content-Type: application/json' \
--data @example.com.json \
http://127.0.0.1:8081/api/v1/servers/localhost/zones

Kiểm tra zone vừa tạo:

curl -H 'X-API-Key: ThayBangAPIKeyDaiVaNgauNhien' \
http://127.0.0.1:8081/api/v1/servers/localhost/zones/example.com. | jq

Sau đó kiểm tra trực tiếp DNS server bằng dig:

dig @203.0.113.10 example.com A
dig @203.0.113.10 www.example.com CNAME
dig @203.0.113.10 example.com NS

Dấu chấm cuối trong example.com. rất quan trọng khi làm việc với PowerDNS API. Nếu bỏ dấu chấm ở các giá trị domain trong nội dung record, PowerDNS có thể hiểu đó là tên tương đối và tạo kết quả không đúng.

Tài liệu API chính thức của PowerDNS có tại PowerDNS Authoritative HTTP API. Khi tự động hóa, hãy tạo API key riêng cho từng hệ thống và lưu key bằng secret manager hoặc biến môi trường, không hard-code trong source code.

Đặt hai máy chủ tên miền để dự phòng

Một domain có một nameserver duy nhất là cấu hình rủi ro. Nếu VPS đó mất mạng, resolver trên Internet không còn máy chủ nào để truy vấn zone của bạn.

Tối thiểu nên có:

  • ns1.example.com trên VPS hoặc nhà cung cấp hạ tầng thứ nhất.
  • ns2.example.com trên VPS khác, IP khác, tốt nhất khác datacenter hoặc khác nhà cung cấp.
  • Cả hai server đều mở UDP/TCP port 53.
  • Registrar được cập nhật glue record đúng cho ns1 và ns2.

Glue record là IP của nameserver được registrar hoặc registry lưu cho domain. Nếu nameserver có dạng ns1.example.com và phục vụ chính example.com, glue record giúp tránh vòng lặp phân giải DNS.

Quy trình khuyến nghị:

  1. Tạo ns1.example.com và ns2.example.com trong zone PowerDNS.
  2. Khai báo IP glue record tại trang quản lý registrar.
  3. Đặt nameserver của domain thành ns1.example.com và ns2.example.com.
  4. Chờ cập nhật DNS delegation.
  5. Kiểm tra bằng DNS trace.

Dùng lệnh sau để xem đường đi phân giải từ root DNS đến nameserver của bạn:

dig +trace example.com NS

Với PowerDNS, bạn có thể dùng mô hình primary-secondary để đồng bộ zone. Primary nhận thay đổi qua API, secondary tự lấy zone thông qua AXFR hoặc IXFR.

Mô hình này cần cấu hình master=yes ở primary, slave=yes ở secondary và khai báo quyền transfer. Với quy mô nhỏ, bạn cũng có thể chạy hai node cùng kết nối một MySQL cluster, nhưng cách này làm database trở thành điểm phụ thuộc chung.

Cách an toàn hơn cho production là:

  • Primary PowerDNS có MySQL riêng và API nội bộ.
  • Secondary PowerDNS ở mạng khác.
  • Secondary nhận zone transfer từ primary.
  • Có monitoring kiểm tra truy vấn DNS từ bên ngoài.

Bạn nên theo dõi ít nhất các chỉ số sau:

  • PowerDNS service có đang chạy không.
  • Port 53 UDP/TCP có truy cập được từ Internet không.
  • Zone có trả lời đúng A, NS, MX, TXT không.
  • Serial SOA trên ns1 và ns2 có đồng bộ không.
  • Thời hạn domain và glue record tại registrar.

So với dùng Cloudflare: được gì mất gì

Cloudflare là lựa chọn tiện lợi cho nhiều website vì có DNS quản lý sẵn, mạng phân tán và dashboard dễ dùng. Nhưng nếu mục tiêu là tự xây dựng hạ tầng DNS hoặc cần kiểm soát backend dữ liệu, PowerDNS có lợi thế rõ ràng.

Khi dùng PowerDNS, bạn được:

  • Chủ động dữ liệu DNS trong MySQL.
  • Tạo, sửa, xóa record bằng API do bạn kiểm soát.
  • Tích hợp DNS vào provisioning VPS, hosting hoặc SaaS.
  • Chủ động thiết kế primary-secondary, TTL và policy vận hành.
  • Không bị phụ thuộc vào giao diện hoặc thay đổi chính sách của một nền tảng DNS cụ thể.

Đổi lại, bạn mất:

  • Anycast toàn cầu có sẵn.
  • Lớp chống DDoS DNS quy mô lớn.
  • Dashboard quản trị thân thiện cho người không kỹ thuật.
  • Hệ thống giám sát, redundancy và vận hành do bên thứ ba lo sẵn.
  • Thời gian xử lý sự cố khi DNS server, database hoặc network lỗi.

Giải pháp thực tế là xác định đúng ranh giới. Nếu DNS là thành phần cốt lõi của sản phẩm, tự dựng PowerDNS đáng đầu tư. Nếu DNS chỉ phục vụ vài website đơn giản, chi phí vận hành riêng có thể lớn hơn lợi ích.

Bạn có thể xem thêm quy trình trỏ domain về VPS để tránh nhầm giữa DNS delegation, A record và cấu hình web server.

Sai lầm phổ biến

Chỉ triển khai một nameserver

Một VPS duy nhất không phải dự phòng. Khi VPS lỗi, bị chặn network hoặc đang bảo trì, toàn bộ domain có thể không phân giải được dù web server vẫn hoạt động ở nơi khác.

Luôn dùng tối thiểu hai nameserver với IP khác nhau. Lý tưởng nhất là đặt ở hai datacenter hoặc hai nhà cung cấp độc lập.

Quên mở TCP port 53

Nhiều người chỉ mở UDP 53 vì truy vấn DNS thông thường dùng UDP. Tuy nhiên, DNSSEC, phản hồi TXT lớn hoặc zone transfer có thể cần TCP.

Kiểm tra firewall ở cả VPS, cloud security group và firewall của nhà cung cấp. Mở đồng thời 53/udp và 53/tcp.

Public API PowerDNS ra Internet

API có thể sửa hoặc xóa toàn bộ zone. Nếu API key bị lộ, kẻ xấu có thể đổi A record, chèn TXT record hoặc làm domain ngừng hoạt động.

Chỉ bind API vào 127.0.0.1, sau đó truy cập qua SSH tunnel, VPN hoặc reverse proxy có allowlist IP. Không gửi API key trong ảnh chụp màn hình, Git repository hoặc log CI/CD.

Dùng TTL quá thấp cho mọi record

TTL 60 giây giúp thay đổi IP nhanh, nhưng làm tăng số lượng truy vấn tới nameserver. Nếu DNS server yếu hoặc có nhiều domain, điều này làm tăng tải không cần thiết.

Dùng TTL 300 đến 3600 giây cho record web thông thường. Chỉ giảm TTL trước thời điểm dự kiến migration hoặc thay đổi IP.

Không backup MySQL và không kiểm tra restore

Database PowerDNS là dữ liệu DNS thực tế của bạn. Backup chỉ có ý nghĩa khi bạn khôi phục được zone vào một server khác.

Tạo backup định kỳ bằng mysqldump, mã hóa file backup và thử restore theo lịch. Đừng chờ đến lúc nameserver lỗi mới kiểm tra backup.

Câu hỏi thường gặp

PowerDNS có thay thế DNS resolver như Unbound không?

Không. PowerDNS Authoritative Server trả lời cho các zone bạn sở hữu, còn Unbound thường dùng làm recursive resolver để truy vấn DNS Internet cho người dùng hoặc server nội bộ.

Bạn có thể chạy cả hai trên cùng hạ tầng, nhưng cần tránh xung đột port 53.

Có cần MySQL không, hay PowerDNS dùng file zone được?

Không bắt buộc phải dùng MySQL. PowerDNS hỗ trợ nhiều backend như BIND zone file, PostgreSQL, SQLite và LDAP.

MySQL phù hợp khi bạn cần API, quản lý nhiều zone và tự động hóa qua database hoặc ứng dụng nội bộ.

Tại sao cần dấu chấm cuối trong example.com.?

Dấu chấm cuối cho biết đây là fully qualified domain name, tức tên miền đầy đủ. Nó giúp PowerDNS không tự nối thêm domain hiện tại vào giá trị record.

Ví dụ ns1.example.com. là nameserver đầy đủ, còn ns1.example.com có thể bị xử lý khác tùy ngữ cảnh.

Bao lâu thì nameserver mới có hiệu lực sau khi đổi tại registrar?

Thường mất từ vài phút đến vài giờ, nhưng có thể lâu hơn do cache và quy trình cập nhật của registrar hoặc registry. Bạn nên kiểm tra bằng dig +trace thay vì chỉ chờ kết quả trên trình duyệt.

Glue record sai hoặc thiếu thường là nguyên nhân khiến delegation không hoạt động.

Có nên bật DNSSEC ngay không?

Nên bật khi bạn đã có hai nameserver ổn định, quy trình backup rõ ràng và hiểu cách cập nhật DS record tại registrar. DNSSEC cấu hình sai có thể khiến domain không phân giải được với resolver có kiểm tra chữ ký.

Triển khai DNS cơ bản ổn định trước, sau đó thử DNSSEC trên domain ít quan trọng.

Có thể quản lý PowerDNS bằng giao diện web không?

Có thể, nhưng API vẫn nên là lớp tích hợp chính cho hệ thống kỹ thuật. Nếu dùng giao diện web, hãy đặt sau HTTPS, xác thực mạnh và giới hạn IP truy cập.

Không nên cài dashboard công khai chỉ để tiện sửa vài record.

Tóm tắt nhanh

  • Tự dựng máy chủ DNS riêng bằng PowerDNS phù hợp khi bạn cần kiểm soát zone, API và quy trình tự động hóa.
  • PowerDNS Authoritative Server không phải recursive DNS resolver cho máy tính cá nhân.
  • MySQL giúp quản lý zone và record linh hoạt, dễ backup và tích hợp ứng dụng.
  • Chỉ mở DNS qua 53/udp và 53/tcp; giữ API PowerDNS ở 127.0.0.1.
  • Mỗi domain production cần tối thiểu hai nameserver trên hạ tầng độc lập.
  • Kiểm tra delegation bằng dig +trace, không chỉ dựa vào dashboard registrar.
  • Backup MySQL, giám sát DNS từ bên ngoài và thử khôi phục dữ liệu định kỳ.
Lên đầu trang