WSL2 访问宿主机代理:获取正确 IP 的几种方式

在 WSL2 里配置代理,绕不开的问题是:WSL2 和 Windows 宿主机不共享网络栈,WSL2 的 IP 每次启动都可能变化,宿主机的 IP 同样如此。

常见的方案是解析 /etc/resolv.conf 里的 nameserver:

1
2
3
hostip=$(cat /etc/resolv.conf | grep -oP '(?<=nameserver ).*')
export http_proxy="http://${hostip}:7890"
export https_proxy="http://${hostip}:7890"

这个方案在多数情况下能用,但不可靠——/etc/resolv.conf 里的 nameserver 可能是公网 DNS(比如 223.5.5.5),而不是 vEthernet 网关。遇到自定义 DNS 配置时会失效。


更可靠的方式

方式一:通过 wsl.exe 调用 Windows 命令

1
hostip=$(wsl.exe hostname -I | awk '{print $1}')

wsl.exe hostname -I 返回的是 WSL 实例自身的 IP,对于访问宿主机代理来说,要取的是 vEthernet (WSL) 网卡的地址,这个命令返回的是 WSL 侧的地址,不是宿主机侧的,用它来指向代理可能方向反了。

方式二:通过 ipconfig.exe 精确获取 vEthernet 地址

1
2
3
hostip=$(ipconfig.exe | grep 'vEthernet (WSL)' -A4 | grep 'IPv4' | awk '{print $NF}' | tr -d '\r')
export http_proxy="http://${hostip}:7890"
export https_proxy="http://${hostip}:7890"

这个方案直接从 Windows 的 ipconfig 输出里提取 vEthernet (WSL) 网卡的 IPv4 地址,也就是宿主机在 WSL 虚拟网络里的实际 IP。结果稳定,不依赖 DNS 配置。


Windows 11 的新选项

Windows 11 22H2 以后,WSL2 支持 mirrored networking mode,直接在 %USERPROFILE%/.wslconfig 里加:

1
2
[wsl2]
networkingMode=mirrored

开启后,WSL2 和宿主机共享同一个网络栈,localhost 直接通,不再需要动态获取 IP。代理配置直接用 127.0.0.1 即可。这是根本上解决问题的方式,如果 Windows 版本支持,优先考虑。


WSL2 访问宿主机代理:获取正确 IP 的几种方式
https://www.krli.org/2023/02/28/在WSL2中获取宿主机IP/
作者
李科燃
发布于
2023年2月28日
许可协议