适用于Linux的Windows子系统(WSL)是Windows的一项功能,可用于在Windows计算机上运行Linux环境,而无需单独的虚拟机或双重启动。 WSL旨在为想要同时使用Windows和Linux的开发人员提供无缝高效的体验
如图所示,我在WSL2中安装的是Fedora42子系统
获取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 | [ProxyList] |
配置好之后使用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