Tự dựng DNS Server nội bộ với BIND9 trên Ubuntu: Giải pháp thay thế file hosts “cồng kềnh”

Ubuntu tutorial - IT technology blog
Ubuntu tutorial - IT technology blog

Nỗi ám ảnh mang tên “nhớ địa chỉ IP”

Nếu bạn đang quản lý một văn phòng khoảng 50 nhân sự với hàng chục thiết bị, bạn sẽ hiểu cảm giác này. Hồi mới vào nghề, mình từng đau đầu khi phải nhớ đủ loại IP: 192.168.1.10 cho server kế toán, 192.168.1.50 cho file server, rồi máy in, camera…

Mỗi lần có nhân viên mới, mình lại phải hì hục đi từng máy để sửa file hosts trên Windows hoặc Linux. Chỉ cần server đổi IP một cái là coi như cả ngày hôm đó mình “cháy máy” điện thoại vì hỗ trợ kỹ thuật. Việc gõ nas.congty.local thay vì một dãy số khô khan rõ ràng là nhu cầu cấp thiết hơn bao giờ hết.

Tại sao file /etc/hosts không còn gánh vác nổi hệ thống?

Dùng file hosts chỉ ổn khi mạng của bạn có 2-3 thiết bị. Khi quy mô lớn dần, nó trở thành một cơn ác mộng thực sự vì những lý do sau:

  • Cập nhật thủ công cực hình: Thêm một server mới đồng nghĩa với việc bạn phải sửa file hosts trên hàng trăm máy client.
  • Rủi ro sai sót cao: Chỉ cần gõ nhầm một chữ số IP, toàn bộ dịch vụ của phòng ban đó sẽ “sập” trong mắt người dùng.
  • Thiết bị di động bị bỏ rơi: Smartphone hay máy tính bảng gần như không thể can thiệp vào file hosts nếu không root hoặc jailbreak.

DNS Server nội bộ chính là cứu cánh. Nó hoạt động như một cuốn danh bạ dùng chung. Khi ai đó gõ git.lab.io, máy tính sẽ hỏi DNS Server: “Thằng này ở đâu?”, và nhận về IP chính xác chỉ trong vài miligiây.

BIND9 – “Lão làng” trong thế giới DNS

Dù hiện nay có nhiều lựa chọn như Unbound hay CoreDNS, BIND9 (Berkeley Internet Name Domain) vẫn là tiêu chuẩn vàng. Khi mình chuyển từ CentOS sang Ubuntu, cấu hình BIND9 có chút khác biệt về cách sắp xếp file. Tuy nhiên, một khi đã nắm được logic của nó, bạn sẽ thấy khả năng tùy biến của BIND9 là cực kỳ mạnh mẽ.

BIND9 xử lý mượt mà cả phân giải thuận (Forward DNS), phân giải ngược (Reverse DNS) lẫn chuyển tiếp yêu cầu (Forwarding). Đây là nền tảng không thể thiếu nếu bạn muốn quản lý hạ tầng mạng một cách chuyên nghiệp.

Các bước triển khai BIND9 thực tế trên Ubuntu Server

Để anh em dễ hình dung, mình sẽ dùng một mô hình lab thực tế với các thông số sau:

  • OS: Ubuntu Server 22.04 LTS
  • IP DNS Server: 192.168.1.100
  • Domain nội bộ: itfromzero.local

Bước 1: Cài đặt gói phần mềm BIND9

Đầu tiên, hãy cập nhật kho ứng dụng và cài đặt BIND9 cùng các công cụ hỗ trợ:

sudo apt update
sudo apt install bind9 bind9utils bind9-doc -y

Bước 2: Cấu hình Forwarders (Chuyển tiếp truy vấn)

Chúng ta muốn DNS Server này trả lời các domain nội bộ, còn nếu nhân viên lướt facebook.com, nó sẽ đẩy yêu cầu ra ngoài Internet.

Mở file /etc/bind/named.conf.options:

sudo nano /etc/bind/named.conf.options

Trước tiên, hãy định nghĩa danh sách IP tin cậy (ACL) để tránh việc DNS của bạn bị lợi dụng tấn công từ bên ngoài:

acl "trusted" {
    192.168.1.0/24;
    localhost;
    localnets;
};

Sau đó, trong block options, thêm cấu hình cho phép truy vấn và khai báo Forwarders:

options {
    directory "/var/cache/bind";
    allow-query { trusted; };
    forwarders {
        8.8.8.8;
        1.1.1.1;
    };
    // ... các cấu hình khác giữ nguyên
};

Bước 3: Khai báo các Zone quản lý

Bây giờ, hãy nói với BIND9 rằng bạn sẽ chịu trách nhiệm cho domain itfromzero.local. Mở file /etc/bind/named.conf.local:

sudo nano /etc/bind/named.conf.local

Thêm nội dung sau để định nghĩa khu vực phân giải thuận và nghịch:

// Forward Zone
zone "itfromzero.local" {
    type master;
    file "/etc/bind/zones/db.itfromzero.local";
};

// Reverse Zone
zone "1.168.192.in-addr.arpa" {
    type master;
    file "/etc/bind/zones/db.192.168.1";
};

Bước 4: Tạo Forward Zone File (Phân giải thuận)

Đây là nơi bạn đặt các bản ghi A, CNAME. Hãy tạo thư mục riêng để quản lý cho gọn:

sudo mkdir /etc/bind/zones
sudo cp /etc/bind/db.local /etc/bind/zones/db.itfromzero.local
sudo nano /etc/bind/zones/db.itfromzero.local

Cập nhật file với các bản ghi thực tế. Lưu ý: Dấu chấm ở cuối tên miền là bắt buộc.

$TTL    604800
@       IN      SOA     ns1.itfromzero.local. admin.itfromzero.local. (
                              3         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      ns1.itfromzero.local.
ns1     IN      A       192.168.1.100
web     IN      A       192.168.1.101
nas     IN      A       192.168.1.102

Bước 5: Tạo Reverse Zone File (Phân giải nghịch)

Phân giải nghịch giúp ánh xạ từ IP ngược lại tên miền. Việc này cực kỳ quan trọng cho các dịch vụ log hoặc mail server nội bộ.

sudo cp /etc/bind/db.127 /etc/bind/zones/db.192.168.1
sudo nano /etc/bind/zones/db.192.168.1

Cấu hình tương ứng với dải IP của bạn:

$TTL    604800
@       IN      SOA     ns1.itfromzero.local. admin.itfromzero.local. (
                              3         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      ns1.itfromzero.local.
100     IN      PTR     ns1.itfromzero.local.
101     IN      PTR     web.itfromzero.local.
102     IN      PTR     nas.itfromzero.local.

Bước 6: Kiểm tra cú pháp và kích hoạt

Đừng vội khởi động lại dịch vụ ngay. Hãy dùng công cụ kiểm tra để tránh lỗi gõ máy làm sập DNS:

sudo named-checkconf
sudo named-checkzone itfromzero.local /etc/bind/zones/db.itfromzero.local
sudo systemctl restart bind9
sudo systemctl enable bind9

Kinh nghiệm thực tế: Đừng để mắc những lỗi ngớ ngẩn

Sau nhiều lần “ăn hành” với BIND9, mình rút ra 3 quy tắc vàng:

  1. Dấu chấm (.) “quyền lực”: Trong file zone, ns1.itfromzero.local. phải có dấu chấm ở cuối để thành FQDN. Quên nó, BIND sẽ tự hiểu thành ns1.itfromzero.local.itfromzero.local. Đây là “hố tử thần” mà hầu như ai mới làm cũng từng nhảy xuống.
  2. Luôn tăng Serial Number: Mỗi khi sửa file zone, hãy tăng số Serial lên 1 đơn vị (ví dụ từ 3 lên 4). Nếu không, các DNS phụ sẽ không bao giờ cập nhật dữ liệu mới từ máy chủ chính.
  3. Check kỹ quyền sở hữu: Nếu bạn copy file bằng quyền root, user bind có thể không đọc được file. Hãy chạy lệnh sudo chown -R bind:bind /etc/bind/zones để đảm bảo mọi thứ trơn tru.

Triển khai BIND9 không chỉ là cài một phần mềm, đó là cách bạn chuẩn hóa hạ tầng mạng. Chúc các bạn cấu hình thành công và sớm thoát khỏi nỗi lo sửa file hosts thủ công!

Share: