Trong bất kỳ hệ thống mạng hiện đại nào, DNS (Domain Name System) là một thành phần không thể thiếu, đóng vai trò như một cuốn danh bạ khổng lồ giúp “dịch” những tên miền dễ nhớ (ví dụ: azweb.vn) thành các địa chỉ IP phức tạp (ví dụ: 103.221.220.78) mà máy tính có thể hiểu được. Điều này giúp chúng ta dễ dàng định danh và truy cập các thiết bị, dịch vụ trong mạng. Bạn có thể tham khảo thêm khái niệm chung về Server là gì để hiểu sâu hơn về hạ tầng máy chủ mạng.
Tuy nhiên, nhiều doanh nghiệp và nhà phát triển thường gặp không ít khó khăn khi muốn xây dựng một hệ thống DNS nội bộ hoạt động ổn định, bảo mật và hiệu quả. Việc quản lý các bản ghi, đảm bảo thời gian phản hồi nhanh và ngăn chặn các truy cập trái phép là những thách thức không hề nhỏ.
Đây chính là lúc BIND (Berkeley Internet Name Domain) thể hiện sức mạnh của mình. BIND là phần mềm DNS mã nguồn mở phổ biến và mạnh mẽ nhất thế giới, được tin dùng để vận hành một phần lớn các máy chủ DNS trên Internet. Với sự ổn định và linh hoạt, BIND là lựa chọn lý tưởng để thiết lập một server DNS nội bộ trên hệ điều hành Ubuntu 20.04. Bài viết này sẽ hướng dẫn bạn chi tiết từng bước, từ việc chuẩn bị môi trường, cài đặt BIND, cấu hình các file zone, cho đến kiểm tra hoạt động và các phương pháp vận hành tối ưu nhất.

Yêu cầu hệ thống và chuẩn bị môi trường Ubuntu 20.04
Trước khi bắt đầu quá trình cài đặt, việc đảm bảo môi trường của bạn đáp ứng các yêu cầu tối thiểu là vô cùng quan trọng. Một sự chuẩn bị kỹ lưỡng sẽ giúp quá trình cấu hình diễn ra suôn sẻ và tránh được những lỗi không đáng có.
Yêu cầu phần cứng và phần mềm tối thiểu
Một trong những ưu điểm của BIND là nó không đòi hỏi tài nguyên hệ thống quá cao, đặc biệt là đối với các mạng nội bộ có quy mô vừa và nhỏ. Tuy nhiên, để đảm bảo máy chủ hoạt động ổn định, bạn nên chuẩn bị cấu hình tối thiểu như sau:
- CPU: 1 core. Có thể tìm hiểu thêm về các loại CPU mạnh mẽ như Chip Xeon là gì để lựa chọn phần cứng phù hợp cho server.
- RAM: Tối thiểu 1 GB. Nếu cần hệ thống ổn định cao, bạn nên cân nhắc sử dụng RAM ECC giúp giảm lỗi phần cứng trong quá trình vận hành server.
- Dung lượng ổ cứng: Ít nhất 10 GB dung lượng trống để chứa hệ điều hành và các file log của BIND, ưu tiên ổ NVMe để cải thiện tốc độ truy cập dữ liệu(NVMe là gì).
Về phần mềm, bài hướng dẫn này được thực hiện trên phiên bản Ubuntu 20.04 LTS (Focal Fossa). Việc sử dụng phiên bản LTS (Long-Term Support) đảm bảo bạn sẽ nhận được các bản cập nhật bảo mật và hỗ trợ lâu dài từ cộng đồng.
Chuẩn bị môi trường mạng
Yếu tố quan trọng nhất khi thiết lập một máy chủ DNS là địa chỉ IP của nó phải luôn cố định. Nếu địa chỉ IP thay đổi, các máy khách (client) trong mạng sẽ không thể tìm thấy máy chủ DNS và các truy vấn sẽ thất bại.
- Thiết lập IP tĩnh cho server: Hãy chắc chắn rằng bạn đã cấu hình một địa chỉ IP tĩnh cho máy chủ Ubuntu của mình. Ví dụ, chúng ta sẽ sử dụng địa chỉ
192.168.1.10làm IP cho server DNS trong suốt bài hướng dẫn này. - Kiểm tra kết nối mạng: Máy chủ cần có kết nối mạng ổn định đến các thiết bị khác trong cùng hệ thống.
- Quyền truy cập: Bạn cần có quyền truy cập vào máy chủ với người dùng có quyền
roothoặcsudođể thực hiện các lệnh cài đặt và cấu hình hệ thống.
Xem thêm các giới thiệu và thuê VPS là gì hoặc Thuê VPS theo giờ nếu bạn muốn thử nghiệm cài đặt DNS trên môi trường VPS.

