Skip to content

为WSL2配置代理的糟心事

约 764 个字 20 行代码 预计阅读时间 3 分钟

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 内容,没有的话就创建一下。

[network]
mirrored=true

然后重启 WSL2。

wsl --shutdown

等待一会,再启动你的 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"

重新加载一下配置文件。

source ~/.zshrc

等配置生效后,启用本地的代理软件,就可以测试一下 WSL2 是否已经接入代理了!

curl www.google.com

如果能获得到一堆html代码返回,那代理就生效了!

全局VPN

笨人学校信息技术中心用的是深信服的 aTrust 来实现校园网 VPN 代理,这沟槽的软件过于安全,用DNS劫持的方式来代理流量,对我的WSL2不管不顾呜呜。

所以我的方法是:靠Clash。

首先让 WSL2 把流量转发到 Clash 上,由 Clash 将其伪装为 Windows 的流量后,交给 aTrust 去转发流量。

所以一切的步骤和之前相同,在完成前一部分的内容后,你几乎不需要再做更多的配置了,只是需要为一些基本情况做调整。

首先我们要有 netcat 工具来获取代理信息。

sudo apt update && sudo apt get netcat -y

比如 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,然后使用相应服务。

ssh your_remote_server_name

大功告成!