在使用 WSL 2 时,为了更好的网络体验,我们需要为其配置代理。通常,我们宿主机是运行着代理软件的,因此我们可以让 WSL 2 使用宿主机代理。
WSL 2 与 WSL 1
从官方文档可以知道,WSL 2 使用 Hpyer-V 提供的轻量级虚拟机(VM)来运行 Linux 内核,这是与 WSL 1 最大的区别。在 WSL 1 中,可通过 localhost
访问宿主机。但在 WSL 2 中,使用 localhost
是无效的,得使用确切的宿主机 IP 地址。
在 WSL 2 中,宿主机 IP 地址存储在 /etc/resolv.conf
文件的 nameserver
字段。
# 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.20.128.1
我们可以执行以下命令,获取宿主机 IP 地址。
host_ip=$(cat /etc/resolv.conf | grep -oP '(?<=nameserver\ ).*')
访问宿主机代理
有了宿主机 IP 地址和宿主机代理端口地址,我们可通过设置 WSL 2 中的 http_proxy
、https_proxy
、all_proxy
环境变量,实现代理。但在此之前,我们需要在宿主机上开启代理软件的 Allow LAN
配置。
在宿主机上,我使用的是 Clash 代理,其代理协议为 socks5
,代理端口为 7890
。在 ~/.bash_profile
添加以下代码。
function proxy() {
host_ip=$(cat /etc/resolv.conf | grep -oP '(?<=nameserver\ ).*')
proxy_url="socks5://$host_ip:7890"
export http_proxy=$proxy_url
export https_proxy=$proxy_url
export all_proxy=$proxy_url
curl cip.cc
}
function unproxy() {
unset http_proxy
unset https_proxy
unset all_proxy
curl cip.cc
}
执行 source ~/.bash_profile
命令,即可通过执行 proxy
命令开启代理,通过执行 unproxy
命令关闭代理。
Windows 防火墙配置
WSL 2 执行 proxy
命令时,可能会出现“无法上网”的问题,这通常是 Windows 防火墙未添加白名单导致的。基于 VM 的 WSL 2 在网络上宿主机独立,因此根据 Windows 防火墙默认的策略,来自 WSL 2 的网络流量会被拦截,从而出现“无法上网”的问题。
防火墙配置白名单的具体步骤,可查看此文章。