Fix WSL2 'Temporary failure in name resolution' — Không Có Kết Nối Internet

intermediate🪟 Windows2026-03-17| Windows 10/11, WSL2 (Ubuntu 20.04/22.04, Debian, hoặc bất kỳ distro Linux nào trên WSL2)

Error Message

Temporary failure in name resolution (inside WSL2)
#windows#wsl2#mạng#dns#internet

Lỗi Gặp Phải

Bạn mở terminal WSL2, cố cài một gói hoặc clone một repo, và nhận được:

Temporary failure in name resolution

Hai bài kiểm tra nhanh giúp thu hẹp nguyên nhân:

$ ping google.com
ping: google.com: Temporary failure in name resolution

$ ping 8.8.8.8
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_seq=1 ttl=113 time=11.4 ms

Kết nối IP hoạt động bình thường. Phân giải tên miền thì không. Đây là vấn đề DNS, không phải lỗi mạng tổng quát.

Nguyên Nhân

WSL2 chạy bên trong một VM Hyper-V với card mạng ảo riêng. Khi khởi động, nó tự động tạo /etc/resolv.conf trỏ đến gateway của máy Windows làm DNS server. Trong điều kiện bình thường, mọi thứ hoạt động tốt. Lỗi xảy ra khi:

  • Một VPN client (Cisco AnyConnect, OpenVPN, WireGuard) thay đổi bảng định tuyến và khiến gateway không thể truy cập
  • Windows Firewall chặn lưu lượng từ card mạng ảo WSL2
  • File resolv.conf được tạo tự động trỏ đến địa chỉ cũ hoặc sai
  • Bạn đã chỉnh sửa resolv.conf thủ công, nhưng WSL2 ghi đè lên nó khi khởi động lại

Quá Trình Debug

Bước 1: Kiểm tra cấu hình DNS hiện tại

cat /etc/resolv.conf

Bạn có thể thấy nội dung như sau:

# File này được tạo tự động bởi WSL.
# [network]
# generateResolvConf = false
nameserver 172.31.16.1

Địa chỉ 172.x.x.x đó là gateway của máy Windows. Nếu nó không thể truy cập, mọi truy vấn DNS đều thất bại.

Bước 2: Kiểm tra xem nameserver có phản hồi không

nc -zv $(grep nameserver /etc/resolv.conf | awk '{print $2}') 53

Nếu kết nối bị timeout, nameserver không thể truy cập từ bên trong WSL2. Đó là nguyên nhân gốc rễ của vấn đề.

Cách Sửa 1: Ghi Đè DNS Ngay Lập Tức (Kiểm Tra Nhanh)

Thay thế nameserver bị lỗi bằng một DNS server công cộng:

sudo rm /etc/resolv.conf
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf

Kiểm tra ngay:

nslookup github.com

nslookup trả về kết quả xác nhận DNS là vấn đề. Nhưng thay đổi này sẽ không tồn tại sau khi khởi động lại WSL2 — nó sẽ tái tạo resolv.conf và xóa thay đổi của bạn. Chuyển sang Cách Sửa 2 để làm cho nó vĩnh viễn.

Cách Sửa 2: Ghi Đè DNS Vĩnh Viễn (Khuyến Nghị)

Tắt tính năng tự động tạo và khóa file cấu hình.

Bước 1: Chỉnh sửa /etc/wsl.conf:

sudo nano /etc/wsl.conf

Thêm vào:

[network]
generateResolvConf = false

Bước 2: Xóa symlink mà WSL đã tạo và thay thế bằng một file thực:

sudo unlink /etc/resolv.conf
echo -e "nameserver 8.8.8.8\nnameserver 1.1.1.1" | sudo tee /etc/resolv.conf

Bước 3: Khóa file để không có gì ghi đè lên nó:

sudo chattr +i /etc/resolv.conf

Bước 4: Khởi động lại WSL từ PowerShell — đóng terminal là chưa đủ:

wsl --shutdown

Mở lại terminal WSL và xác minh rằng cách sửa đã có tác dụng:

cat /etc/resolv.conf
nslookup github.com

Cách Sửa 3: VPN Đang Làm Hỏng Định Tuyến WSL2

Các VPN client thường xuyên chiếm đoạt bảng định tuyến và cắt đứt đường mạng của WSL2 đến máy host. Từ PowerShell (Administrator) trên Windows:

# Bật chuyển tiếp trên card mạng ảo WSL
Get-NetIPInterface | Where-Object {
  $_.InterfaceAlias -like '*WSL*'
} | Set-NetIPInterface -Forwarding Enabled

# Giảm metric để lưu lượng WSL được ưu tiên
Set-NetIPInterface -InterfaceAlias "vEthernet (WSL)" -InterfaceMetric 1

Sau đó tắt và khởi động lại WSL:

wsl --shutdown

Cisco AnyConnect đặc biệt hoàn nguyên các cài đặt này mỗi khi bạn kết nối lại. Trong trường hợp đó, hãy chạy các lệnh trên sau mỗi phiên VPN — hoặc đóng gói chúng trong một scheduled task kích hoạt khi mạng thay đổi.

Cách Sửa 4: Windows Firewall Đang Chặn DNS

Không có cách nào hoạt động cho đến nay? Windows Firewall có thể đang loại bỏ các gói UDP/TCP cổng 53 từ subnet WSL2. Thêm các quy tắc cho phép rõ ràng từ PowerShell (Administrator):

New-NetFirewallRule -DisplayName "WSL2 DNS UDP" `
  -Direction Inbound `
  -InterfaceAlias "vEthernet (WSL)" `
  -Action Allow -Protocol UDP -LocalPort 53

New-NetFirewallRule -DisplayName "WSL2 DNS TCP" `
  -Direction Inbound `
  -InterfaceAlias "vEthernet (WSL)" `
  -Action Allow -Protocol TCP -LocalPort 53

Xác Minh Cách Sửa

# Xác nhận DNS phân giải được
nslookup github.com

# Xác nhận HTTPS hoạt động đầu cuối
curl -s -o /dev/null -w "%{http_code}" https://google.com

# Kiểm tra toàn diện với package manager
sudo apt update

apt update chạy sạch sẽ nghĩa là bạn đã sửa hoàn toàn.

Mẹo

WSL2 nằm trên một subnet ảo (thường trong dải 172.16.0.0/12). Xung đột subnet VPN là nguyên nhân ẩn phổ biến của lỗi này — VPN của bạn chiếm một khối CIDR chồng chéo, và lưu lượng WSL2 định tuyến vào ngõ cụt không có DNS. Tôi dùng công cụ tính subnet của ToolCraft để nhanh chóng kiểm tra xem hai dải CIDR có chồng chéo không, giúp loại bỏ nhiều phỏng đoán trong các phiên debug như thế này.

Bài Học Kinh Nghiệm

  • Ping IP hoạt động, ping tên miền thất bại — luôn là DNS. Đừng mất thời gian debug TCP/IP khi nameserver mới là vấn đề.
  • Đặt generateResolvConf = false trong /etc/wsl.conf chủ động nếu bạn dùng VPN thường xuyên. Nó ngăn chặn vấn đề hoàn toàn.
  • Cờ chattr +i là cách thô nhưng đáng tin cậy để ngăn WSL2 tái tạo resolv.conf khi wsl.conf một mình không đủ.
  • Luôn khởi động lại WSL bằng wsl --shutdown từ PowerShell sau khi thay đổi cấu hình mạng. Đóng cửa sổ terminal không dừng VM WSL2.

Related Error Notes