WSL2 使用宿主机的代理

Posted by Novo on September 15, 2023

由于 WSL1 中 Linux 子系统和宿主机是共享网络的,所以使用宿主机的代理只需要将代理设置成 http://127.0.0.1:port 即可。但是 WSL2 基于 Hyper-V 运行,导致 Linux 子系统和 Windows 在网络上是两台各自独立的机器,从 Linux 子系统访问 Windows 首先需要找到 Windows 的 IP。而且每次启动 WSL IP 都会变动,并且在学校中宿主机 IP 也会变,所以每次重新启动后都要重新设置一下很麻烦,可以通过脚本来开启 / 关闭代理。

WSL 中获取宿主机 IP

WSL2 会把 IP 写在 /etc/resolv.conf 中,因此可以用 cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }' 这条指令获得宿主机 IP 。

WSL2 自己的 IP 可以用 hostname -I | awk '{print $1}' 得到。

image-20231015171655503

代理软件打开 Allow LAN

代理软件中设置允许来自局域网的连接。以 Clash 为例:

image-20231015171828263

防火墙设置

放行代理的请求,或者直接关闭防火墙。

手动设置代理

1
2
3
4
5
export http_proxy='http://<Windows IP>:<Port>'
export https_proxy='http://<Windows IP>:<Port>'
# 设置 git 代理
git config --global http.proxy "${http_proxy}"
git config --global https.proxy "${http_proxy}"

脚本设置代理

脚本第 4 行 <PORT> 记得换成自己宿主机代理的端口,clash 默认代理端口是 7890

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
#!/bin/bash
hostip=$(cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }')
wslip=$(hostname -I | awk '{print $1}')
port=<PORT>

PROXY_HTTP="http://${hostip}:${port}"

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

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

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

proxy_info(){
    echo "Host ip:" ${hostip}
    echo "WSL ip:" ${wslip}
    echo "Current proxy:" $https_proxy
}

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

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

elif [ "$1" = "info" ]
then
    proxy_info
else
    echo "Unsupported arguments."
fi

如果希望 git 也能通过代理,可以分别在 set_proxyunset_proxy 函数中加上如下命令

1
2
3
4
5
6
7
# 添加代理
git config --global http.proxy "${PROXY_HTTP}"
git config --global https.proxy "${PROXY_HTTP}"

# 移除代理
git config --global --unset http.proxy
git config --global --unset https.proxy

之后运行 . ./proxy.sh set 就可以自动设置代理了。unset 可以取消代理,info 可以查看代理状态,能够用来检查环境变量是否被正确修改。

运行的时候不要忘记之前的 .,或者使用 source ./proxy.sh set,只有这样才能够修改环境变量

直接运行例如 ./proxy.sh set 或者 sh proxy.sh set,这样会是运行在一个子 shell 中,对当前 shell 没有效果

另外可以在 ~/.bashrc 中选择性的加上下面两句话,记得将里面的路径修改成你放这个脚本的路径

1
2
alias proxy="source /path/to/proxy.sh"
. /path/to/proxy.sh set

第一句话可以为这个脚本设置别名 proxy,这样在任何路径下都可以通过 proxy 命令使用这个脚本了,之后在任何路径下,都可以随时都可以通过输入 proxy unset 来暂时取消代理。

第二句话就是在每次 shell 启动的时候运行该脚本实现自动设置代理,这样以后不用额外操作就默认设置好代理啦~

验证代理

curl 一下 google,如果代理成功,则有网页返回,并且可以在代理软件中查看到日志。

这里不能用 ping 命令测试,因为 ping 用的是 ICMP 协议,而一般的代理只接管 TCP、UDP 以上的流量。

1
curl google.com

image-20231015173353122

image-20231015173435001