为WSL2配置代理的糟心事
WSL2在网络架构上采用了基于 Hyper-V 的虚拟化 NAT 模式,创建了一个虚拟网卡,将WSL2的网络系统与宿主机隔离开来。
从某种意义上这是WSL2为什么成功的一部分原因,但从各种意义上都是对我这种想给WSL2配置网络代理的计网低手er的地狱级折磨。
以下介绍如何为WSL2配置代理软件(以Clash for Windows为例)和全局VPN(校园网VPN与企业VPN)。
代理软件
以 Clash 为代表的一系列代理软件通常只能照顾到Windows的网络流量,对于建立了虚拟网卡的WSL2来说,Clash在Rule模式下不会在意这部分流量,使得WSL2吃不到VPN。
以往我的解决方案是暴力启用Global全局转发,为此不小心干爆过不少次套餐流量……
实际上有更优雅的解决方法,第一步就是启用 Clash 的 Allow LAN,这将 Clash 的监听范围从本机 127.0.0.1 扩展到全局 0.0.0.0,这使得 WSL2 的流量可以被 Clash 注意到。
第二步是同步网络接口,也就是让 WSL2 与 Windows 对其颗粒度,在 Windows 下修改文件 ~/.wslconfig 内容,没有的话就创建一下。
然后重启 WSL2。
等待一会,再启动你的 Linux 发行版,此时 WSL2 就已经知道当前宿主机的网络接口配置了。
接下来我们要让 WSL2 知道走哪条代理,在 Shell 配置文件 (.bashrc/.zshrc) 下配置如下脚本。
# --- WSL2 Proxy Configuration (Mirrored Mode) ---
# 更可靠地获取 Windows 主机 IP 的方法
export HOST_IP=$(ip route | grep default | awk '{print $3}')
# 你的代理端口号 (请根据你的软件实际情况修改)
export PROXY_PORT=7890
# 设置代理环境变量
export http_proxy="http://${HOST_IP}:${PROXY_PORT}"
export https_proxy="http://${HOST_IP}:${PROXY_PORT}"
export all_proxy="socks5://${HOST_IP}:${PROXY_PORT}"
# 你可以添加不走代理的地址
export no_proxy="localhost,127.0.0.1"
重新加载一下配置文件。
等配置生效后,启用本地的代理软件,就可以测试一下 WSL2 是否已经接入代理了!
如果能获得到一堆html代码返回,那代理就生效了!
全局VPN
笨人学校信息技术中心用的是深信服的 aTrust 来实现校园网 VPN 代理,这沟槽的软件过于安全,用DNS劫持的方式来代理流量,对我的WSL2不管不顾呜呜。
所以我的方法是:靠Clash。
首先让 WSL2 把流量转发到 Clash 上,由 Clash 将其伪装为 Windows 的流量后,交给 aTrust 去转发流量。
所以一切的步骤和之前相同,在完成前一部分的内容后,你几乎不需要再做更多的配置了,只是需要为一些基本情况做调整。
首先我们要有 netcat 工具来获取代理信息。
比如 SSH,它并不会遵循我们设定的 Linux 系统代理规则,我们需要特别指定其使用代理转发,这需要修改 ~/.ssh/config 文件。
# 以下是一个示范,具体内容需要根据你的实际情况填写
Host your_remote_server_name
HostName remote_IP
User username
Port 22
# 最关键的一行,用来获取代理信息
ProxyCommand nc -X 5 -x $(ip route | grep default | awk '{print $3}'):7890 %h %p
在本地启用全局VPN与 Clash,然后使用相应服务。
大功告成!