适用于Linux的Windows子系统(WSL)是Windows的一项功能,可用于在Windows计算机上运行Linux环境,而无需单独的虚拟机或双重启动。 WSL旨在为想要同时使用Windows和Linux的开发人员提供无缝高效的体验

如图所示,我在WSL2中安装的是Fedora42子系统

image.png

获取windows宿主机ip

WSL2相比WSL1来说可以完美支持Docker。与WSL1的模拟Linux API不同的是,WSL2采用在Hyper-V虚拟机中运行的方案。可以说WSL2和原汁原味的Linux已经十分接近

在WSL1时代,由于Linux子系统和Windows共享了网络端口,所以访问Windows的代理非常简单。但是WSL2基于Hyper-V运行,导致Linux子系统和Windows在网络上是两台各自独立的机器,从Linux子系统访问Windows首先需要找到Windows的IP。

由于Linux子系统也是通过Windows访问网络,所以Linux子系统中的网关指向的是Windows,DNS服务器指向的也是Windows,基于这两个特性,我们可以将Windows的IP读取出来。

网上你会看到一些老教程,让你读取/etc/resolv.conf文件获取windows ip,这是因为在老版本的windows系统中,宿主机ip会在启动子系统时被写入该文件

1
cat /etc/resolv.conf

但从windows11版本22H2开始,WSL默认使用新的DNS隧道功能来处理请求,这一变化,导致 /etc/resolv.conf 中不再是准确的宿主机IP,而是如 10.255.255.254

在运行 Windows 11 22H2 及更高版本的计算机上,在 .wslconfig 文件中的 [wsl2] 下设置 dnsTunneling=true 可使 WSL 使用虚拟化功能来应答来自 WSL 内的 DNS 请求,而不是通过网络数据包请求它们。 此功能旨在提高与 VPN 和其他复杂网络设置的兼容性。

官方文档给出了新的获取windows宿主机ip的方法

1
ip route show | grep -i default | awk '{ print $3}'

我获取到的windows宿主机ip是172.26.0.1

使用proxychains走代理

先开启windows代理工具的Allow Lan模块,也就是允许局域网连接

WSL2中直接设置全局环境变量走代理不够灵活,推荐使用proxychains代理工具

proxychins是代理服务工具,可以在命令行中使用它代理各种命令,支持的协议有:http/https/socks4/socks5

1
sudo dnf install proxychains

使用前先修改proxychains配置文件

1
sudo vim /etc/proxychains.conf 

文件底部有默认的socks3 127.0.0.1 9050配置,根据代理软件的设置进行修改,我的是Clash Verge,默认socks5代理端口为1080

1
2
[ProxyList]  
socks5 127.0.0.1 1080

配置好之后使用proxychain就能走代理, 命令格式为proxychains4 command options,比如

1
proxychains curl www.google.com

补充

另一种查询windows宿主机的方式

获取windows宿主机ip除了使用官方提供的指令,还有另一种方法

就是先关闭 dnsTunneling,然后在 .wslconfig 文件中的 [wsl2] 下设置 dnsTunneling=false,关闭后可继续使用老版本获取方法

1
cat /etc/resolv.conf

但这种方法有点麻烦,况且我们有更好更快的方法 :D

更快捷的实现WSL走代理的方式

Clash Verge开启虚拟网卡模式即可,也就是所谓的TUN模式 :P