Windows设置WSL自动使用宿主机代理

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


返回 200301302 等 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 同样会同步这个失效配置。

发布评论
全部评论(0)