Bối cảnh
DNS bị hỏng. Đó là câu trả lời ngắn gọn nhất. Lỗi này xuất hiện mỗi khi Linux không thể phân giải tên miền thành địa chỉ IP — bạn sẽ gặp nó với curl, apt, ping, wget, gần như bất kỳ thứ gì sử dụng tên miền:
$ curl https://example.com
curl: (6) Could not resolve host: example.com
$ ping google.com
ping: google.com: Temporary failure in name resolution
$ apt update
Err:1 http://archive.ubuntu.com/ubuntu focal InRelease
Temporary failure in name resolution
Kết nối mạng thường vẫn hoạt động bình thường. Thủ phạm hầu như luôn là một trong các nguyên nhân sau: file resolv.conf rỗng hoặc bị hỏng, systemd-resolved bị crash, cấu hình nameserver sai, hoặc một container chưa được thiết lập DNS đúng cách.
Quy trình debug
Bước 1 — Kiểm tra xem có phải chỉ DNS bị lỗi không
Ping bằng địa chỉ IP, không dùng tên miền:
ping -c 3 8.8.8.8
Thành công? Tốt — mạng ổn, vấn đề thuần túy là DNS. Thất bại? Dừng lại ở đây và kiểm tra interface, default gateway và bảng định tuyến trước.
Bước 2 — Kiểm tra resolv.conf
cat /etc/resolv.conf
Một file hoạt động đúng cần có ít nhất một dòng nameserver:
nameserver 8.8.8.8
nameserver 1.1.1.1
File rỗng? File không tồn tại? Chỉ có nameserver 127.0.0.53 mà không có gì lắng nghe trên đó? Đó chính là vấn đề của bạn.
Bước 3 — Kiểm tra xem systemd-resolved có đang chạy không (Ubuntu/Debian)
systemctl status systemd-resolved
Service bị lỗi hoặc không hoạt động nghĩa là không có gì đang lắng nghe trên 127.0.0.53 — đúng địa chỉ mà /etc/resolv.conf đang trỏ tới. Kết quả là DNS bị hỏng mà không có thông báo rõ ràng.
Bước 4 — Kiểm tra DNS thủ công
# Truy vấn trực tiếp một DNS server cụ thể
nslookup google.com 8.8.8.8
# Hoặc dùng dig (chi tiết hơn)
dig @8.8.8.8 google.com
Phân giải được? Nameserver đang hoạt động. Vấn đề nằm ở phía trên — cách Linux được cấu hình để kết nối tới server đó, không phải bản thân server.
Bước 5 — Kiểm tra bên trong Docker / container
Đang chạy lệnh này trong container? Kiểm tra cả hai phía:
cat /etc/resolv.conf # bên trong container
docker inspect | grep -i dns
Sự cố DNS trên host sẽ ảnh hưởng thẳng vào container. Đừng giả định container đã kế thừa cấu hình hoạt động được.
Giải pháp
Fix 1 — Thêm nameserver vào resolv.conf thủ công (sửa nhanh)
Cách nhanh nhất để gỡ bí — hoạt động trên mọi hệ thống Linux:
sudo nano /etc/resolv.conf
Thêm hoặc thay thế bằng:
nameserver 8.8.8.8
nameserver 1.1.1.1
Kiểm tra ngay:
ping -c 2 google.com
Lưu ý: Trên các hệ thống được quản lý bởi systemd-resolved hoặc NetworkManager, file này sẽ bị ghi đè khi khởi động lại. Dùng một trong các cách sửa bên dưới để giữ cấu hình cố định.
Fix 2 — Khởi động lại systemd-resolved (Ubuntu/Debian)
sudo systemctl restart systemd-resolved
sudo systemctl enable systemd-resolved
Tạo lại liên kết resolv.conf tới stub resolver:
sudo ln -sf /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
Fix 3 — Đặt DNS qua NetworkManager (desktop/server dùng NM)
# Liệt kê các kết nối
nmcli connection show
# Đặt DNS cho kết nối đang hoạt động (thay 'eth0' bằng tên kết nối của bạn)
nmcli connection modify eth0 ipv4.dns "8.8.8.8 1.1.1.1"
nmcli connection modify eth0 ipv4.ignore-auto-dns yes
nmcli connection up eth0
Fix 4 — Sửa cố định qua /etc/systemd/resolved.conf
Chỉnh sửa trực tiếp file cấu hình của systemd-resolved:
sudo nano /etc/systemd/resolved.conf
Bỏ comment và đặt giá trị:
[Resolve]
DNS=8.8.8.8 1.1.1.1
FallbackDNS=9.9.9.9
Khởi động lại để áp dụng:
sudo systemctl restart systemd-resolved
Fix 5 — Sửa DNS cho Docker
Tạo hoặc chỉnh sửa /etc/docker/daemon.json:
{
"dns": ["8.8.8.8", "1.1.1.1"]
}
Khởi động lại Docker:
sudo systemctl restart docker
Muốn chỉ sửa một container mà không động tới daemon? Truyền DNS khi chạy:
docker run --dns 8.8.8.8 your-image
Fix 6 — Dành riêng cho WSL2
WSL2 tự động tạo resolv.conf — và đôi khi tạo sai. Tắt tính năng tự động tạo trước:
sudo nano /etc/wsl.conf
[network]
generateResolvConf = false
Sau đó đặt nameserver thủ công:
sudo rm /etc/resolv.conf
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
Khởi động lại WSL từ PowerShell: wsl --shutdown
Xác minh
# Kiểm tra phân giải tên miền cơ bản
ping -c 3 google.com
# Kiểm tra end-to-end đầy đủ
curl -I https://example.com
# Kiểm tra DNS server nào đang thực sự được sử dụng
resolvectl status # hệ thống dùng systemd-resolved
nslookup google.com # hiển thị server đã trả lời
# Riêng cho apt
sudo apt update
Mẹo hay
Khi bạn đang xử lý cả sự cố cấu hình IP/subnet lẫn DNS — thường gặp trong VM và môi trường cloud — Subnet Calculator trên ToolCraft giúp tiết kiệm thời gian kiểm tra dải CIDR và địa chỉ mạng. Tôi thường dùng nó khi cấu hình IP tĩnh và muốn xác nhận gateway có thực sự nằm trong cùng subnet trước khi đi tìm nguyên nhân DNS.
Bài học rút ra
- Bắt đầu với
/etc/resolv.conf— khoảng 80% trường hợp là file rỗng hoặc file đang trỏ tới một stub resolver đã chết. - Chỉnh sửa trực tiếp
resolv.confchỉ là tạm thời trên các hệ thống được quản lý. Cách sửa cố định phù hợp phụ thuộc vào ai đang quản lý DNS:systemd-resolved,NetworkManager, hay cấu hình thủ công. - Container Docker không tự động kế thừa cấu hình DNS hoạt động được. DNS bị hỏng trên host sẽ ảnh hưởng thẳng vào container. Hãy đặt rõ ràng trong
daemon.jsonvà đừng tự đoán mò. - WSL2 cần một cách xử lý riêng — tắt tính năng tự động tạo và tự quản lý
resolv.confnếu vấn đề cứ lặp đi lặp lại. ping 8.8.8.8thất bại nhưngping 127.0.0.1thành công? Dừng debug DNS lại. Bạn đang gặp vấn đề về định tuyến hoặc gateway, không phải nameserver.

