WSL2网络不通排查记:NAT、代理和镜像模式
WSL2里curlgithub超时、apt更新失败,折腾了一晚上把网络模式理顺了。WSL2是跑在Hyper-V上的真虚拟机,网络和WSL1的进程级模拟完全不同,排查思路也要换。
默认NAT模式的坑
WSL2默认NAT:虚拟机有自己的内网网段(172.x),通过宿主NAT出网。两大痛点:宿主要访问WSL里的服务得用动态IP(每次重启变);WSL里的localhost代理失效——127.0.0.1在WSL2里是它自己,不是宿主。
代理软件只监听127.0.0.1时,WSL2里的请求根本到不了宿主。两个解法:代理软件开允许局域网连接,WSL里用宿主IP;或者上镜像模式。
镜像网络模式
Windows 11 22H2+和WSL 0.0.x起支持,WSL和宿主共享网络栈:
# %UserProfile%\.wslconfig
[wsl2]
networkingMode=mirrored
[experimental]
autoProxy=true # 自动继承宿主代理设置
dnsTunneling=true # DNS走虚拟化通道,解决DNS污染
firewall=true
sparseVhd=true
wsl --shutdown # 改配置后必须完全重启
wsl # 重新进入
镜像模式下localhost双向直通:WSL里起的服务宿主localhost直接访问,宿主的127.0.0.1:7890代理WSL里也能用,配合autoProxy几乎零配置。
常规排查清单
# WSL里诊断
cat /etc/resolv.conf # DNS指向是否正常
ping -c 2 1.1.1.1 # IP通不通
curl -v https://example.com # 看卡在DNS还是TCP
ip route # 默认网关
IP通、域名不通是DNS问题(dnsTunneling或手动改resolv.conf,注意WSL默认自动生成这个文件,要改先在wsl.conf禁用generateResolvConf)。IP都不通看wsl --shutdown重启虚拟交换机,还有宿主VPN的虚拟网卡抢占路由的情况,断VPN测试定位。
端口转发老方案
NAT模式下要稳定地从宿主访问WSL服务,得配转发:
$v = (wsl hostname -I).Trim().Split(' ')[0]
netsh interface portproxy add v4tov4 listenport=8080 connectaddress=$v connectport=8080
WSL重启IP变了就要重配,可以写个开机脚本自动化。镜像模式出来后这套基本可以退休。
版本建议
wsl --version看版本,保持更新(wsl --update)能省掉一半老问题。Docker Desktop的WSL后端、systemd支持(wsl.conf里systemd=true)都是新版福利。WSL2的网络曾是劝退重灾区,镜像模式后终于是「打开就能用」的状态了。
- 点赞
- 收藏
- 关注作者
评论(0)