作者:VLX@Tech | 博客:vlongx.com | 频道:YouTube · VLX@Tech
项目地址:baoweise-bot/aimili-vpngate
适用系统:Ubuntu 20.04 / 22.04 / 24.04(强烈推荐,脚本默认仅支持 Ubuntu)
SSH工具:Finalshell
IP检测工具:ipinfo
IP欺诈值测试:scamalytics
IP综合信息 & 欺诈检测:ip.net.coffee
目录
架构原理解析
单机拓扑图
┌─────────────────────────────────────────────────────────────────┐
│ 客户端(Client) │
│ Xray / Clash / V2RayN / Surge 等任意客户端 │
└───────────────────────────────┬─────────────────────────────────┘
│ VLESS / VMess / Trojan(加密传输)
▼
┌─────────────────────────────────────────────────────────────────┐
│ 单台 VPS 服务器 │
│ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ 3x-ui 面板 │ │
│ │ (Xray-core 驱动,流量调度层) │ │
│ │ │ │
│ │ Inbound(入站)──► Routing(路由)──► Outbound(出站) │ │
│ └──────────────────────────────┬───────────────────────────┘ │
│ │ 127.0.0.1:7928 │
│ │ HTTP / SOCKS5(本机回环) │
│ ▼ │
│ ┌──────────────────────────────────────────────────────────┐ │
│ │ aimili-vpngate(本地监听 Port 7928) │ │
│ │ │ │
│ │ 自动抓取 VPNGate 节点 ──► 多线程测速过滤 ──► 节点池 │ │
│ │ ↓ 连接最优节点 │ │
│ │ OpenVPN 隧道(tun0 虚拟网卡) │ │
│ │ 策略路由表 100(代理流量走 tun0) │ │
│ │ SSH / 面板管理流量 仍走 eth0(防失联) │ │
│ │ SO_BINDTODEVICE 零泄漏防护 │ │
│ └──────────────────────────────────────────────────────────┘ │
│ │ OpenVPN 加密隧道 │
└──────────────────────────────────┼──────────────────────────────┘
│
▼
VPNGate 公开落地节点
(日本 / 美国 / 欧洲等,动态切换)
│
▼
目标网站 / 服务
各层职责说明
① 客户端层:用户设备运行 Xray / Clash 等代理客户端,通过 VLESS+XTLS、VMess+WS+TLS 等加密协议连接本机 3x-ui 的入站端口。客户端层完全感知不到后端 VPNGate 链路的存在。
② 3x-ui 流量调度层:Xray-core 在本机承担协议解密与流量调度职责,分三个环节:
- Inbound(入站):监听公网加密连接,完成协议解密,获得裸流量;
- Routing(路由):根据规则将解密后的流量精确匹配到指定出站;
- Outbound(出站):将流量通过
127.0.0.1:7928(本机回环)转发给 aimili-vpngate 的代理网关。
在此层,3x-ui 是纯粹的协议中继与流量调度器,本身不决定最终出口 IP。
③ aimili-vpngate 出口层:决定最终出站 IP 的核心。它在本机 7928 端口提供一个 HTTP/SOCKS5 双协议代理网关,流量进来后:
- 自动从 VPNGate.net 公开 API 拉取全球 OpenVPN 候选节点;
- 多线程并发测试延迟与可用性,动态维护优质节点池;
- 通过 OpenVPN 建立
tun0虚拟隧道,采用**策略路由(Policy Routing,路由表 100)**将代理 Socket 的出站流量强制绑定到tun0,而 SSH 管理流量继续走物理网卡eth0,彻底杜绝操作 VPS 期间的失联风险; - 通过
SO_BINDTODEVICE实现零泄漏防护:VPN 隧道一旦断开,代理请求立即返回502 Bad Gateway,而非悄无声息地回落到 VPS 真实 IP。
单机部署的核心要点
两个服务部署在同一台机器上,3x-ui 出站的目标地址固定为本机回环地址 127.0.0.1,端口 7928。流量不经过公网,在内核网络栈内部完成交接,延迟极低,也不存在外部暴露风险。
环境准备
服务器要求
| 项目 | 要求 |
|---|---|
| 操作系统 | Ubuntu 20.04 / 22.04 / 24.04(强烈推荐,脚本默认仅支持 Ubuntu) |
| 架构 | KVM / XEN(需支持 TUN 设备);OpenVZ 架构不适用 |
| 最低配置 | 1 核 512MB RAM,带宽不限 |
| 需放行端口 | 3x-ui 面板端口(默认 2053)、客户端入站端口(如 443) |
⚠️ 关键检查:OpenVPN 需要内核支持 TUN 设备。OpenVZ 架构的 VPS 通常不支持,部署前务必确认。
系统初始化检查
# 确认系统版本(务必为 Ubuntu)
lsb_release -a
# 检查 tun 设备是否存在(输出 /dev/net/tun 即正常)
ls /dev/net/tun
# 预装必要依赖(全新极简系统必做,防止安装脚本下载失败)
sudo apt-get update && sudo apt-get install -y curl ca-certificates
# 按需放行防火墙端口
ufw allow 2053/tcp # 3x-ui 面板(后续可改端口)
ufw allow 443/tcp # 客户端入站示例端口
ufw reload
# 确认 7928 端口仅本机监听,无需对外放行
# aimili-vpngate 默认绑定 127.0.0.1:7928,不暴露到公网
💡 注意:aimili-vpngate 的
7928端口绑定在127.0.0.1(本机回环),无需在防火墙放行,也不存在被外部扫描的风险。
部署 aimili-vpngate
一键安装
以 root 或 sudo 权限执行以下命令:
bash <(curl -Ls https://raw.githubusercontent.com/baoweise-bot/aimili-vpngate/main/install.sh)
脚本将自动完成所有安装步骤:Python 3 运行环境、OpenVPN 依赖、策略路由规则注入、Systemd 服务注册、ml 快捷管理命令安装。整个过程约 2-5 分钟,取决于网络速度。
Debian 系统兼容运行方案
若你的服务器运行 Debian,脚本内置的系统检测会阻止安装。可用以下方式绕过:
# 下载安装脚本到本地
curl -Ls https://raw.githubusercontent.com/baoweise-bot/aimili-vpngate/main/install.sh -o install.sh
# 用 sed 将系统类型检测替换为 ubuntu
sed -i 's/"${ID:-}"/"ubuntu"/g' install.sh
# 执行安装
sudo bash install.sh
验证服务状态
安装完成后,执行以下命令确认服务正常运行:
# 查看完整状态(代理端口、活跃节点、Web UI 地址)
ml status
正常运行时,输出示例如下:
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
AimiliVPN Gateway — Running ✅
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Proxy Port : 7928 (HTTP/SOCKS5)
Web UI : http://127.0.0.1:8787/EJsW2EeBo9lY/
Active Node : jp-osaka-01 (12ms)
Exit IP : 202.xx.xx.xx (Residential · JP)
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
关注两个核心指标:Proxy Port: 7928 确认监听正常;Exit IP 显示的是 VPNGate 节点 IP 而非本机真实 IP,说明 OpenVPN 隧道已建立。
本地验证代理出口
在服务器本地执行测试,确认 aimili-vpngate 代理网关工作正常:
# 通过 SOCKS5 协议测试出口 IP
curl -x socks5h://127.0.0.1:7928 https://ipinfo.io
# 通过 HTTP 协议测试出口 IP
curl -x http://127.0.0.1:7928 https://ipinfo.io
返回的 IP 和地区应为 VPNGate 落地节点,而非本机真实 IP,即代理网关工作正常。
查看实时日志
# 观察 VPNGate 节点抓取过程与 OpenVPN 连接状态
ml logs
日志中可以看到节点探活、延迟测试、OpenVPN 握手等关键信息,有助于判断当前节点池质量。
安装并配置 3x-ui
一键安装 3x-ui
bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)
安装完成后,面板默认监听 2053 端口,初始账号密码均为 admin。
登录与安全加固
- 浏览器访问
http://服务器公网IP:2053,使用默认账号登录; - 立即进入面板设置,修改以下内容:
- 管理员用户名与密码(默认
admin/admin必须更改); - 面板监听端口(改为非标准端口);
- 访问 Secret Path(开启后 URL 加随机路径,防扫描);
- 管理员用户名与密码(默认
- 建议上传域名 SSL 证书,或使用面板内置 Let’s Encrypt 功能申请,开启 HTTPS 访问。
3x-ui 核心配置实操
单机方案中,3x-ui 需完成三步核心配置:出站(指向本机 aimili-vpngate)、入站(接收客户端连接)、路由(将两者精确关联)。建议按此顺序操作。
Step 1:创建出站(Outbound)— 指向本机 aimili-vpngate
进入面板 Xray 配置 → 出站(Outbounds),点击「添加」,切换到 JSON 模式,填写以下配置:
SOCKS5 协议(推荐):
{
"tag": "aimili-socks5-out",
"protocol": "socks",
"settings": {
"servers": [
{
"address": "127.0.0.1",
"port": 7928,
"users": []
}
]
},
"streamSettings": {
"network": "tcp"
},
"mux": {
"enabled": false
}
}
HTTP 协议(备选):
{
"tag": "aimili-http-out",
"protocol": "http",
"settings": {
"servers": [
{
"address": "127.0.0.1",
"port": 7928,
"users": []
}
]
}
}
字段说明:
address:固定填写127.0.0.1(本机回环,流量不经过公网);port:固定填写7928(aimili-vpngate 默认监听端口);tag:该出站的唯一标识符,路由规则通过此 tag 引用,不可与其他出站重名;mux.enabled:SOCKS5 出站设为false,避免多路复用带来兼容性问题。
Step 2:创建入站(Inbound)— 接收客户端连接
进入入站列表 → 添加入站,以 VLESS + TCP + XTLS-Reality 为例(推荐方案,抗检测性强,适合需要隐蔽性的场景):
| 字段 | 填写内容 |
|---|---|
| 备注 | relay-reality-in(自定义,便于识别) |
| 协议 | VLESS |
| 监听地址 | 0.0.0.0 |
| 监听端口 | 443(或自定义非标准端口) |
| 传输方式 | TCP |
| 安全性 | Reality |
| Dest(SNI) | www.microsoft.com:443(或其他真实可达的 HTTPS 域名) |
| Public Key | 点击「获取」自动生成公私钥对 |
| Flow | xtls-rprx-vision |
入站创建成功后,面板会为其自动分配一个 tag,格式为
inbound-{端口号},例如端口填 443 则 tag 为inbound-443。记录此值,下一步路由配置需精确引用。
Step 3:配置路由(Routing)— 将入站流量导向 aimili 出站
路由层是整套架构的核心调度器,决定哪个入站的流量通过哪个出站发出。
进入面板 Xray 配置 → 路由(Routing),添加规则(JSON 模式):
{
"rules": [
{
"type": "field",
"inboundTag": ["inbound-443"],
"outboundTag": "aimili-socks5-out"
}
]
}
路由逻辑:来自
inbound-443的所有流量,被强制路由到aimili-socks5-out出站。链路完整闭环:客户端 → 本机 3x-ui 入站 → 路由匹配 → 本机出站 →127.0.0.1:7928→ aimili-vpngate → OpenVPN 隧道 → VPNGate 落地节点 → 目标网站。
Step 4:完整 Xray 配置 JSON 参考
以下为完整的 Xray-core 配置结构,可在面板「JSON 配置」页面直接导入。注意替换所有带注释的占位字段:
{
"log": {
"loglevel": "warning"
},
"inbounds": [
{
"tag": "inbound-443",
"listen": "0.0.0.0",
"port": 443,
"protocol": "vless",
"settings": {
"clients": [
{
"id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"flow": "xtls-rprx-vision"
}
],
"decryption": "none"
},
"streamSettings": {
"network": "tcp",
"security": "reality",
"realitySettings": {
"show": false,
"dest": "www.microsoft.com:443",
"xver": 0,
"serverNames": [
"www.microsoft.com"
],
"privateKey": "在面板中点击获取自动生成",
"shortIds": [
"在面板中点击获取自动生成"
]
}
},
"sniffing": {
"enabled": true,
"destOverride": ["http", "tls"]
}
}
],
"outbounds": [
{
"tag": "aimili-socks5-out",
"protocol": "socks",
"settings": {
"servers": [
{
"address": "127.0.0.1",
"port": 7928
}
]
},
"streamSettings": {
"network": "tcp"
},
"mux": {
"enabled": false
}
},
{
"tag": "direct",
"protocol": "freedom"
},
{
"tag": "block",
"protocol": "blackhole"
}
],
"routing": {
"domainStrategy": "AsIs",
"rules": [
{
"type": "field",
"inboundTag": ["inbound-443"],
"outboundTag": "aimili-socks5-out"
}
]
}
}
Step 5:保存并重启 Xray
在面板右上角点击「保存配置」,然后点击「重启 Xray」,配置立即生效。
重启后,在面板「日志」页面确认 Xray 启动无报错。正常启动日志示例:
Xray 2025/xx/xx started
端到端验证
客户端导入节点
从 3x-ui 面板的入站列表中,点击对应入站的「二维码」或「复制链接」图标,将节点信息导入 Xray / Clash / V2RayN 等客户端,开启代理模式。
验证出口 IP 与链路正确性
在你的本地设备上,通过以下方式验证:
# 命令行验证(代理软件设置系统代理后执行)
curl https://ipinfo.io
或在浏览器访问以下地址:
https://ipinfo.io— 查看出口 IP 与归属地https://ip.sb— 查看出口 IPhttps://ipleak.net— 验证 DNS 是否泄漏
预期结果:
- 出口 IP 为 VPNGate 节点 IP,而非你的服务器真实 IP;
- 归属地为 VPNGate 节点所在国家(日本、美国、欧洲等);
ipleak.net的 DNS 检测项显示与出口 IP 一致,无泄漏。
在服务器本地进行链路连通性核查
# 在服务器本地直接测试 aimili 代理网关的出口 IP
curl -x socks5h://127.0.0.1:7928 https://ipinfo.io
# 确认 3x-ui 出站到 aimili 的本地连接是否正常
curl -v -x socks5h://127.0.0.1:7928 https://ipinfo.io 2>&1 | head -30
排错指南
❌ 问题一:客户端连接成功,但网页无法打开(超时)
现象:3x-ui 面板入站显示有连接,但实际流量无法通过,客户端持续超时。
排查步骤:
# 第一步:确认 aimili-vpngate 服务正在运行
ml status
# 第二步:在服务器本地直接测试代理网关连通性
curl -x socks5h://127.0.0.1:7928 https://ipinfo.io --connect-timeout 15
# 第三步:查看实时日志,观察是否有节点连接报错
ml logs
常见原因与解决方案:
| 原因 | 解决方案 |
|---|---|
| aimili-vpngate 服务停止 | ml start 重新启动 |
| VPNGate 节点池耗尽,无可用节点 | ml restart 触发重新抓取节点 |
| VPS 所在网络对 UDP 有限制,OpenVPN 无法建立隧道 | 更换 VPS 或联系服务商确认 UDP 通行情况 |
3x-ui 出站配置中 address 填写了公网 IP 而非 127.0.0.1 |
进入 3x-ui 出站配置,将 address 改为 127.0.0.1 |
❌ 问题二:路由规则未生效,流量走向 direct 直连出站
现象:客户端检测到出口 IP 为服务器真实 IP,而非 VPNGate 节点 IP。
定位方式:
在 3x-ui 面板查看 Xray 日志,若看到以下警告:
[Warning] app/router: no matching rule. default route to direct
说明路由规则中的 inboundTag 与实际入站 tag 不匹配,流量 fallback 到了 direct 出站。
解决方案:
进入 3x-ui 入站列表,找到目标入站节点,查看其 tag 字段(格式为 inbound-{端口号},如监听 443 端口则 tag 为 inbound-443)。确保路由规则中 inboundTag 数组内的字符串与之完全一致,区分大小写。
❌ 问题三:VPN 断开后出现 IP 泄漏(回落到服务器真实 IP)
现象:使用过程中偶发出口 IP 变为服务器真实 IP,而非预期的 502 报错。
原因分析:
aimili-vpngate 正常情况下通过 SO_BINDTODEVICE 将代理 Socket 强制绑定到 tun0 虚拟网卡。VPN 一旦断开,tun0 消失,绑定失败,代理请求应当立即返回 502 Bad Gateway。若出现泄漏,通常是系统策略路由表(路由表 100)被意外修改或清空。
解决方案:
# 查看当前策略路由状态
ip rule list
ip route show table 100
# 若路由表 100 为空或规则缺失,重启服务重建路由规则
ml stop && ml start
# 验证防护机制恢复后的状态
ml logs | grep -E "502|tun0|OpenVPN|CONNECTED"
常用运维命令速查
| 命令 | 功能说明 |
|---|---|
ml 或 ml status |
查看运行状态、代理端口、当前活跃节点、Web UI 访问地址 |
ml start |
启动 AimiliVPN 服务 |
ml stop |
停止服务(自动清理策略路由规则与 OpenVPN 进程) |
ml restart |
重启服务(节点切换或更新配置后建议执行) |
ml logs |
查看实时 Systemd 运行日志 |
ml web |
切换 Web UI 绑定地址(127.0.0.1 仅本地 / 0.0.0.0 允许公网访问) |
ml port |
修改 Web 管理控制台监听端口 |
ml password |
重新生成 12 位随机安全管理密码 |
ml uninstall |
完全卸载服务并清理所有相关文件与环境 |
附录:常见安装报错处理
Apt 包管理器锁冲突
若一键安装时出现 Could not get lock /var/lib/dpkg/lock-frontend 报错:
# 停止自动更新服务,终止相关进程
sudo systemctl stop unattended-upgrades 2>/dev/null
sudo killall apt apt-get dpkg 2>/dev/null
# 清理残留锁文件
sudo rm -f /var/lib/dpkg/lock* /var/lib/apt/lists/lock /var/cache/apt/archives/lock
# 修复受损包状态,重新更新软件源
sudo dpkg --configure -a
sudo apt-get update
# 重新执行一键安装脚本
bash <(curl -Ls https://raw.githubusercontent.com/baoweise-bot/aimili-vpngate/main/install.sh)
相关资源
| 资源 | 链接 |
|---|---|
| aimili-vpngate 项目 | github.com/baoweise-bot/aimili-vpngate |
| 3x-ui 项目 | github.com/mhsanaei/3x-ui |
| VPNGate 官网 | vpngate.net |
| Telegram 交流群 | t.me/arestemple |
| 社区论坛 | 339936.xyz |
| 配套视频教程 | YouTube · VLX@Tech |
本文首发于 vlongx.com,转载请注明出处。
评论区