为 WSL2 一键设置代理

WSL1 和 WSL2 网络的区别

在 WSL1 时代,由于 Linux 子系统和 Windows 共享了网络端口,所以访问 Windows 的代理非常简单。例如 Windows 的代理客户端监听了 8000 端口,那么只需要在 Linux 子系统中执行如下命令,就可以让当前 session 中的请求通过代理访问互联网:

1
export ALL_PROXY="http://127.0.0.1:8000"

但是 WSL2 基于 Hyper-V 运行,导致 Linux 子系统和 Windows 在网络上是两台各自独立的机器,从 Linux 子系统访问 Windows 首先需要找到 Windows 的 IP。

配置 WSL2 访问 Windows 上的代理

有两个关键步骤:

  1. WSL2 中配置的代理要指向 Windows 的 IP;

  2. Windows 上的代理客户端需要允许来自本地局域网的请求(Allow LAN);

由于 Linux 子系统也是通过 Windows 访问网络,所以 Linux 子系统中的网关指向的是 Windows,DNS 服务器指向的也是 Windows,基于这两个特性,我们可以将 Windows 的 IP 读取出来。

例如,在 Ubuntu 子系统中,通过 cat /etc/resolv.conf 查看 DNS 服务器 IP:

1
2
3
4
5
# 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.19.80.1

可以看到 DNS 服务器是 172.19.80.1,通过环境变量 ALL_PROXY 配置代理:

1
export ALL_PROXY="http://172.19.80.1:7897"

注:7890 是 Windows 上运行的代理客户端的端口,记得要在 Windows 代理客户端上配置允许本地局域网请求。

一键配置脚本

将上面的过程写入一个 bash 脚本,可以轻松实现一键配置代理:

1
2
3
#!/bin/bash
host_ip=$(cat /etc/resolv.conf |grep "nameserver" |cut -f 2 -d " ")
export ALL_PROXY="http://$host_ip:7897"

脚本说明:

  • 通过 cat /etc/resolv.conf 获取 DNS 服务器(即 Windows 的 IP)

  • 截取其中的 IP 部分,拼接代理客户端端口(可根据实际情况修改 7890)

  • 使用 export 写入环境变量

使用方法

  1. 下载脚本文件:.proxyrc(原文提供的下载链接)

  2. 在 WSL2 终端中执行以下命令生效:

1
source .proxyrc