WSL2内使用Windows的v2ray代理

在WSL2中使用install或git命令是总是因为网速问题失败,我们在部署配置环境时就最好需要使用代理,但WSL2 因为是通过虚拟机的方式实现,网络不再像 WSL1 一样与 Windows 共享,变成了一个新的网段,所以想使用宿主机的代理就比较麻烦,这里参考网上资料这里给出设置方法。

一、Windows内设置

v2ray客户端开启允许来自局域网的连接

v2ray客户端开启允许来自局域网的连接

二、WSL2内设置

1. 修改DNS服务器地址

修改由于使用代理不能再通过宿主机IP获取nameserver,这里在/etc/resolv.conf直接设置nameserver为GoogleDNS地址8.8.8.8或者其他可用的dns服务器地址。

1
2
3
4
5
# This file was automatically generated by WSL. To stop automatic generation of this file, add the following entry to /etc/wsl.conf:
# [network]
# generateResolvConf = false

nameserver 8.8.8.8

根据此注释可以看到这个文件是由 WSL 自动生成的。也就是每次自动生成就会覆盖掉我们对nameserver的修改,要停止自动生成此文件要在/etc/wsl.conf中设置generateResolvConffalse

1
2
[network]
generateResolvConf = false

2. 获取主机IP并设置代理

WSL2 会在首次启动时创建一个虚拟网卡用于提供 WSL2 的网络,默认情况下这个网段是动态,这里我们使用ip route命令在网络路由信息中找到主机在WSL2中映射的IP地址。

ip route

有了主机IP之后我们就可以通过v2ray中设置的端口设置代理了(v2ray中默认本地监听端口为10808

1
2
export http_proxy='socks5://主机IP:<Port>'
export https_proxy='socks5://主机IP:<Port>'

设置完之后可以用curl -v google.com测试下。

3. 编辑bashrc配置文件实现代理命令

在主目录中找到bash的隐藏配置文件.bashrc,在文件后面加入以下代码,后面就可以使用proxy命令和unproxy命令实现代理或取消代理。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

# add for proxy
# add for proxy
export hostip=$(ip route | grep default | awk '{print $3}')
export hostport=10808
alias proxy='
export HTTPS_PROXY="socks5://${hostip}:${hostport}";
export HTTP_PROXY="socks5://${hostip}:${hostport}";
export ALL_PROXY="socks5://${hostip}:${hostport}";
git config --global http.proxy "socks5://${hostip}:${hostport}";
git config --global https.proxy "socks5://${hostip}:${hostport}";
echo -e "Acquire::http::Proxy \"http://${hostip}:${hostport}\"; " | sudo tee -a /etc/apt/apt.conf.d/proxy.conf;
echo -e "Acquire::https::Proxy \"http://${hostip}:${hostport}\"; " | sudo tee -a /etc/apt/apt.conf.d/proxy.conf;
'
alias unproxy='
unset HTTPS_PROXY;
unset HTTP_PROXY;
unset ALL_PROXY;
git config --global --unset http.proxy;
git config --global --unset https.proxy;
sudo sed -i -e '/Acquire::http::Proxy/d' /etc/apt/apt.conf.d/proxy.conf;
sudo sed -i -e '/Acquire::https::Proxy/d' /etc/apt/apt.conf.d/proxy.conf;
'

三、测试效果

用户对 bashrc 所作的任何更改将在您下次启动终端时应用,如果想立即生效可以手动执行如下命令刷新:

1
source ~/.bashrc

重启终端或刷新配置文件后

测试效果

四、错误排查

如果配置不起作用或报错需排查以下:

1. DNS服务器地址设置错误

ping youtube.com 测试是否解析出IP(解析出IP之后最后全部丢包没关系,只要解析出域名对应的IP),否则需要验证是否正确配置DNS服务器地址。

2. 环境变量是否正确导出

通过输出echo $HTTP_PROXY查看环境变量是否正确导出

3. 防火墙是否开启

如在WSL2中ping主机不通,需在Windows系统中检查防火墙和网络保护界面中的防火墙设置,是否允许应用通过防火墙。

4. 主机端v2ray是否可用

如果检查各项配置都确认正确需检查主机端v2ray是否正常可用,可在windows terminal下运行curl youtube.com验证。

5. /etc/resolv.conf重启丢失

如果之前代理正常,WSL2重启之后代理不可用,需检查/etc/resolv.conf文件是否丢失或被重置为默认。
造成这种情况的原因有很多,但在WSL中大概率是被系统重置了,我们这里直接使用resolvconfig应用实现DNS信息管理

1
apt-get install resolvconf

安装后配置/etc/resolvconf/resolv.conf.d/base文件

1
nameserver 8.8.8.8

配置好后使用resolvconf -u更新resolvconf应用并使用下面命令查看并启动服务。

1
2
service resolvconf start
service --status-all

或直接配置好/etc/resolv.conf文件后使用chattr命令改变其文件属性不得任意更动文件。

1
2
3
4
5
sudo rm /etc/resolv.conf
sudo bash -c 'echo "nameserver 8.8.8.8" > /etc/resolv.conf'
sudo bash -c 'echo "[network]" > /etc/wsl.conf'
sudo bash -c 'echo "generateResolvConf = false" >> /etc/wsl.conf'
sudo chattr +i /etc/resolv.conf