之前耕读君写过一篇关于 WSL 应用安装时报 0x80071772 错误的博文,今天就来解决另一个 WSL 常见的错误 —— wsl: 检测到 localhost 代理配置,但未镜像到 WSL。NAT 模式下的 WSL 不支持 localhost 代理。
原因分析
很多用户都会在 Windows 上使用一些神秘软件,需要更改 Windows 的系统代理,就导致了 WSL 上出现这个错误。具体原因如下:
你的 Windows 主机上设置了一个本地(localhost)代理,比如 127.0.0.1:1080,但这个代理配置没有正确同步到 WSL 里的 Linux 子系统,而在 WSL 的 NAT 网络模式下,localhost
(127.0.0.1)在 WSL 和 Windows 主机是隔离的。
通俗一点说:
- Windows 主机的
127.0.0.1
是 Windows 的回环地址。 - WSL2 里的
127.0.0.1
是 WSL 虚拟机内部的回环地址,不是 Windows 主机的地址! - NAT 网络意味着 WSL 和 Windows 主机通过虚拟网卡通信,它们的
localhost
不是同一个。 - 你如果在 WSL 里直接连接
127.0.0.1:1080
,实际上是连到 WSL 自己,而不是 Windows 的代理服务。 - 所以系统警告你:这种配置在 NAT 模式(WSL2 默认就是 NAT)下不能直接用,需要额外处理。
解决方案
当前大多数用户都在使用 WSL2,因此我们可以利用 WSL 全局配置文件这项实验特性来解决。
操作方法是在用户目录,即 C:\Users\你的用户名
下创建一个 .wslconfig
文件,内容为:
[experimental]
autoMemoryReclaim=gradual
networkingMode=mirrored
dnsTunneling=true
firewall=true
autoProxy=true
保存文件后,在终端执行 wsl --shutdown
命令关闭 WSL,再重新打开安装的 WSL 应用(如 Ubuntu 22.04)来重启 WSL,这个提示就消失了。
考虑到你可能好奇配置文件里的内容都做了什么,以下具体解析——
配置项 | 含义 | 备注 |
---|
autoMemoryReclaim=gradual | 自动回收 WSL 内存,让 WSL 不再一直占用很多内存(渐进式回收)。 | 和代理无关,是优化内存用的。 |
networkingMode=mirrored | 网络镜像模式:让 WSL2 的网络直接“镜像” Windows 的网络环境,包括 localhost。 | 关键点!让 WSL 的 localhost 和 Windows 主机的 localhost 指向同一套网络,不再隔离。 |
dnsTunneling=true | DNS 请求通过 Windows 主机发送,避免 DNS 污染和解析错误。 | 辅助作用,和代理有关联。 |
firewall=true | WSL 网络流量经过 Windows 防火墙,可以统一控制。 | 安全增强,跟提示没直接关系。 |
autoProxy=true | 自动同步 Windows 的系统代理设置到 WSL 环境里。 | 关键点!自动把 Windows 的代理(比如 127.0.0.1:1080)配置到 WSL,不需要手动设置 http_proxy 。 |