在使用 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_proxyhttps_proxyall_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 的网络流量会被拦截,从而出现“无法上网”的问题。

防火墙配置白名单的具体步骤,可查看此文章

参考资料