wsl_proxy
配置 WSL2 代理上网
补充说明
WSL2 使用虚拟交换机网络,IP 地址随每次重启动态变化,导致 Windows 宿主机的代理工具(如 Clash、V2Ray)无法直接共享给 WSL2。本教程提供 WSL2 代理配置的完整方案,支持 HTTP/HTTPS/SOCKS5 代理自动适配宿主机 IP。
功能特点
- 自动获取宿主机 IP:脚本动态检测 Windows 宿主 IP,无需手动配置
- 支持多种代理协议:HTTP/HTTPS/SOCKS5 全覆盖
- 持久化配置:写入 ~/.bashrc,每次登录自动生效
- 一键开关:提供启用/禁用代理快捷命令
- 兼容主流代理工具:Clash、V2Ray、SSR 等
主要章节
| 章节 | 内容 |
|---|---|
| 原理说明 | WSL2 网络架构与代理原理 |
| 手动配置 | 临时设置代理环境变量 |
| 自动配置脚本 | 一键配置持久化代理 |
| 代理工具配置 | 允许局域网连接 |
| 常见问题 | 故障排查 |
注意事项
- 代理客户端需开启「允许局域网连接」
- 宿主机 IP 每次重启 WSL 会变化,建议使用自动获取脚本
- Windows 防火墙可能拦截连接,需放行代理端口
原理说明
WSL2 网络架构:
Windows 宿主机 (192.168.1.x / 172.x.x.x)
↕ 虚拟交换机
WSL2 实例 (172.x.x.x)
WSL2 通过 /etc/resolv.conf 中的 nameserver 可获取 Windows 宿主机的虚拟交换机 IP,代理客户端监听在 Windows 的某个端口(如 7890),WSL2 通过宿主机 IP + 端口访问代理。
手动配置代理
获取宿主机 IP
在 WSL2 中执行:
# 方法一:从 resolv.conf 获取
cat /etc/resolv.conf | grep nameserver | awk '{print $2}'
# 方法二:使用 hostname
ip route | grep default | awk '{print $3}'
临时设置代理
# 宿主机 IP(替换为实际值)
export host_ip=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}')
# HTTP/HTTPS 代理
export http_proxy="http://$host_ip:7890"
export https_proxy="http://$host_ip:7890"
# SOCKS5 代理
export all_proxy="socks5://$host_ip:7890"
# 测试代理是否生效
curl -I https://www.google.com
自动配置脚本
一键配置脚本
将以下内容添加到 ~/.bashrc:
# WSL2 代理配置
function set_proxy() {
local host_ip=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}')
local proxy_port=${1:-7890}
export http_proxy="http://$host_ip:$proxy_port"
export https_proxy="http://$host_ip:$proxy_port"
export all_proxy="socks5://$host_ip:$proxy_port"
export HTTP_PROXY=$http_proxy
export HTTPS_PROXY=$https_proxy
export ALL_PROXY=$all_proxy
echo "Proxy enabled: http://$host_ip:$proxy_port"
}
function unset_proxy() {
unset http_proxy https_proxy all_proxy
unset HTTP_PROXY HTTPS_PROXY ALL_PROXY
echo "Proxy disabled"
}
function test_proxy() {
echo "Testing proxy connectivity..."
curl -s -o /dev/null -w "HTTP: %{http_code}\n" https://www.google.com
curl -s -o /dev/null -w "HTTPS: %{http_code}\n" https://www.google.com
}
# 默认启用代理(可选,取消注释以启用)
# set_proxy
使配置生效
source ~/.bashrc
# 启用代理(默认端口 7890)
set_proxy
# 指定端口
set_proxy 10809
# 测试
test_proxy
代理开关命令
| 命令 | 说明 |
|---|---|
set_proxy |
启用代理(默认端口 7890) |
set_proxy 10809 |
指定端口启用代理 |
unset_proxy |
禁用代理 |
test_proxy |
测试代理连通性 |
代理工具配置
Clash
Clash 需开启「允许局域网连接」:
- 打开 Clash 配置文件
- 确保
allow-lan: true - 确保
bind-address: "0.0.0.0" - 检查端口:
port: 7890(HTTP)和socks-port: 7891
V2Ray
V2Ray 客户端需开启局域网监听:
- 打开 V2Ray 设置
- 启用「允许来自局域网的连接」
- 确保监听地址为
0.0.0.0
Windows 防火墙设置
如果连接失败,检查防火墙:
# 添加防火墙规则放行端口
New-NetFirewallRule -DisplayName "WSL Proxy" -Direction Inbound -Protocol TCP -LocalPort 7890,7891 -Action Allow
配置 APT 使用代理
如果仅需 apt 通过代理:
# 临时使用
sudo apt -o Acquire::http::proxy="http://$host_ip:7890" update
# 永久配置
echo 'Acquire::http::proxy "http://$host_ip:7890";' | sudo tee /etc/apt/apt.conf.d/proxy
echo 'Acquire::https::proxy "http://$host_ip:7890";' | sudo tee -a /etc/apt/apt.conf.d/proxy
配置 Git 使用代理
# HTTP/HTTPS
git config --global http.proxy http://$host_ip:7890
git config --global https.proxy http://$host_ip:7890
# 仅对 GitHub 使用代理
git config --global http.https://github.com.proxy http://$host_ip:7890
# 取消代理
git config --global --unset http.proxy
配置 npm/yarn 使用代理
# npm
npm config set proxy http://$host_ip:7890
npm config set https-proxy http://$host_ip:7890
# yarn
yarn config set proxy http://$host_ip:7890
yarn config set https-proxy http://$host_ip:7890
常见问题
连接被拒绝
# 检查宿主机 IP
echo $host_ip
# 测试端口连通性
curl -v http://$host_ip:7890
# 确认代理客户端允许局域网连接
IP 获取失败
如果 cat /etc/resolv.conf 无法获取 IP:
# 使用 ip route 替代
host_ip=$(ip route | grep default | awk '{print $3}')
Windows 防火墙阻止
在 PowerShell 中临时关闭防火墙测试:
# 关闭防火墙(测试用)
New-NetFirewallRule -DisplayName "WSL Proxy Allow" -Direction Inbound -Protocol TCP -LocalPort 7890 -Action Allow
代理仅对当前 shell 生效
确保将 set_proxy 添加到 ~/.bashrc 或 ~/.zshrc 中,否则每次新开终端都需要重新执行。
验证配置
# 测试 Google 连通性
curl -I https://www.google.com
# 查看公网 IP
curl -s https://ipinfo.io/json
# 测试 pip 安装
pip install requests
# 测试 git 克隆
git clone https://github.com/torvalds/linux.git /tmp/test-linux
参考链接
相关命令
- wsl
- wsl_proxy 👈 当前所在位置
- wsl_systemd