Cài đặt phần mềm BIND trên Ubuntu
Khi môi trường đã sẵn sàng, bước tiếp theo là cài đặt BIND9, phiên bản phổ biến nhất của BIND. Quá trình này khá đơn giản nhờ vào trình quản lý gói apt của Ubuntu.
Lệnh cài đặt BIND
Đầu tiên, hãy cập nhật danh sách các gói phần mềm trên hệ thống của bạn để đảm bảo bạn cài đặt phiên bản mới nhất. Mở terminal và thực hiện lệnh sau:
sudo apt update
Sau khi quá trình cập nhật hoàn tất, bạn có thể tiến hành cài đặt BIND9 cùng với các công cụ tiện ích đi kèm bằng lệnh:
sudo apt install bind9 bind9utils bind9-doc -y
Gói bind9utils chứa các công cụ hữu ích như dig, nslookup, và named-checkconf mà chúng ta sẽ sử dụng rất nhiều ở các bước sau để kiểm tra và gỡ lỗi.
Sau khi cài đặt xong, dịch vụ BIND (thường được gọi là named) sẽ tự động khởi động. Bạn có thể kiểm tra trạng thái của dịch vụ để xác nhận nó đang hoạt động bằng lệnh:
sudo systemctl status bind9
Nếu bạn thấy dòng active (running) màu xanh lá, điều đó có nghĩa là BIND đã được cài đặt và đang chạy thành công.
Tham khảo thêm các web server tương tự như Web server là gì, Apache là gì, và Nginx là gì để hiểu thêm về vai trò của phần mềm máy chủ trong quản lý mạng.
Kiểm tra và cập nhật phiên bản BIND
Việc giữ cho phần mềm DNS luôn được cập nhật là cực kỳ quan trọng để bảo vệ hệ thống khỏi các lỗ hổng bảo mật. Bạn có thể kiểm tra phiên bản BIND hiện tại đã được cài đặt bằng lệnh:
named -v
Lệnh này sẽ hiển thị phiên bản chi tiết của BIND. Để đảm bảo an toàn, bạn nên thường xuyên kiểm tra và cài đặt các bản cập nhật bảo mật. Bạn có thể thực hiện việc này bằng cách chạy lại lệnh cập nhật và nâng cấp hệ thống:
sudo apt update && sudo apt upgrade -y
Việc này sẽ tự động tải về và cài đặt các bản vá lỗi và bảo mật mới nhất cho BIND cũng như toàn bộ hệ thống Ubuntu của bạn.

