WSL代理配置

1,262 阅读2分钟

在 WSL2 环境中,如果你想让 WSL2 使用 Windows 的代理客户端,可以按照以下步骤进行配置:

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

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

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

  2. 配置 WSL2 访问 Windows 上的代理:有两个关键步骤:

    • WSL2 中配置的代理要指向 Windows 的 IP。
    • Windows 上的代理客户端需要允许来自本地局域网的请求。

    你可以通过查看 /etc/resolv.conf 文件来获取 Windows 的 IP。例如,在 Ubuntu 子系统中,执行 cat /etc/resolv.conf 可以看到 DNS 服务器 IP。然后,通过环境变量 ALL_PROXY 配置代理,例如:

    export ALL_PROXY="http://172.19.80.1:7890"
    

    其中,7890 是 Windows 上运行的代理客户端的端口。记得在 Windows 代理客户端上配置允许本地局域网请求(关闭所有防护墙尝试ping 172.19.80.1)。

  3. wsl2懒人专享,自动写入代理

以下是一个简单的 bash 脚本,它会从 /etc/resolv.conf 中提取 IP 地址,并将其与端口 10809 一起写入 ~/.bashrc 以设置代理:

#!/bin/bash

# 提取 IP 地址
IP_ADDR=$(grep -oP 'nameserver \K[0-9.]+(?=\s|$)' /etc/resolv.conf)

# 检查是否成功提取 IP 地址
if [ -z "$IP_ADDR" ]; then
    echo "Error: Unable to extract IP address from /etc/resolv.conf"
    exit 1
fi

# 为代理设置定义模式和新值
PROXY_SETTINGS=("http_proxy" "https_proxy" "ftp_proxy" "socks_proxy" "ALL_PROXY")
NEW_VALUES=("http://$IP_ADDR:10809" "http://$IP_ADDR:10809" "http://$IP_ADDR:10809" "http://$IP_ADDR:10809" "http://$IP_ADDR:10809")

# 检查并替换或添加代理设置
for i in "${!PROXY_SETTINGS[@]}"; do
    SETTING="${PROXY_SETTINGS[$i]}"
    NEW_VALUE="${NEW_VALUES[$i]}"
    
    # 检查是否存在
    if grep -q "$SETTING=" ~/.bashrc; then
        # 替换现有的设置
        sed -i "s|${SETTING}=.*|${SETTING}=${NEW_VALUE}|" ~/.bashrc
    else
        # 添加新的设置
        echo "export ${SETTING}=${NEW_VALUE}" >> ~/.bashrc
    fi
done

echo "Proxy settings updated in ~/.bashrc successfully!"

# 在脚本中为变量赋值
http_proxy="http://$IP_ADDR:10809"
https_proxy="http://$IP_ADDR:10809"
ftp_proxy="http://$IP_ADDR:10809"
socks_proxy="http://$IP_ADDR:10809"
ALL_PROXY="http://$IP_ADDR:10809"

# 输出所有代理配置信息
echo "http_proxy: $http_proxy"
echo "https_proxy: $https_proxy"
echo "ftp_proxy: $ftp_proxy"
echo "socks_proxy: $socks_proxy"
echo "ALL_PROXY: $ALL_PROXY"


你可以将上述脚本保存为一个文件,例如 set_proxy.sh,然后给它执行权限并运行它:

chmod +x set_proxy.sh
./set_proxy.sh

这个脚本首先会从 /etc/resolv.conf 中提取 nameserver 后面的 IP 地址,然后将这个 IP 地址与端口 10809 一起写入 ~/.bashrc 文件中。