Khắc phục lỗi máy chủ không kết nối Internet và không phân giải DNS do iptables
Dưới đây là bài viết tổng kết lại quá trình xử lý sự cố host không truy cập được Internet và không phân giải được tên miền do cấu hình iptables
và resolv.conf
. Bạn có thể đăng lên blog kỹ thuật, wiki nội bộ hoặc GitHub Pages.
🧰 Khắc phục lỗi máy chủ không kết nối Internet và không phân giải DNS do iptables
Tình huống
Sau khi cấu hình tường lửa bằng iptables
, hệ thống gặp các sự cố sau:
ping 8.8.8.8
không thôngdig google.com
không có phản hồiCác container Docker cũng không truy cập ra ngoài
Tuy iptables -P OUTPUT ACCEPT
đã cho phép truy cập ra ngoài, nhưng hệ thống vẫn không kết nối được.
📌 Nguyên nhân và hướng xử lý
✅ 1. iptables INPUT DROP
nhưng thiếu rule cho kết nối hồi đáp
iptables INPUT DROP
nhưng thiếu rule cho kết nối hồi đápNếu bạn đặt policy mặc định INPUT DROP
, bạn phải cho phép các kết nối đã được thiết lập (ESTABLISHED
) quay lại, ví dụ:
iptables -I INPUT 1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Nếu thiếu dòng này, mọi kết nối từ host ra ngoài sẽ không nhận được phản hồi, gây lỗi ping
, dig
, curl
,...
✅ 2. Thiếu NAT (MASQUERADE) khi có Docker hoặc route nhiều interface
Khi dùng Docker hoặc có mạng nội bộ, bạn cần thêm rule NAT:
iptables -t nat -A POSTROUTING -o ens5 -j MASQUERADE
Thay ens5
bằng tên interface mạng thật của bạn (ip a
để kiểm tra). Điều này giúp gói tin từ mạng nội bộ hoặc container có thể đi ra Internet.
✅ 3. DNS không phân giải được do /etc/resolv.conf
cấu hình sai
/etc/resolv.conf
cấu hình saiKhi kiểm tra:
cat /etc/resolv.conf
Thường thấy:
nameserver 127.0.0.1
→ Nếu hệ thống không có DNS server local như systemd-resolved
, dnsmasq
, thì lệnh dig google.com
sẽ không phân giải được.
Cách sửa nhanh:
echo -e "nameserver 1.1.1.1\nnameserver 8.8.8.8" | sudo tee /etc/resolv.conf
✅ 4. Tắt systemd-resolved
nếu cần cấu hình DNS thủ công
systemd-resolved
nếu cần cấu hình DNS thủ côngNhiều distro mới dùng systemd-resolved
, gây ghi đè resolv.conf
. Để tắt hoàn toàn và quản lý DNS thủ công:
sudo systemctl disable systemd-resolved
sudo systemctl stop systemd-resolved
sudo rm -f /etc/resolv.conf
echo -e "nameserver 1.1.1.1\nnameserver 8.8.8.8" | sudo tee /etc/resolv.conf
✅ Tổng hợp lệnh khắc phục
# Cho phép phản hồi từ kết nối đã thiết lập
iptables -I INPUT 1 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Thêm NAT cho kết nối outbound
iptables -t nat -A POSTROUTING -o ens5 -j MASQUERADE
# Ghi đè cấu hình DNS tạm thời
echo -e "nameserver 1.1.1.1\nnameserver 8.8.8.8" | sudo tee /etc/resolv.conf
✅ Kiểm tra lại sau khi khắc phục
ping 8.8.8.8
dig google.com
curl https://google.com -I
📚 Kinh nghiệm rút ra
Luôn kiểm tra
iptables -L -v -n
và đảm bảo cho phépESTABLISHED,RELATED
nếu bạn dùngINPUT DROP
Không quên kiểm tra bảng
nat
(iptables -t nat -L -v -n
)Kiểm tra DNS từ
resolv.conf
, nhất là khi dùngsystemd-resolved
hoặc DHCPSử dụng
dig @8.8.8.8 domain.com
để tách biệt vấn đề DNS nội bộ
Last updated
Was this helpful?