WSL2 默认使用 NAT 网络。Windows 代理监听在 127.0.0.1 时,WSL 无法直接访问,经常出现以下提示:
wsl: 检测到 localhost 代理配置,但未镜像到 WSL。 NAT 模式下的 WSL 不支持 localhost 代理。
可以将 WSL2 改为镜像网络模式,让 WSL 自动同步 Windows 系统代理。
环境要求
- Windows 11 22H2 及以上
- 使用 Microsoft Store 版本的 WSL
- WSL 版本支持镜像网络
配置镜像网络
在 Windows PowerShell 中执行:
@" [wsl2] networkingMode=mirrored autoProxy=true dnsTunneling=true firewall=true "@ | Set-Content -Encoding utf8 "$env:USERPROFILE\.wslconfig"
配置项说明:
networkingMode=mirrored:让 WSL 镜像 Windows 网络接口,可直接访问宿主机的localhost。autoProxy=true:自动同步 Windows 系统代理。dnsTunneling=true:通过 Windows 处理 DNS 查询,改善 VPN、代理和复杂网络下的域名解析。firewall=true:让 Windows 防火墙规则应用于 WSL。
重启 WSL
修改配置后,需要完全关闭 WSL:
wsl --shutdown
然后重新进入:
wsl
检查代理
进入 WSL 后执行:
env | grep -i proxy
代理同步成功时,可以看到类似输出:
http_proxy=http://127.0.0.1:10809 https_proxy=http://127.0.0.1:10809 HTTP_PROXY=http://127.0.0.1:10809 HTTPS_PROXY=http://127.0.0.1:10809
其中 10809 是 Windows 代理软件设置的本地端口,不同软件和配置可能使用不同端口。
测试网络:
curl -I --connect-timeout 10 https://www.baidu.com curl -I --connect-timeout 10 https://www.php.net
返回 200、301 或 302 等 HTTP 状态码,说明网络可用。
避免手动设置代理
启用 autoProxy 后,不要再向 ~/.bashrc 或 ~/.profile 写入固定代理:
export http_proxy=http://127.0.0.1:10809 export https_proxy=http://127.0.0.1:10809
固定配置无法感知 Windows 代理是否关闭。代理程序停止后,WSL 仍会尝试连接失效端口,导致普通网络也无法访问。
可以检查是否存在旧配置:
grep -nEi 'http_proxy|https_proxy|all_proxy' ~/.bashrc ~/.profile 2>/dev/null
代理关闭时的行为
使用镜像网络和自动代理后:
- Windows 系统代理开启时,WSL 自动使用宿主机代理。
- Windows 系统代理关闭时,WSL 使用直连网络。
- 不需要获取或写死 WSL NAT 模式下会变化的
172.*宿主机地址。 - WSL 已经运行时,Windows 代理状态不一定立即同步。
代理状态变化后如发现 WSL 网络异常,可以执行:
wsl --shutdown
重新进入 WSL,使代理配置再次同步。
还要确保代理软件退出时会关闭 Windows 系统代理。如果代理程序已经停止,但系统代理仍指向 127.0.0.1,WSL 同样会同步这个失效配置。



