Sửa lỗi 'Temporary failure in name resolution' trên Linux

intermediate🐧 Linux2026-03-20| Linux (Ubuntu, Debian, CentOS, Arch) — bare metal, máy ảo, Docker container, WSL2

Error Message

Temporary failure in name resolution
#linux#network#dns#name resolution

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.conf chỉ 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.json và đừ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.conf nếu vấn đề cứ lặp đi lặp lại.
  • ping 8.8.8.8 thất bại nhưng ping 127.0.0.1 thà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.

Related Error Notes