#WSL2设置代理
最近使用Windows子系统在编译openwrt时,无法使用代理进行上网,导致无法正常编译。本文解决如何让WSL2使用Windows的代理
WSL1与WSL2#
在 WSL1 时代,由于 Linux 子系统和 Windows 共享了网络端口,所以访问 Windows 的代理非常简单。只需要在 Linux 子系统中执行如下命令,就可以让子系统中的请求通过代理访问互联网。
export ALL_PROXY=“http://127.0.0.1:8000”
但是 WSL2 基于 Hyper-V 运行,导致 Linux 子系统和 Windows 在网络上是两台各自独立的机器,从 Linux 子系统访问 Windows 首先需要找到 Windows 的 IP。
配置 WSL2 访问 Windows 上的代理#
- WSL2 中配置的代理要指向 Windows 的 IP;
由于 Linux 子系统也是通过 Windows 访问网络,所以 Linux 子系统中的网关指向的是 Windows,DNS 服务器指向的也是 Windows,基于这两个特性,我们可以将 Windows 的 IP 读取出来。
通过 cat /etc/resolv.conf
查看 DNS 服务器 IP
1
2
3
4
5
|
$ cat /etc/resolv.conf
# 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 172.23.16.1
|
- Windows 上的代理客户端需要允许来自本地局域网的请求;
可以看到 DNS 服务器是 172.23.16.1,通过环境变量 ALL_PROXY 配置代理:
export ALL_PROXY="http://172.23.16.1:4780"
4780 是 Windows 上运行的代理客户端的端口,记得要在 Windows 代理客户端上配置允许本地局域网请求。
配置脚本#
将上面的过程写入一个 bash 脚本,可以轻松的实现一键配置代理
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
|
#!/bin/sh
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(){
#设置http与https代理
export http_proxy="${PROXY_HTTP}"
export https_proxy="${PROXY_HTTP}"
# 设置git代理
git config --global http.proxy "${PROXY_HTTP}"
git config --global https.proxy "${PROXY_HTTP}"
}
unset_proxy(){
unset http_proxy
unset HTTP_PROXY
unset https_proxy
unset HTTPS_PROXY
git config --global --unset http.proxy
git config --global --unset https.proxy
}
test_setting(){
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" = "test" ]
then
test_setting
else
echo "Unsupported arguments."
fi
|
第 4 行 记得换成自己宿主机代理的端口
运行的时候不要忘记之前的 .,或者使用 source ./proxy.sh set,只有这样才能够修改环境变量
另外可以在 ~/.bashrc 中选择性的加上下面两句话,记得将里面的路径修改成你放这个脚本的路径。
1
2
|
alias proxy="source /path/to/proxy.sh"
. /path/to/proxy.sh set
|