在使用WSL1时,由于Linux子系统和Windows共享网络端口,所以在Windows开代理时,Linux子系统也可以共享,但是WSL2使用虚拟化运行Linux内核,也有自己独立的网络端口,所以无法像WSL1一样轻松使用代理,本文记录解决这一问题的过程。
WSL1使用代理
如上文所说,WSL1与Windows共享网络端口,所以只需要设置代理指向本地回环地址的代理端口,即可使用代理:(例如Windows上的代理端口为1080)
export ALL_PROXY="http://127.0.0.1:1080"
- 但是WSL2基于Hyper-V运行,所以Linux子系统和Windows在网络上是两座孤岛,需要一个小船来互通。
WSL2使用代理
基本原理&可能遇到的问题
需要马上使用的小伙伴可以跳到配置代理脚本部分直接食用(在这一部分先多叨叨一些~)
- 从WSL2访问Windows
要想从Linux子系统(孤岛A)通向Windows宿主机(孤岛B),从WSL2发出网络请求到Windows(从孤岛A派出小船到孤岛B),首先需要知道Windows的IP地址(孤岛B的停靠码头)。
由于Windows在开启WSL2时配置了相关路由(已知了小船航行的地图),所以在大多数情况下,只要知道Windows的IP地址(停靠码头),就可以访问成功。在windows终端中输入ipconfig
可查看windows相关IP地址(我们需要的是WSL相关的)。从Linux子系统中ping
该地址,可以成功通信。
- WSL2若无法从局域网与Windows通信
但是,Windows一些版本的防火墙会从中作梗,使得从子系统发出的请求被防火墙挡住,无法到达Windows(从WSL2出发的小船被海防误认为外来入侵)。这时我们会发现从WSL2中ping
不通上图中的Windows的IP172.17.240.1
,所以我们需要告诉防火墙,让从WSL2发来的请求通过。可使用如下命令给防火墙建立一条入站规则
(需要以管理员身份运行cmd或powershell,创建规则默认名称为WSL,在下一个图片中可见):
New-NetFirewallRule -DisplayName "WSL" -Direction Inbound -InterfaceAlias "vEthernet (WSL)" -Action Allow
- WSL2若无法访问代理端口
此外,当我们可以从WSL2与Windows进行通信后,还可能无法访问Windows的代理端口(可使用telnet
命令访问),这也是因为防火墙将向相关端口的网络请求挡住了,需要我们手动添加防火墙入站规则。
在控制面板->系统和安全->Windows Defender防火墙->高级设置(左边栏)->入站规则 :
- 右边栏点击
新建规则
-> 规则类型
选择端口(O) ->- 规则应用于**TCP **&& 规则应用于特定端口(输入自己的代理端口,比如我的是10080) ->
- 进行操作:允许连接 -> 配置文件直接下一页 -> 名称自行填写
此时我们从WSL2使用telnet
命令访问Windows代理端口,可以访问成功:
配置代理脚本
- 在Linux子系统中获取Windows的IP地址,可使用如下命令:
cat /etc/resolv.conf | grep "nameserver" | cut -f 2 -d " "
比如这里我们获取Windows的IP为172.17.240.1
- 用获取的IP地址(此处以我的代理端口10080为例)导出全局代理变量
$ALL_PROXY
export ALL_PROXY="http://172.17.240.1:10080"
- 综合成一个可以快速执行的脚本(注意在
=
前后不要乱加空格):
# ~/.proxyrc
export host_ip=$(cat /etc/resolv.conf | grep "nameserver" | cut -f 2 -d " ")
export ALL_PROXY="http://$host_ip:10080"
# 由于WindowsIp会变化,这里顺便一次性配置git的代理(只对github做代理,节省机场流量)
git config --global http.https://github.com.proxy http://$host_ip:10080
git config --global https.https://github.com.proxy http://$host_ip:10080
可将该脚本存作~/.proxyrc
文件,执行时使用source ~/.proxyrc
即可
- 遇到问题请回到上一部分~~
- 排除问题思路:
- 先使用
ping
测试WSL2与Windows是否可网络通信 - 再使用
telnet
命令测试对应端口是否可正常通信
- 先使用