马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
在 Windows 11 上用 WSL2 跑 Ubuntu,绝大多数网络问题都出在「两系统的网络栈互相看不见」:Windows 上的 127.0.0.1 指向 Windows 自己,WSL 里的 127.0.0.1 指向 WSL 自己,于是宿主机访问 WSL 服务、局域网设备访问 WSL 服务、VPN 环境下 DNS 解析,都会时好时坏。Windows 11 23H2 起,微软在 .wslconfig 里加入了 networkingMode=mirrored,让 WSL2 直接复用宿主机的网络配置,这一类问题基本一次性解决。本文按「配前检查 → 写配置 → 重启验证 → 排常见坑」的顺序说明。
一、先确认版本够不够
mirrored 模式对版本有硬性要求,版本不够时写了配置也不会生效。
- Windows:Windows 11 23H2 及以上(内部版本号 22631.3xxx 起)。
- WSL:2.0.0 及以上。
在 PowerShell 或命令提示符里查版本:
wsl --version
低于 2.0.0 就先升到预览通道再拉正式版本:
wsl --update --pre-release
wsl --update
二、写 .wslconfig
2.1 打开配置文件
.wslconfig 位于当前 Windows 用户家目录(也就是 C:\Users\你的用户名\)。直接用记事本打开编辑最省事:
notepad $env:USERPROFILE\.wslconfig
文件原本不存在也没关系,记事本保存时会自动新建。
2.2 逐项说明配置含义
[wsl2]
networkingMode=mirrored
dnsTunneling=true
autoProxy=true
firewall=true
[experimental]
autoMemoryReclaim=gradual
sparseVhd=true
hostAddressLoopback=true
每一项的作用如下:
networkingMode=mirrored:核心开关,WSL2 与 Windows 主机共享同一份网络配置,IP 与主机一致。
dnsTunneling=true:把 DNS 请求通过隧道交给宿主解析,VPN、公司内网这类复杂网络下尤其有用。
autoProxy=true:同步 Windows 里设置的代理到 WSL,开了浏览器代理却不知 WSL 里 apt 为何不走代理时,这项基本能解决。
firewall=true:纳入 Windows 防火墙管理,与 Windows Defender 防火墙规则联动。
hostAddressLoopback=true:允许通过主机局域网 IP 访问 WSL 中监听的服务。
autoMemoryReclaim 与 sparseVhd:内存渐进回收与虚拟硬盘稀疏分配,属于锦上添花的资源优化项。
三、重启 WSL2 并验证
写完配置必须 shutdown 一次,WSL 是按需启动的进程,不重启旧实例配置不会加载:
wsl --shutdown
等几秒再重新进入 Ubuntu,然后做两步验证。
3.1 看 IP 是否一致
ip addr
若 WSL 里的地址与主机在同一网段、甚至是同一个地址,说明镜像网络已生效。
3.2 测端口互通
在 WSL 里起一个临时 HTTP 服务:
python3 -m http.server 8000
然后在 Windows 浏览器打开 http://localhost:8000。能打开即为配置成功;这一步同时也覆盖了「宿主机访问 WSL 服务」这个最常见的需求。
四、常见坑与处理
4.1 局域网其他设备访问不了 WSL 服务
通常是 Hyper-V 防火墙拦了入站连接。放开默认入站动作:
Set-NetFirewallHyperVVMSetting -Name '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -DefaultInboundAction Allow
只想放行某一个端口更稳妥,规则粒度更细:
New-NetFirewallHyperVRule -Name "AllowPort8000" -DisplayName "Allow Port 8000" -Direction Inbound -VMCreatorId '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -Protocol TCP -LocalPorts 8000
4.2 Docker 容器里访问不到宿主机服务
容器网络与 WSL 网络在镜像模式下仍可能隔离,给 docker daemon 关掉 iptables 转发即可:
{
"iptables": false
}
随后重启 Docker 服务:
sudo service docker restart
4.3 端口被 Windows 占用
Windows 会 reserve 一段动态端口,和 Linux 常用端口撞车。调整动态端口范围即可让出区间:
netsh int ipv4 set dynamic tcp start=50000 num=15536
4.4 IPv6 地址通但用不上
镜像模式支持 IPv6,但 localhost 的 IPv6 地址(::1)并非所有服务都会监听,排查时优先用 IPv4 地址访问再判断。
五、几点提醒
- mirrored 模式下 WSL 不再有独立网段,原本依赖「给 WSL 单独配静态 IP」的脚本需要改掉。
- 开了
firewall=true 后,之前靠 Windows 出站放行才能用的服务,可能反而要补规则,改配置时留个心。
- 代理同步开启后,WSL 里的
apt、curl 会跟着走系统代理;代理不可用时会一起失败,排查时记得先 unset 相关环境变量。
- 遇到诡异现象,先看
.wslconfig 是否真在用户家目录、有没有写错段落名([wsl2] 与 [experimental] 不能合并)。
总之,WSL2 的镜像网络就是把「网络栈差异」这一步消除掉,配置本身并不复杂,难的是验证与排障。按上面三步走完,再对照常见坑逐条核对,绝大多数网络互通问题都能闭环。
qidao123.com企服评测-应用市场 编辑提示:本文所述命令均为 Windows 与 WSL 公开文档中常见做法的整理与归纳,未引用任何外部链接;不同 Windows 版本对 mirrored 模式的支持程度略有差异,请以本机实际版本为准进行验证。 |