版本: 1.0.0 | 适用系统: Debian 11/12 / Ubuntu 20.04/22.04/24.04 | 协议栈: IPv4 + IPv6 双栈 VPS
本项目是一个完整的 IPv6 多出口代理池解决方案,在单台拥有 IPv4 + IPv6 双栈的 VPS 上实现:
- 多出口落地 IP:从 VPS 的 IPv6 网段中动态分配数十至数百个出口地址
- 可视化管理:基于 Python Flask 的 Web 管理后台,实时监控所有出口状态
- 动态分流:支持随机轮询、加权轮询、最少延迟等多种负载均衡策略
- 协议调度:集成 Xray-core + 3x-UI,支持 VLESS+Reality、VMess、Trojan 等主流协议
| 场景 | 说明 |
|---|---|
| 跨境业务代理 | 利用多 IPv6 出口实现高可用、低封禁率的代理服务 |
| 爬虫/数据采集 | 轮换出口 IP 降低目标站点的反爬风控 |
| 多地区模拟 | 不同出口 IP 可配置到不同目标区域的路由 |
| 高并发服务 | 多出口分担连接负载,突破单 IP 并发限制 |
┌─────────────────────────────────────────────────────────────────────────────┐
│ VPS (双栈) │
│ ┌──────────────┐ ┌──────────────┐ ┌────────────────────────────────────┐ │
│ │ IPv4 地址 │ │ IPv6 /64 │ │ IPv6 出口池 (2001:db8::1001-10ff) │ │
│ │ 203.0.113.1 │ │ 2001:db8::1 │ │ • 2001:db8::1001 (出口-1) │ │
│ └──────┬───────┘ └──────┬───────┘ │ • 2001:db8::1002 (出口-2) │ │
│ │ │ │ • ... │ │
│ │ │ │ • 2001:db8::10ff (出口-N) │ │
│ │ │ └────────────────────────────────────┘ │
│ │ │ │ │
│ │ ┌──────▼──────┐ │ │
│ │ │ nftables │ NAT66 转换 │ │
│ │ │ NAT 规则 │◄─────────────────┘ │
│ │ └──────┬──────┘ │
│ │ │ │
│ ┌──────▼─────────────────▼──────┐ │
│ │ Xray-core │ │
│ │ ┌─────────────────────────┐ │ │
│ │ │ Inbound (VLESS+TLS) │ │ ← 客户端连接入口 │
│ │ │ Port: 443 │ │ │
│ │ └─────────────────────────┘ │ │
│ │ │ │ │
│ │ ┌───────────▼────────────┐ │ │
│ │ │ Routing + Balancer │ │ ← 动态分流策略 │
│ │ │ • random │ │ │
│ │ │ • round-robin │ │ │
│ │ │ • least-ping │ │ │
│ │ └───────────┬────────────┘ │ │
│ │ │ │ │
│ │ ┌───────────▼────────────┐ │ │
│ │ │ Multiple Outbounds │ │ ← 每个出口对应一个 freedom outbound │
│ │ │ sendThrough: IPv6-x │ │ │
│ │ └────────────────────────┘ │ │
│ └───────────────────────────────┘ │
│ │ │
│ ┌───────────────────────────▼──────────────────────────────────────────┐ │
│ │ Python Web 管理后台 (Flask + Gunicorn) │ │
│ │ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ ┌─────────┐ │ │
│ │ │ 仪表盘 │ │ IP管理 │ │ 策略切换 │ │ 流量统计 │ │ 日志查看 │ │ │
│ │ └─────────┘ └─────────┘ └─────────┘ └─────────┘ └─────────┘ │ │
│ │ Port: 8080 (可自定义) │ │
│ └──────────────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────────────────┘
- 自动派生:从 VPS 主 IPv6 地址的 /64 前缀自动派生多个子地址
- 灵活数量:默认生成 10 个,可通过参数自定义 (10-200+)
- 持久化:通过 systemd service 确保重启后自动恢复
- 动态增删:通过 Web 界面或 API 实时添加/删除出口地址
- 有状态 NAT66:使用 nftables 将内网 IPv6 流量映射到多个公网出口
- 持久连接:
random,persistent模式确保同一连接始终使用同一出口 - 双栈兼容:同时处理 IPv4 和 IPv6 流量
| 策略 | 说明 | 适用场景 |
|---|---|---|
| random | 随机选择出口 (默认) | 均衡分布,防止单点 |
| round-robin | 轮询分配 | 均匀利用所有出口 |
| least-ping | 选择延迟最低的出口 | 追求最优速度 |
| weighted | 按权重分配 | 不同出口性能差异大 |
- 实时仪表盘:IPv6 出口健康状态、活跃连接数、系统负载
- IP 管理:查看、测试、添加、删除出口地址
- 策略切换:一键切换负载均衡策略
- 流量统计:每个出口的上下行流量、连接数
- 日志查看:Xray 服务日志集成
- 服务控制:一键重启 Xray 服务
| 项目 | 要求 |
|---|---|
| 操作系统 | Debian 11/12 / Ubuntu 20.04/22.04/24.04 |
| 架构 | x86_64 (amd64) 或 aarch64 (arm64) |
| 网络 | 必须拥有 /64 或更大的 IPv6 网段 (推荐 /64) |
| 内存 | 最低 512MB,推荐 1GB+ |
| 磁盘 | 最低 10GB |
| 权限 | root 权限 |
在运行安装脚本前,请确认 VPS 已正确配置 IPv6:
# 检查 IPv6 地址
ip -6 addr show
# 应输出类似以下内容 (需有 scope global 的地址):
# inet6 2001:db8:1234:5678::1/64 scope global
# 测试 IPv6 连通性
ping6 -c 3 2001:4860:4860::8888如果未配置 IPv6,请联系 VPS 提供商或在控制面板中启用。
# 下载安装脚本
curl -fsSL https://raw.githubusercontent.com/your-repo/ipv6-proxy-pool/main/install.sh -o install.sh
chmod +x install.sh
# 默认安装 (生成 10 个 IPv6 出口)
./install.sh
# 自定义安装 (生成 50 个出口,Web 端口 8443)
./install.sh --ipv6-count 50 --admin-port 8443 --admin-user root --admin-pass YourStrongPass| 参数 | 默认值 | 说明 |
|---|---|---|
--ipv6-count N |
10 | 生成 N 个 IPv6 出口地址 |
--ipv6-range |
自动派生 | 指定 IPv6 网段 (如 2001:db8::/64) |
--admin-port |
8080 | Web 管理台端口 |
--admin-user |
admin | Web 管理用户名 |
--admin-pass |
随机生成 | Web 管理密码 |
--install-dir |
/opt/ipv6-proxy-pool | 安装目录 |
安装完成后,访问 3x-UI 面板:
http://你的VPS-IP:54321
默认账号密码在安装时设置(或查看 /usr/local/x-ui/bin/config.json)。
在面板中创建 Inbound(以 VLESS + Reality 为例):
| 字段 | 值 |
|---|---|
| Protocol | VLESS |
| Port | 443 |
| UUID | 点击 Generate 自动生成 |
| Flow | xtls-rprx-vision |
| Security | reality |
| Dest | www.google.com:443 |
| Server Names | www.google.com, google.com |
| Private Key | 执行 xray x25519 生成 |
| Short IDs | 随机 8 位十六进制 |
在 3x-UI 面板 → Xray Settings → Outbounds 中:
- 删除默认的
directoutbound(或保留作为 fallback) - 为每个 IPv6 出口添加一个 freedom outbound:
{
"protocol": "freedom",
"settings": {"domainStrategy": "UseIPv6"},
"sendThrough": "2001:db8::1001",
"tag": "ipv6-out-2001-db8--1001"
}批量生成:使用提供的辅助脚本自动生成完整配置:
# 生成完整 Xray 配置
/opt/ipv6-proxy-pool/venv/bin/python /opt/ipv6-proxy-pool/scripts/gen_xray_config.py
# 输出将保存在 /opt/ipv6-proxy-pool/config/xray_full_config.json
# 可将此配置导入 3x-ui 或替换 /usr/local/x-ui/bin/config.json在 Xray Settings → Routing Rules 中添加 Balancer:
{
"domainStrategy": "IPIfNonMatch",
"balancers": [
{
"tag": "ipv6-pool-lb",
"selector": [
"ipv6-out-2001-db8--1001",
"ipv6-out-2001-db8--1002",
"..."
],
"strategy": {
"type": "random"
}
}
],
"rules": [
{
"type": "field",
"network": "tcp,udp",
"balancerTag": "ipv6-pool-lb"
}
]
}简化方式:直接通过 Web 管理台一键切换策略,后台自动同步到 Xray 配置。
http://你的VPS-IP:8080
使用安装时设置的用户名和密码登录。
| 功能区域 | 说明 |
|---|---|
| 统计卡片 | IPv6 出口总数、Xray 状态、活跃连接数、系统负载 |
| IP 状态表 | 每个出口的健康状态、延迟、流量、连接数 |
| 快速操作 | 添加新 IP、切换负载策略、重启 Xray |
| 自动刷新 | 每 30 秒自动刷新状态数据 |
管理台提供 RESTful API,可用于自动化管理:
| 接口 | 方法 | 说明 |
|---|---|---|
/api/stats |
GET | 获取所有 IPv6 出口实时状态 |
/api/ip/add |
POST | 添加新 IPv6 出口地址 |
/api/ip/remove |
POST | 移除 IPv6 出口地址 |
/api/ip/test |
POST | 测试单个 IP 连通性 |
/api/switch_lb_strategy |
POST | 切换负载均衡策略 |
/api/get_lb_strategy |
GET | 获取当前策略 |
/api/restart_xray |
POST | 重启 Xray 服务 |
/api/nftables_status |
GET | 获取 nftables 规则状态 |
API 调用示例:
# 获取实时统计
curl -u admin:密码 http://VPS-IP:8080/api/stats
# 切换负载策略为 round-robin
curl -u admin:密码 -X POST http://VPS-IP:8080/api/switch_lb_strategy \
-H "Content-Type: application/json" \
-d '{"strategy": "round-robin"}'
# 添加新出口地址
curl -u admin:密码 -X POST http://VPS-IP:8080/api/ip/add \
-H "Content-Type: application/json" \
-d '{"ip": "2001:db8::2001"}'| 服务名 | 说明 | 命令 |
|---|---|---|
x-ui |
3x-UI / Xray 代理核心 | systemctl status x-ui |
ipv6-proxy-admin |
Web 管理后台 | systemctl status ipv6-proxy-admin |
ipv6-proxy-monitor |
监控守护进程 | systemctl status ipv6-proxy-monitor |
ipv6-pool-ips |
IPv6 地址池持久化 | systemctl status ipv6-pool-ips |
nftables |
防火墙/NAT 规则 | systemctl status nftables |
# 重启所有服务
systemctl restart x-ui ipv6-proxy-admin ipv6-proxy-monitor
# 查看 Web 管理台日志
journalctl -u ipv6-proxy-admin -f
# 查看监控日志
journalctl -u ipv6-proxy-monitor -f
# 查看 Xray 日志
journalctl -u x-ui -f
# 查看 nftables 规则
nft list ruleset
# 临时停止防火墙 (排查用)
systemctl stop nftables
# 重新加载 nftables 规则
nft -f /etc/nftables.confQ: 安装后无法访问 Web 管理台
# 检查服务状态
systemctl status ipv6-proxy-admin
# 检查端口监听
ss -tlnp | grep 8080
# 检查防火墙
nft list ruleset | grep 8080
# 查看详细日志
journalctl -u ipv6-proxy-admin -n 50 --no-pagerQ: IPv6 出口地址无法连通
# 检查地址是否已添加到网卡
ip -6 addr show dev eth0
# 从特定地址发起 ping 测试
ping6 -I 2001:db8::1001 -c 3 2001:4860:4860::8888
# 检查内核转发是否启用
sysctl net.ipv6.conf.all.forwarding
# 检查 nftables NAT 规则
nft list table ip6 natQ: Xray 多出口不生效
# 检查 Xray 配置语法
xray -test -config /usr/local/x-ui/bin/config.json
# 检查 outbound tags 是否正确
# 确认 routing 中 balancer 的 selector 包含正确的 tag
# 查看 Xray 日志
journalctl -u x-ui -fQ: nftables 规则无法应用
系统可能使用 iptables 而非 nftables:
# 检查当前防火墙后端
update-alternatives --display iptables
# 如果 iptables-nft 未安装,安装后重试
apt install -y iptables-nft
# 或使用备用 iptables 方案
systemctl enable netfilter-persistent
systemctl start netfilter-persistent| 日志 | 路径/命令 |
|---|---|
| Web 管理台 | journalctl -u ipv6-proxy-admin |
| 监控进程 | journalctl -u ipv6-proxy-monitor |
| Xray 核心 | journalctl -u x-ui |
| 系统内核 | dmesg | grep -i ipv6 |
| nftables | nft list ruleset |
# 修改 Web 管理台端口
sed -i 's/PROXY_ADMIN_PORT=8080/PROXY_ADMIN_PORT=8443/' /etc/systemd/system/ipv6-proxy-admin.service
systemctl daemon-reload
systemctl restart ipv6-proxy-admin
# 修改 3x-ui 端口
x-ui settings # 按提示修改使用 Caddy 或 Nginx 反向代理管理台:
# 安装 Caddy
apt install -y caddy
# 配置 Caddyfile
cat > /etc/caddy/Caddyfile << 'EOF'
proxy.yourdomain.com {
reverse_proxy localhost:8080
tls admin@yourdomain.com
}
EOF
systemctl restart caddy# 编辑服务环境变量
systemctl edit ipv6-proxy-admin
# 添加:
[Service]
Environment="PROXY_ADMIN_PASS=YourNewStrongPassword"
systemctl daemon-reload
systemctl restart ipv6-proxy-admin# 从 /64 前缀派生子地址
# 主地址: 2001:db8:1234:5678::1/64
# 提取前缀: 2001:db8:1234:5678
# 生成: 2001:db8:1234:5678::1001, ::1002, ..., ::10ff
# 添加方式 (noprefixroute 避免创建路由)
ip -6 addr add 2001:db8:1234:5678::1001/128 dev eth0 noprefixroute# 出站流量: 内部地址 -> 随机选择出口池中的公网地址
# 入站响应: 根据 conntrack 状态自动映射回原地址
nftables 规则:
table ip6 nat {
chain postrouting {
type nat hook postrouting priority 100;
# 非本网段源地址的出站流量做 NAT
ip6 saddr != 2001:db8::/64 masquerade random,persistent
}
}
Xray-core 的 sendThrough 参数支持:
- 单个 IP:
"sendThrough": "2001:db8::1001"— 固定出口 - CIDR 段:
"sendThrough": "2001:db8::/64"— 段内随机选择 - 特殊值:
origin/srcip— 保持源地址
本方案使用 单个 IP per outbound 的方式,配合 Balancer 实现精细控制。
| 策略 | Xray Balancer 配置 | 工作原理 |
|---|---|---|
| random | "strategy": {"type": "random"} |
每个连接随机选择一个出口 |
| round-robin | "strategy": {"type": "roundRobin"} |
按顺序轮询分配 |
| least-ping | 需自定义 | 结合管理台健康检查数据选择最优出口 |
/opt/ipv6-proxy-pool/
├── config/
│ ├── ipv6_pool.txt # IPv6 出口地址列表
│ ├── lb_strategy.json # 当前负载均衡策略
│ ├── xray_outbounds.json # Xray outbounds 配置片段
│ ├── xray_routing.json # Xray routing 配置片段
│ ├── xray_full_config.json # 完整 Xray 配置 (生成)
│ └── credentials.txt # 安装凭证 (权限 600)
├── proxy_admin/
│ ├── app.py # Flask Web 应用主文件
│ └── templates/
│ ├── base.html # 基础布局
│ ├── login.html # 登录页
│ ├── dashboard.html # 仪表盘
│ ├── settings.html # 设置页
│ ├── logs.html # 日志页
│ └── error.html # 错误页
├── scripts/
│ ├── monitor.py # 监控守护进程
│ └── gen_xray_config.py # Xray 配置生成器
├── runtime/
│ └── status.json # 运行时状态
└── venv/ # Python 虚拟环境
本项目采用 MIT 协议开源,可自由使用、修改和分发。
