WSL2设置代理

不同于 WSL1 网络可以与宿主机共享,WSL2 是基于 Hyper-v 虚拟机的,它拥有一个新的网段,所以简单地使用代理,允许来自局域网的连接的旧方法就不奏效了,需要额外获取宿主机的 IP 进行设置

查看宿主机 IP

/etc/resolv.conf 里就有保存的 IP,可以用下面的命令查看

1
cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }'

设置环境变量

1
2
3
export http_proxy='http://<Windows IP>:<Port>'
export https_proxy='http://<Windows IP>:<Port>'
export all_proxy='socks5://<Windows IP>:<Port>'

通常设置之后就可以让宿主机的代理软件监听指定的端口,来代理 WSL2 的请求了

但是本人实践下来,发现不能设置 export http_proxy='http://<Windows IP>:<Port>' 这条环境变量,不然会报错,原因尚不清楚……

而且有个最大的问题,就是 export 只在当前登录的终端生效,你退出重启一下就需要重新设置了,十分繁琐,所以我们用脚本帮我们执行这一过程

注:脚本改自 https://zinglix.xyz/2020/04/18/wsl2-proxy/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#!/bin/sh
hostip=$(cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }')
wslip=$(hostname -I | awk '{print $1}')
http_port=10809
socks5_port=10808 //此处的 10808 以及 10809 为 v2ray 的默认监听端口,请根据你的代理软件修改

PROXY_HTTP="http://${hostip}:${http_port}"
PROXY_SOCKS5="socks5://${hostip}:${socks5_port}"

set_proxy(){
export http_proxy="${PROXY_HTTP}"
export HTTP_PROXY="${PROXY_HTTP}"

export https_proxy="${PROXY_HTTP}"
export HTTPS_proxy="${PROXY_HTTP}"

export ALL_PROXY="${PROXY_SOCKS5}"
export all_proxy="${PROXY_SOCKS5}"
}

unset_proxy(){
unset http_proxy
unset HTTP_PROXY
unset https_proxy
unset HTTPS_PROXY
unset ALL_PROXY
unset all_proxy
}

test_setting(){
echo "Host IP:" ${hostip}
echo "WSL IP:" ${wslip}
echo "HTTP/HTTPS PROXY:" ${https_proxy}
echo "SOCKS PROXY:" ${all_proxy}
}

if [ "$1" = "set" ]
then
set_proxy

elif [ "$1" = "unset" ]
then
unset_proxy

elif [ "$1" = "test" ]
then
test_setting
else
echo "Unsupported arguments."
fi

使用方法( proxy.sh 为脚本名)

1
2
3
proxy.sh set       //设置代理     
proxy.sh unset //取消代理
proxy.sh test //查看状态

防火墙和代理软件设置

需要允许代理软件通过防火墙,另外代理软件也要放行来自局域网的连接,这里就不赘述了

补充

设置完后,可以用 curl -vv www.google.com 验证一下是否生效,另外在代理软件应该也能看到相应的请求。不过像 git 这类软件还是没有被正确代理,需要单独设置

1
2
3
# <Windows IP>和<Port>设置成你对应的
git config --global http.proxy 'socks5://<Windows IP>:<Port>'
git config --global https.proxy 'socks5://<Windows IP>:<Port>'

取消代理

1
2
git config --global --unset http.proxy
git config --global --unset https.proxy

END

参考:
https://zinglix.xyz/2020/04/18/wsl2-proxy/