在 WSL2 中使用 Clash for Windows 代理连接

本文最后更新于 2024 年 9 月 2 日 中午

本文撰写时基于的系统是 Ubuntu 20.04/22.04, 如果你使用其他发行版,则下文中的部分步骤与实际情况可能有所出入。

因为网络问题,在 WSL2 中配环境时通常会非常缓慢甚至失败。在整合了各方资料及个人实践后,我总结了在 WSL2 中通过 Clash for Windows 连接代理的方法,供大家参考。

1. 在 Clash 客户端内的操作

打开客户端的允许局域网连接 (Allow LAN) 开关,如图 1 所示。
记录下客户端内的端口 (Port),如这里是 16514. 一般默认端口为 7890.
图 1

2. 配置

方法一

这个方法需要 Windows 11 22H2 和 WSL 2.0.5 及以上版本,如果你不满足版本要求,请参考方法二
你可以使用 winverwsl -v 查看你的 Windows 和 WSL 版本。

如果你使用这个方法,你需要确保 Clash 客户端中设置的系统代理类型为 HTTP 而不是 PAC,否则无法代理 HTTPS 请求:

如果你确实需要使用 PAC 模式,请参考方法二,在 shell 的配置文件中添加:

1
export https_proxy=$http_proxy

在 WSL 2.0.5 版本后,一些特性得以稳定,这里要用到的是镜像模式网络

C:\Users\<UserName>\.wslconfig 文件中 (如果不存在就手动创建一个) 加入以下内容:

1
2
[wsl2]
networkingMode=mirrored

WSL 2.3.11 版本新增了图形化配置界面 (WSL Settings),在网络 > 网络模式处选择 Mirrored 即可:

不过需要注意,shell 的配置文件中不能export http_proxy=....

方法二

WSL 2.2.1 版本以后默认启用了 DNS 隧道, 会导致该方法失效。你可以参照官方文档配置,在 C:\Users\<UserName>\.wslconfig 文件中 (如果不存在就手动创建一个) 加入以下内容以关闭 DNS 隧道:

1
2
[wsl2]
dnsTunneling=false

你可以执行 wsl -v 查看你的 WSL 版本。

这里默认你使用 bash, 如果你使用其他的 shell, 我相信你知道该改哪里。

编辑 .bashrc,在文件末尾根据第 1 步记录的数据,加入三行内容:

1
2
3
host_ip=$(cat /etc/resolv.conf |grep "nameserver" |cut -f 2 -d " ")
export http_proxy="http://$host_ip:[端口]"
export https_proxy="http://$host_ip:[端口]"

如图 2 所示,修改完后保存即可。
图 2

输入 source ~/.bashrc 使文件修改生效,可以通过输入 echo $http_proxy 验证修改是否成功。

3. 使 root 用户保留先前设置的环境变量

在使用 sudo 执行命令时,之前设置的环境变量并不会生效,需要进一步设置。
输入 sudo visudo, 加入以下内容并保存,如图 3-1 所示。

1
Defaults env_keep="http_proxy https_proxy"

图 3-1

如果你使用 Ubuntu 22.04, 则你看到的内容应与图 3-1 不同。如下图所示,取消相应行的注释 (删除行首的 #) 即可.
图 3-2

4. 测试

输入 wget www.google.com, 可以发现连接成功,至此大功告成,如图 4 所示。
图 4

参考资料

为 WSL2 一键设置代理 (zhihu.com)
sudo保持前用用户的env环境变量 (chenyudong.com, 已失效)


在 WSL2 中使用 Clash for Windows 代理连接
https://eastmonster.github.io/2022/10/05/clash-config-in-wsl/
作者
East Monster
发布于
2022年10月5日
许可协议