Tạo và cấu hình file zone cho DNS nội bộ
Sau khi cài đặt BIND thành công, chúng ta cần “dạy” cho nó biết cách phân giải các tên miền trong mạng nội bộ. Điều này được thực hiện thông qua các file zone, trái tim của mọi máy chủ DNS.
Khái niệm file zone và tầm quan trọng
Bạn có thể hình dung file zone giống như một cuốn danh bạ chi tiết cho một khu vực mạng cụ thể. Nó chứa tất cả các bản ghi (record) ánh xạ giữa tên miền và địa chỉ IP, cũng như các thông tin cấu hình quan trọng khác.
Có hai loại zone chính mà chúng ta cần quan tâm:
- Forward Lookup Zone: Dùng để phân giải từ tên miền sang địa chỉ IP (ví dụ:
server1.azweb.locallà IP192.168.1.100). Đây là chức năng cơ bản và phổ biến nhất của DNS. - Reverse Lookup Zone: Dùng để phân giải ngược từ địa chỉ IP sang tên miền (ví dụ: IP
192.168.1.100là củaserver1.azweb.local). Chức năng này rất quan trọng cho nhiều dịch vụ mạng và công tác bảo mật.
Việc cấu hình chính xác các file zone đảm bảo rằng mọi thiết bị trong mạng của bạn có thể giao tiếp với nhau một cách dễ dàng thông qua tên gọi thay vì các địa chỉ IP khó nhớ.
Bạn cũng có thể tìm hiểu thêm về các khái niệm liên quan trong bài Nginx là gì để hiểu thêm về cách các dịch vụ mạng phối hợp với DNS server.
Tạo file zone mẫu cho mạng nội bộ
Hãy cùng tạo các file zone cho một mạng nội bộ giả định có tên là azweb.local và dải IP là 192.168.1.0/24.
1. Tạo file Forward Zone:
Tạo một file mới tại /etc/bind/db.azweb.local và thêm nội dung sau:
$TTL 604800
@ IN SOA ns1.azweb.local. admin.azweb.local. (
3 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS ns1.azweb.local.
ns1 IN A 192.168.1.10
server1 IN A 192.168.1.100
web IN A 192.168.1.101
2. Tạo file Reverse Zone:
Tạo một file mới tại /etc/bind/db.192.168.1 và thêm nội dung sau:
$TTL 604800
@ IN SOA ns1.azweb.local. admin.azweb.local. (
3 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS ns1.azweb.local.
10 IN PTR ns1.azweb.local.
100 IN PTR server1.azweb.local.
101 IN PTR web.azweb.local.
Trong đó:
- SOA (Start of Authority): Khai báo thông tin quản lý cho zone.
- NS (Name Server): Chỉ định máy chủ DNS cho zone này.
- A (Address): Ánh xạ một tên miền tới một địa chỉ IPv4.
- PTR (Pointer): Ánh xạ một địa chỉ IP tới một tên miền (dùng cho reverse lookup).

Chỉnh sửa file cấu hình BIND để thiết lập server DNS
Khi đã có các file zone, bước tiếp theo là khai báo chúng trong file cấu hình chính của BIND để máy chủ biết sự tồn tại và cách sử dụng chúng.
Cấu hình file named.conf.local
BIND sử dụng một cấu trúc file cấu hình được chia nhỏ để dễ quản lý. File named.conf.local là nơi lý tưởng để bạn thêm các cấu hình zone của riêng mình mà không làm ảnh hưởng đến các file mặc định.
Mở file /etc/bind/named.conf.local và thêm vào nội dung sau để khai báo forward zone và reverse zone đã tạo ở bước trước:
// Forward zone for azweb.local
zone "azweb.local" {
type master;
file "/etc/bind/db.azweb.local";
};
// Reverse zone for 192.168.1.0/24 network
zone "1.168.192.in-addr.arpa" {
type master;
file "/etc/bind/db.192.168.1";
};
Lưu ý cách viết tên reverse zone: các octet của địa chỉ mạng được đảo ngược và thêm hậu tố .in-addr.arpa. Đây là quy ước chuẩn cho các reverse zone.
Thiết lập quyền truy cập và bảo mật trong named.conf.options
Bảo mật là yếu tố hàng đầu khi vận hành bất kỳ dịch vụ mạng nào, và DNS cũng không ngoại lệ. File named.conf.options cho phép bạn tinh chỉnh các cài đặt bảo mật quan trọng.
Mở file /etc/bind/named.conf.options và tìm đến khối options { ... }. Dưới đây là một số tùy chỉnh quan trọng bạn nên xem xét:
options {
directory "/var/cache/bind";
// Allow queries only from local network
allow-query { localhost; 192.168.1.0/24; };
// Disable recursion for security
recursion no;
listen-on { localhost; 192.168.1.10; };
listen-on-v6 { none; };
// ... other options
};
Giải thích các tham số:
allow-query: Đây là tham số cực kỳ quan trọng, xác định những địa chỉ IP nào được phép gửi truy vấn đến server DNS của bạn. Trong ví dụ này, chúng ta chỉ cho phéplocalhostvà các máy trong mạng192.168.1.0/24.recursion no;: Tắt tính năng đệ quy (recursion). Điều này có nghĩa là server DNS của bạn sẽ chỉ trả lời các truy vấn cho những zone mà nó quản lý (nhưazweb.local) và từ chối phân giải các tên miền khác trên Internet. Đây là một cài đặt bảo mật thiết yếu cho server DNS nội bộ để tránh bị lạm dụng cho các cuộc tấn công DNS Amplification.listen-on: Chỉ định các địa chỉ IP mà BIND sẽ lắng nghe các truy vấn DNS.
Sau khi chỉnh sửa, hãy khởi động lại dịch vụ BIND để áp dụng thay đổi:
sudo systemctl restart bind9

Kiểm tra và xác thực hoạt động của server DNS nội bộ
Sau khi đã hoàn tất các bước cấu hình, việc kiểm tra lại toàn bộ hệ thống là bước không thể thiếu để đảm bảo mọi thứ hoạt động đúng như mong đợi.
Sử dụng lệnh dig và nslookup để kiểm tra tên miền
dig và nslookup là hai công cụ dòng lệnh mạnh mẽ giúp bạn gửi truy vấn DNS và xem kết quả trả về.
1. Kiểm tra Forward Lookup:
Sử dụng dig để truy vấn địa chỉ IP của server1.azweb.local. Lệnh @localhost chỉ định rằng truy vấn sẽ được gửi đến server DNS đang chạy trên chính máy đó.
dig server1.azweb.local @localhost
Kết quả trả về trong phần ANSWER SECTION nên là:
server1.azweb.local. 604800 IN A 192.168.1.100
Điều này xác nhận rằng forward zone đang hoạt động chính xác.
2. Kiểm tra Reverse Lookup:
Sử dụng nslookup để truy vấn tên miền từ địa chỉ IP 192.168.1.100:
nslookup 192.168.1.100 localhost
Kết quả mong đợi sẽ là:
100.1.168.192.in-addr.arpa name = server1.azweb.local.
Nếu bạn nhận được các kết quả tương tự, xin chúc mừng! Server DNS nội bộ của bạn đã được cấu hình thành công.

Kiểm tra file log và xử lý lỗi thường gặp
Nếu truy vấn không thành công, nơi đầu tiên bạn nên tìm đến là các file log hệ thống. BIND thường ghi log vào file syslog của hệ thống.
Bạn có thể xem các log liên quan đến BIND bằng lệnh:
sudo journalctl -u bind9 -f
Lệnh này sẽ hiển thị các thông điệp log của BIND theo thời gian thực. Hãy chú ý đến các dòng có chứa từ khóa “error”. Các lỗi phổ biến thường liên quan đến cú pháp sai trong file cấu hình, sai quyền sở hữu file zone, hoặc các vấn đề về mạng. Đọc kỹ thông báo lỗi sẽ cho bạn gợi ý chính xác về nguyên nhân và cách khắc phục.
Bạn có thể tham khảo các bài viết hướng dẫn xử lý lỗi liên quan như Lỗi 502 Bad Gateway và Lỗi 403 Forbidden để có thêm các giải pháp khắc phục khi vận hành server.
Các lưu ý và best practices khi vận hành DNS nội bộ
Việc cấu hình thành công chỉ là bước khởi đầu. Để duy trì một hệ thống DNS nội bộ ổn định và an toàn trong dài hạn, bạn cần tuân thủ một số nguyên tắc và phương pháp vận hành tốt nhất.
- Sử dụng bản ghi hợp lệ và chính xác: Luôn đảm bảo cú pháp của các file zone là chính xác. Một dấu chấm hay dấu ngoặc sai vị trí cũng có thể khiến toàn bộ zone không hoạt động. Sử dụng các công cụ kiểm tra cú pháp trước khi khởi động lại dịch vụ, như
named-checkconfvànamed-checkzonetrong Revision là gì. - Định kỳ kiểm tra và backup file cấu hình: Các file cấu hình (
/etc/bind/) là tài sản quý giá. Hãy tạo thói quen sao lưu chúng thường xuyên, đặc biệt là trước khi thực hiện bất kỳ thay đổi lớn nào. Việc này sẽ giúp bạn dễ dàng khôi phục lại trạng thái hoạt động khi có sự cố. - Giám sát hiệu suất và bảo mật server DNS: Theo dõi tải của server, số lượng truy vấn, và các lỗi phát sinh. Thiết lập cảnh báo khi có những hoạt động bất thường, ví dụ như số lượng truy vấn tăng đột biến, có thể là dấu hiệu của một cuộc tấn công.
- Tuyệt đối tránh thiết lập recursion mở: Như đã đề cập, việc cho phép đệ quy từ mọi nguồn (
recursion yes;vàallow-query { any; };) sẽ biến máy chủ của bạn thành một “open resolver”, một công cụ tiếp tay cho các cuộc tấn công DDoS. Chỉ bật đệ quy nếu thực sự cần thiết và giới hạn nó trong mạng nội bộ tin cậy.
Bạn cũng có thể tìm hiểu thêm về các loại VPS tốt nhất và ưu điểm của các VPS tại các khu vực như VPS Singapore để tối ưu vận hành server DNS.

Các vấn đề thường gặp và cách xử lý
Trong quá trình cấu hình và vận hành BIND, bạn có thể sẽ gặp phải một số lỗi phổ biến. Rất may, BIND cung cấp sẵn các công cụ mạnh mẽ để giúp bạn chẩn đoán và khắc phục.
Server không khởi động hoặc lỗi cấu hình
Đây là lỗi thường gặp nhất, thường xảy ra sau khi bạn chỉnh sửa các file cấu hình. Nguyên nhân chính là do lỗi cú pháp.
Cách xử lý:
BIND cung cấp hai lệnh kiểm tra cực kỳ hữu ích:
named-checkconf: Dùng để kiểm tra cú pháp của file cấu hình chính (named.confvà các file đượcinclude).
sudo named-checkconf /etc/bind/named.conf.local
Nếu lệnh này không trả về kết quả gì, có nghĩa là file cấu hình của bạn không có lỗi cú pháp.
named-checkzone: Dùng để kiểm tra cú pháp của một file zone cụ thể.
sudo named-checkzone azweb.local /etc/bind/db.azweb.local
Lệnh này sẽ báo cáo chi tiết nếu có lỗi trong file zone và trả về thông báo “OK” nếu mọi thứ đều đúng.
Luôn chạy hai lệnh này sau khi chỉnh sửa file cấu hình và trước khi khởi động lại dịch vụ BIND để phát hiện lỗi sớm.
Truy vấn DNS không nhận phản hồi hoặc sai dữ liệu
Nếu BIND đang chạy nhưng các máy khách không thể phân giải tên miền, nguyên nhân có thể đến từ nhiều phía.
Cách xử lý:
- Kiểm tra dịch vụ BIND: Đảm bảo dịch vụ đang chạy với
sudo systemctl status bind9. - Kiểm tra tường lửa: Tường lửa trên máy chủ DNS hoặc trên mạng có thể đang chặn port 53 (cả UDP và TCP). Hãy kiểm tra và mở port nếu cần.
- Kiểm tra file zone: Xem lại các bản ghi trong file zone để chắc chắn rằng tên miền và địa chỉ IP bạn đang truy vấn đã được định nghĩa chính xác.
- Kiểm tra cấu hình máy khách: Đảm bảo rằng máy khách đã được cấu hình để sử dụng địa chỉ IP của server BIND (
192.168.1.10) làm máy chủ DNS chính. - Xem file log: Luôn kiểm tra file log (
journalctl -u bind9) để tìm các thông điệp lỗi hoặc cảnh báo liên quan đến truy vấn của bạn.
Kết luận
Qua các bước hướng dẫn chi tiết trong bài viết, bạn đã cùng AZWEB tìm hiểu cách thiết lập một máy chủ DNS nội bộ hoàn chỉnh sử dụng BIND trên nền tảng Ubuntu 20.04. Chúng ta đã đi từ khâu chuẩn bị môi trường, cài đặt phần mềm, tạo và cấu hình các file zone, cho đến việc kiểm tra, xác thực và tìm hiểu các phương pháp vận hành tốt nhất.
Việc sở hữu một server DNS nội bộ ổn định không chỉ giúp đơn giản hóa việc quản lý các thiết bị trong mạng mà còn tăng cường hiệu suất và bảo mật cho toàn bộ hệ thống. Thay vì phụ thuộc vào các máy chủ DNS bên ngoài, bạn có toàn quyền kiểm soát “cuốn danh bạ” của mạng lưới mình.
Đừng ngần ngại bắt tay vào thực hành ngay hôm nay. Quá trình này sẽ mang lại cho bạn những kinh nghiệm quý báu và sự hiểu biết sâu sắc hơn về cách thức hoạt động của một trong những giao thức nền tảng của Internet. Đồng thời, hãy luôn theo dõi và cập nhật các bản vá bảo mật cho BIND để giữ cho hệ thống của bạn luôn an toàn.
Bước tiếp theo bạn có thể tìm hiểu là tích hợp server DNS này với một server DHCP để tự động cấp phát IP và cấu hình DNS cho các máy khách, hoặc triển khai các tính năng nâng cao hơn như DNSSEC để tăng cường bảo mật.
Để mở rộng kiến thức về nền tảng server và các dịch vụ mạng, bạn có thể tham khảo thêm về mô hình IaaS là gì cũng như các dịch vụ VPS phổ biến như VPS DigitalOcean. Chúc bạn thành công trên hành trình xây dựng và làm chủ hạ tầng mạng của mình.