Vấn đề thực tế: Khi file /etc/hosts chạm ngưỡng giới hạn
Trong homelab hoặc mạng nội bộ công ty với khoảng 20-30 máy ảo, container và switch, gõ từng IP tĩnh như 192.168.1.45 rất phiền. Anh em thường chống cháy bằng cách ghi thẳng vào file /etc/hosts trên từng máy. Giải pháp này chỉ ổn khi có dưới 5 thiết bị. Vượt mốc đó, mỗi lần đổi IP của một node K8s hay server GitLab là một lần vật lộn đồng bộ lại hàng chục máy trạm.
Lối thoát sạch sẽ nhất là dựng một Local DNS Server riêng. Fedora Server là lựa chọn rất tốt cho hạ tầng lab nhờ kernel mới và package cập nhật nhanh. Đi cùng Fedora, BIND9 (daemon named) vẫn giữ vị trí tiêu chuẩn công nghiệp: nhẹ, ổn định và tài liệu dồi dào.
Rào cản lớn nhất nằm ở SELinux đang chạy chế độ Enforcing. Đặt sai nhãn context hay phân quyền nhầm group, BIND sẽ từ chối nạp file zone mà không đưa ra log cảnh báo rõ ràng. Hướng dẫn dưới đây sẽ giúp anh em dựng hệ thống DNS chuẩn chỉ mà không cần tắt SELinux.
Ba mảnh ghép cốt lõi của Local DNS
Trước khi viết cấu hình, anh em cần phân biệt rõ ba khái niệm:
- Forward Lookup Zone (Phân giải xuôi): Đổi hostname (FQDN) ra địa chỉ IP. Ví dụ: truy vấn
gitlab.lab.localtrả về192.168.1.50. - Reverse Lookup Zone (Phân giải ngược): Dò ngược từ IP về tên máy qua bản ghi
PTR. Cực kỳ quan trọng để debug log tập trung, kiểm tra nguồn SSH và hạn chế báo động giả từ các công cụ giám sát mạng. - Forwarders (Chuyển tiếp truy vấn): Với các tên miền Internet như
github.com, server nội bộ không trực tiếp phân giải gốc. Nó đẩy truy vấn lên DNS upstream (như Cloudflare1.1.1.1hoặc Google8.8.8.8). Kết quả được giữ trong bộ nhớ đệm (cache), giúp giảm độ trễ truy vấn từ 35ms xuống dưới 2ms cho những lần hỏi tiếp theo.
Thực hành cấu hình BIND trên Fedora Server
Thông số giả định cho hệ sinh thái lab:
- IP Fedora DNS Server:
192.168.1.10 - Domain nội bộ:
lab.local - Subnet:
192.168.1.0/24
Bước 1: Cài đặt BIND và bind-utils
Cài đặt gói dịch vụ BIND và bộ công cụ kiểm tra mạng (chứa sẵn dig, nslookup, named-checkconf):
sudo dnf install -y bind bind-utils
Bước 2: Hiệu chỉnh file trung tâm /etc/named.conf
Luôn sao lưu file gốc trước khi can thiệp:
sudo cp /etc/named.conf /etc/named.conf.orig
sudo nano /etc/named.conf
Tìm khối options và cập nhật lại dải IP lắng nghe cùng quyền truy vấn. Sau đó thêm khai báo hai zone mới ở cuối file:
options {
# Mở port 53 trên localhost và IP tĩnh của server
listen-on port 53 { 127.0.0.1; 192.168.1.10; };
listen-on-v6 port 53 { ::1; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
secroots-file "/var/named/data/named.secroots";
recursing-file "/var/named/data/named.recursing";
# Chỉ định các client trong dải 192.168.1.0/24 được phép hỏi DNS
allow-query { localhost; 192.168.1.0/24; };
# Bật đệ quy để resolve được web ngoài Internet
recursion yes;
# Chuyển tiếp query lạ lên Cloudflare và Google
forwarders {
1.1.1.1;
8.8.8.8;
};
dnssec-validation yes;
managed-keys-directory "/var/named/dynamic";
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};
# Zone xuôi cho lab.local
zone "lab.local" IN {
type primary;
file "lab.local.zone";
allow-update { none; };
};
# Zone ngược cho subnet 192.168.1.0/24
zone "1.168.192.in-addr.arpa" IN {
type primary;
file "192.168.1.rev";
allow-update { none; };
};
Bước 3: Khởi tạo Zone File cho chiều xuôi và ngược
Tạo file phân giải xuôi tại /var/named/lab.local.zone:
sudo nano /var/named/lab.local.zone
Khai báo bản ghi SOA, NS và các bản ghi A cụ thể:
$TTL 86400
@ IN SOA ns1.lab.local. admin.lab.local. (
2026110601 ; Serial: YYYYMMDDNN (tăng số này mỗi khi sửa file)
3600 ; Refresh (1 giờ)
1800 ; Retry (30 phút)
604800 ; Expire (1 tuần)
86400 ) ; Minimum TTL (1 ngày)
; Máy chủ DNS chịu trách nhiệm
@ IN NS ns1.lab.local.
; Bản ghi định danh thiết bị
ns1 IN A 192.168.1.10
router IN A 192.168.1.1
gitlab IN A 192.168.1.50
k8s IN A 192.168.1.60
Tạo tiếp file phân giải ngược tại /var/named/192.168.1.rev:
sudo nano /var/named/192.168.1.rev
Điền các bản ghi PTR tương ứng. Lưu ý: luôn có dấu chấm . ở cuối tên miền FQDN để tránh BIND tự động ghép thêm domain gốc:
$TTL 86400
@ IN SOA ns1.lab.local. admin.lab.local. (
2026110601 ; Serial
3600
1800
604800
86400 )
@ IN NS ns1.lab.local.
; Số cuối cùng trong địa chỉ IP (host octet)
10 IN PTR ns1.lab.local.
1 IN PTR router.lab.local.
50 IN PTR gitlab.lab.local.
60 IN PTR k8s.lab.local.
Bước 4: Thiết lập quyền sở hữu và SELinux context
Đây là bước quyết định trên hệ điều hành họ RHEL/Fedora. Daemon named chạy dưới tài khoản dịch vụ không có quyền root. Nếu file zone mang nhãn sai, SELinux sẽ ngắt quyền đọc ngay lập tức.
# Gán quyền sở hữu file cho group named với quyền đọc 640
sudo chown root:named /var/named/lab.local.zone /var/named/192.168.1.rev
sudo chmod 640 /var/named/lab.local.zone /var/named/192.168.1.rev
# Khôi phục nhãn bảo mật mặc định theo policy của hệ thống
sudo restorecon -v /var/named/lab.local.zone
sudo restorecon -v /var/named/192.168.1.rev
Kiểm tra lại nhãn bằng lệnh ls -Z /var/named/. Context hợp lệ phải hiển thị đúng loại đối tượng named_zone_t:
ls -Z /var/named/lab.local.zone
# Output mong đợi: system_u:object_r:named_zone_t:s0 /var/named/lab.local.zone
Bước 5: Kiểm tra cú pháp và mở firewall
Đừng vội khởi động service ngay. Hãy chạy bộ công cụ kiểm tra cú pháp để bắt lỗi chính tả trước:
# Kiểm tra file cấu hình tổng thể (không in gì ra nghĩa là file hợp lệ)
sudo named-checkconf
# Kiểm tra cú pháp từng zone file
sudo named-checkzone lab.local /var/named/lab.local.zone
sudo named-checkzone 1.168.192.in-addr.arpa /var/named/192.168.1.rev
Cả hai lệnh checkzone đều trả về status OK kèm số serial. Lúc này, anh em tự tin kích hoạt service và mở port 53 (cả giao thức UDP và TCP) qua firewalld:
# Khởi động BIND cùng hệ thống
sudo systemctl enable --now named
# Mở dịch vụ DNS xuyên suốt qua firewall
sudo firewall-cmd --add-service=dns --permanent
sudo firewall-cmd --reload
Bước 6: Xác thực truy vấn bằng dig
Đứng từ một máy trạm bất kỳ trong mạng LAN hoặc trực tiếp trên server, dùng dig trỏ thẳng vào IP 192.168.1.10 để nghiệm thu:
# 1. Kiểm tra phân giải xuôi
dig @192.168.1.10 gitlab.lab.local +short
# Kết quả: 192.168.1.50
# 2. Kiểm tra phân giải ngược
dig @192.168.1.10 -x 192.168.1.50 +short
# Kết quả: gitlab.lab.local.
# 3. Kiểm tra khả năng phân giải ra Internet
dig @192.168.1.10 fedoraproject.org +short
Nếu câu lệnh trả về đúng IP chỉ định và cờ status là NOERROR, máy chủ DNS đã sẵn sàng phục vụ.
Tổng kết
Dựng BIND trên Fedora Server đòi hỏi sự chặt chẽ về quyền tệp tin và SELinux context. Bù lại, hệ thống vận hành cực kỳ vững chắc và đúng chuẩn Enterprise Linux. Khi đã có server DNS riêng, anh em chỉ cần cấu hình IP 192.168.1.10 làm DNS chính trong mục DHCP của router mạng. Từ thời điểm đó, mọi thiết bị mới gia nhập LAN đều tự động gọi được các máy chủ nội bộ theo tên miền mà không cần đụng đến file hosts thêm một lần nào nữa.

