Cấu hình DNS Split-Horizon với BIND9: Tuyệt chiêu “phân thân” IP cho LAN và Internet

Network tutorial - IT technology blog
Network tutorial - IT technology blog

Vấn đề thực tế: Tại sao bạn cần DNS Split-Horizon?

Bạn đã bao giờ gặp cảnh ngồi ngay trong văn phòng nhưng truy cập Mail Server hay ERP nội bộ lại chậm như rùa chưa? Sau 6 tháng vận hành hệ thống, mình phát hiện ra một lỗi sơ đẳng: Server đặt trong LAN (IP 192.168.1.50) nhưng DNS chỉ trỏ về IP Public (1.2.3.4).

Khi đó, gói tin từ máy bạn phải chạy vòng lên Firewall, thực hiện Hairpin NAT rồi mới quay ngược về Server. Quá trình này khiến độ trễ (latency) tăng từ dưới 1ms lên tận 20-30ms. Thậm chí, nếu Firewall quá tải, kết nối của anh em trong công ty sẽ chập chờn ngay cả khi mạng nội bộ vẫn khỏe.

Giải pháp chính là DNS Split-Horizon (hay Split-Brain). Hiểu đơn giản: Server sẽ nhìn vào IP của người hỏi để trả lời. Nếu là máy trong LAN, nó đưa IP nội bộ. Nếu là khách từ Internet, nó đưa IP Public. Mọi thứ diễn ra hoàn toàn tự động.

Khái niệm cốt lõi: ACL và View trong BIND9

Để triển khai trên Linux, bạn cần làm chủ hai công cụ sau:

  • ACL (Access Control List): Dùng để phân loại nhóm IP. Ví dụ: Nhóm “VIP” là mạng LAN, nhóm còn lại là “Guest”.
  • View: Đây là bộ não xử lý. Nó cho phép BIND9 hiển thị các file zone khác nhau tùy vào việc khách hàng thuộc ACL nào.

Mẹo nhỏ: Khi cần tính toán dải IP (Subnet) phức tạp để đưa vào ACL, mình thường dùng IP Subnet Calculator. Công cụ này giúp bạn tránh những lỗi gõ nhầm CIDR khiến DNS chặn nhầm người dùng.

Thực hành cấu hình DNS Split-Horizon

Mình sẽ thực hiện trên Ubuntu Server. Nếu bạn dùng CentOS hay Debian, logic vẫn y hệt, chỉ cần lưu ý đường dẫn file cấu hình.

Bước 1: Cài đặt BIND9

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

Bước 2: Định nghĩa ACL cho mạng nội bộ

Mở file named.conf.options để khai báo dải IP tin cậy:

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

Thêm đoạn code sau vào ngay đầu file:

acl "trusted" {
        127.0.0.0/8;
        192.168.1.0/24;  # Dải IP văn phòng của bạn
};

Bước 3: Thiết lập Views (Bước quan trọng nhất)

Bình thường, bạn khai báo zone trực tiếp. Nhưng với Split-Horizon, mọi zone phải được bọc trong block view.

Lưu ý quan trọng: Khi đã dùng view, BIND9 bắt buộc 100% các zone (kể cả zone mặc định như localhost) phải nằm trong một view nào đó. Nếu để sót, service sẽ báo lỗi và không thể khởi động.

Sửa file /etc/bind/named.conf.local:

# View cho anh em trong LAN
view "internal" {
    match-clients { "trusted"; };
    recursion yes;
    include "/etc/bind/named.conf.default-zones";

    zone "itfromzero.com" {
        type master;
        file "/etc/bind/db.itfromzero.com.internal";
    };
};

# View cho khách ngoài Internet
view "external" {
    match-clients { any; };
    recursion no; # Tắt để tránh bị lợi dụng tấn công DNS Amplification

    zone "itfromzero.com" {
        type master;
        file "/etc/bind/db.itfromzero.com.external";
    };
};

Bước 4: Tạo dữ liệu cho từng View

Chúng ta cần 2 file database riêng cho cùng một tên miền.

1. File zone nội bộ (Trỏ về IP LAN 192.168.1.50):

sudo cp /etc/bind/db.local /etc/bind/db.itfromzero.com.internal
sudo nano /etc/bind/db.itfromzero.com.internal

Cấu hình bản ghi A cho ERP trỏ về IP nội bộ.

2. File zone bên ngoài (Trỏ về IP Public 1.2.3.4):

sudo cp /etc/bind/db.local /etc/bind/db.itfromzero.com.external
sudo nano /etc/bind/db.itfromzero.com.external

Tại đây, bản ghi A sẽ trỏ về IP Public để người ngoài có thể truy cập qua Firewall.

Bước 5: Kiểm tra và vận hành

Đừng vội restart service ngay. Hãy kiểm tra cú pháp trước để tránh làm gián đoạn hệ thống:

sudo named-checkconf
sudo systemctl restart bind9

Kiểm tra thực tế: Có thực sự hiệu quả?

Sử dụng lệnh dig để xác nhận kết quả. Từ máy tính trong LAN, bạn gõ:

dig erp.itfromzero.com

Nếu kết quả trả về 192.168.1.50 là bạn đã thành công. Để test hướng bên ngoài, bạn có thể dùng điện thoại phát 4G cho laptop rồi thực hiện lại lệnh trên. Lúc này, kết quả phải là IP Public 1.2.3.4.

Kinh nghiệm “xương máu” khi vận hành

Triển khai Split-Horizon xong, tốc độ phản hồi ứng dụng sẽ nhanh tê tái. Tuy nhiên, nó cũng có một cái bẫy: Khi thêm subdomain mới, bạn phải cập nhật vào cả hai file zone.

Mình từng bị một vố đau khi thêm bản ghi cho đối tác ở file internal nhưng quên file external. Kết quả là mình test ở văn phòng thì chạy mượt, còn khách hàng gọi mắng vốn vì không vào được web. Hãy luôn kiểm tra chéo cả hai view mỗi khi thay đổi cấu hình.

Cuối cùng, đừng bao giờ để recursion yes ở view external. Nếu không, server của bạn sẽ sớm trở thành công cụ để hacker thực hiện các cuộc tấn công DDoS DNS Amplification vào mục tiêu khác.

Lời kết

DNS Split-Horizon là kỹ thuật cực kỳ thực dụng cho mạng doanh nghiệp có Server On-premise. Chỉ cần nắm vững logic về ACL và View, bạn sẽ làm chủ được luồng dữ liệu và tối ưu trải nghiệm cho người dùng. Chúc anh em triển khai thành công!

Share: