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.confthủ 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 = falsetrong/etc/wsl.confchủ độ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 +ilà cách thô nhưng đáng tin cậy để ngăn WSL2 tái tạoresolv.confkhiwsl.confmột mình không đủ. - Luôn khởi động lại WSL bằng
wsl --shutdowntừ PowerShell sau khi thay đổi cấu hình mạng. Đóng cửa sổ terminal không dừng VM WSL2.

