自建 Sub2API 与代理节点部署

本文整理一套面向 3-4 人小范围自用 的服务器、3x-ui、VLESS Reality、Cloudflare、Mihomo Docker、SubBoost 分流与 sub2api 代理配置方案。

适用场景:

  • 多人共用 sub2api
  • 每人每月约 200GB 流量
  • 总预算约 45-60 元/月
  • 希望支持 4K 视频、AI 服务、Google、YouTube 等访问
  • 希望通过面板管理用户、端口、流量和节点

一、服务器选型

推荐规格

建议最低配置:

CPU:1C 起步,推荐 2C
内存:1GB 起步,推荐 2GB
硬盘:20GB+
流量:至少 1TB/月,推荐 4TB/月
端口:至少 200Mbps,推荐 500Mbps+
地区:洛杉矶、日本、新加坡、香港等
虚拟化:KVM
网络:独立 IPv4

多人同时观看 4K 视频时,带宽建议:

单人 4K:30Mbps+
3-4 人同时:150Mbps+
更舒服:300Mbps+

实际推荐类型

本方案最终更适合类似下面的 VPS:

2C / 2GB RAM / 20GB SSD / 4TB 流量 / 800Mbps 端口
洛杉矶优化线路
月付约 8 USD

该配置适合 3-4 人分摊使用,流量余量较大,电信和联通方向通常表现较好。


二、服务器网络测试

Ping 测试

Windows PowerShell:

ping 服务器IP -n 100

重点看:

丢包率:最好 0%
平均延迟:美西 130-200ms 可接受
抖动:越小越好

路由测试

Windows:

tracert -d 服务器IP

Linux:

traceroute 服务器IP

如果没有 traceroute

apt update
apt install -y traceroute

端口连通性测试

Windows PowerShell:

Test-NetConnection 服务器IP -Port 22
Test-NetConnection 服务器IP -Port 443

网络质量脚本

服务器执行:

bash <(curl -sL https://Check.Place) -N

主要关注:

  • BGP/ASN 信息
  • 三网延迟
  • 回程路由
  • 国内测速
  • 国际互联质量

IP 质量检测

bash <(curl -sL https://Check.Place) -I

或:

bash <(curl -Ls IP.Check.Place)

重点看:

ChatGPT 是否解锁
YouTube 是否解锁
Netflix 是否解锁
TikTok 是否解锁
是否高风险代理 IP
黑名单数量

三、3x-ui 面板安装

切换 root

sudo -i

更新系统并安装依赖

apt update && apt install -y curl wget ufw

安装 3x-ui

bash <(curl -Ls https://raw.githubusercontent.com/mhsanaei/3x-ui/master/install.sh)

安装建议:

Panel Port:自定义,例如 20530
Username:不要使用 admin/root
Password:使用强密码
WebBasePath:使用随机路径
SSL:长期建议使用域名证书

如果暂时没有域名,可先选择 IP 证书:

2. Let's Encrypt for IP Address

长期使用建议切换为域名证书。


四、Cloudflare 域名解析与 SSL

DNS 解析

在 Cloudflare 添加面板域名:

类型:A
名称:panel
内容:服务器IP
代理状态:DNS only 灰云

建议单独添加节点域名:

类型:A
名称:node
内容:服务器IP
代理状态:DNS only 灰云

VLESS Reality 节点必须使用 DNS only 灰云,不要开启 Cloudflare 橙云代理。

为面板申请域名证书

服务器执行:

x-ui

选择:

19. SSL Certificate Management
1. Get SSL (Domain)

输入域名:

panel.example.com

端口使用默认:

80

成功后面板访问地址类似:

https://panel.example.com:20530/随机路径/

五、UFW 防火墙配置

启用基础端口

ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw allow 20530/tcp
ufw enable
ufw status

端口含义:

22:SSH
80:证书申请
443:HTTPS / 备用
20530:3x-ui 面板端口

放行节点端口

假设节点端口是 54540

ufw allow 54540/tcp
ufw status

如果后续新增入站端口,例如 506441393626460

ufw allow 50644/tcp
ufw allow 13936/tcp
ufw allow 26460/tcp
ufw status

删除不用端口

ufw delete allow 端口号/tcp
ufw status

示例:

ufw delete allow 30123/tcp

长期建议

更推荐使用:

一个入站端口 + 多个客户端 UUID

而不是:

每个人单独一个入站端口

这样只需开放一个节点端口,暴露面更小,同时仍可按客户端统计流量。


六、创建 VLESS Reality 节点

创建入站

3x-ui 面板:

入站列表 -> 添加入站

推荐配置:

协议:VLESS
传输:TCP
安全:Reality
端口:例如 54540
SNI:例如 www.oracle.com / www.microsoft.com / aws.amazon.com
客户端:每人单独一个 UUID

开启 Sniffing

进入入站编辑:

Sniffing -> 开启

建议勾选:

HTTP
TLS
QUIC

客户端链接示例

vless://UUID@node.example.com:54540?type=tcp&encryption=none&security=reality&pbk=PUBLIC_KEY&fp=chrome&sni=www.oracle.com&sid=SHORT_ID&spx=%2F#node-name

说明:

server:建议使用 node.example.com
sni:保持 Reality 配置里的伪装域名

七、3x-ui 安全加固

修改面板账号密码

x-ui

选择:

6. Reset Username & Password

建议:

用户名不要使用 admin/root
密码使用 16 位以上强密码
如不确定 2FA 状态,可选择禁用旧 2FA

修改 WebBasePath

x-ui

选择:

7. Reset Web Base Path

建议使用随机长路径。

轮换敏感信息

如果曾泄露过以下内容,应立即轮换:

3x-ui 面板用户名密码
WebBasePath
Telegram Bot Token
VLESS 客户端 UUID
订阅链接

Telegram Bot Token 可在 @BotFather 中使用:

/revoke

八、Telegram Bot 配置

获取 Bot Token

通过 Telegram @BotFather 创建机器人,得到格式类似:

1234567890:AAxxxxxxxxxxxxxxxxxxxxxxxx

Bot Token 等同于机器人密码,不应公开。

获取管理员 Chat ID

方法一:使用 @userinfobot

/start

方法二:使用 Bot API:

https://api.telegram.org/bot你的Token/getUpdates

需要先给机器人发送 /start。返回内容中的 chat.id 即管理员聊天 ID。


九、使用 SubBoost 生成 Clash/Mihomo 分流配置

本方案推荐将精细分流放在 客户端 Clash/Mihomo,而不是 3x-ui 服务端。

原因:

  • 服务端 direct 表示服务器直连目标网站,不表示用户本地直连
  • 如果想节省 VPS 流量,必须在客户端完成国内直连、国外代理等分流
  • 3x-ui/Xray 无法直接读取 Clash 的 proxy-groupsrule-providers.mrs 规则
  • SubBoost 生成的是 Clash/Mihomo 配置,适合 FlClash、Clash Verge Rev 等客户端

使用方式

访问:

https://subboost.org/

将 3x-ui 导出的 vless:// 节点链接填入 SubBoost,生成 Clash/Mihomo YAML 配置。

客户端导入方式:

FlClash -> 添加配置 -> 文件 -> 选择 yaml 文件

或:

FlClash -> 添加配置 -> URL -> 粘贴订阅地址

Clash/Mihomo 节点示例

proxies:
  - name: "vless-node"
    type: vless
    server: node.example.com
    port: 54540
    uuid: "你的UUID"
    encryption: none
    tls: true
    servername: "www.oracle.com"
    client-fingerprint: chrome
    network: tcp
    udp: true
    reality-opts:
      public-key: "你的PublicKey"
      short-id: "你的ShortID"
      spider-x: "/"

分流分组示例

SubBoost 生成的配置通常包含类似分组:

proxy-groups:
  - name: "🚀 节点选择"
    type: select
    proxies: ["⚡ 自动选择", DIRECT, REJECT, vless-node]
  - name: "⚡ 自动选择"
    type: url-test
    proxies: [vless-node]
    url: "https://www.gstatic.com/generate_204"
    interval: 300
    lazy: false
  - name: "🛑 广告拦截"
    type: select
    proxies: [REJECT, DIRECT, "🚀 节点选择"]
  - name: "🤖 AI 服务"
    type: select
    proxies: ["🚀 节点选择", "⚡ 自动选择", DIRECT, REJECT, vless-node]
  - name: "📹 油管视频"
    type: select
    proxies: ["🚀 节点选择", "⚡ 自动选择", DIRECT, REJECT, vless-node]
  - name: "🔒 国内服务"
    type: select
    proxies: [DIRECT, REJECT, "🚀 节点选择", "⚡ 自动选择", vless-node]
  - name: "🌍 非中国"
    type: select
    proxies: ["🚀 节点选择", "⚡ 自动选择", DIRECT, REJECT, vless-node]
  - name: "🐟 漏网之鱼"
    type: select
    proxies: ["🚀 节点选择", "⚡ 自动选择", DIRECT, REJECT, vless-node]

规则思路

典型规则逻辑:

广告 -> REJECT
私有网络 -> DIRECT
国内服务 -> DIRECT
AI / Google / YouTube / Telegram / GitHub -> 节点选择
非中国 -> 节点选择
漏网之鱼 -> 节点选择

这种方式能让客户端界面显示完整策略组,例如:

🚀 节点选择
⚡ 自动选择
🤖 AI 服务
📹 油管视频
🔍 谷歌服务
📲 电报消息
🔒 国内服务
🌍 非中国
🐟 漏网之鱼

如果只导入 3x-ui 的单条 vless:// 链接,Clash/FlClash 只会显示一个裸节点,不会出现这些分流分组。


十、Mihomo Docker 部署

docker-compose.yml

services:
  clash:
    image: metacubex/mihomo:latest
    container_name: clash
    restart: always
    volumes:
      - ./config-us.yaml:/root/.config/mihomo/config.yaml
      - ./ui:/root/.config/mihomo/ui
    ports:
      - "7890:7890"
      - "7891:7891"
      - "9090:9090"
    networks:
      - sub2api_net

networks:
  sub2api_net:
    external: true
    name: sub2api-deploy_sub2api-network

config-us.yaml 开头配置

Docker 部署时,external-controller 必须监听 0.0.0.0

port: 7890
socks-port: 7891
allow-lan: true
mode: Rule
log-level: info
unified-delay: true
tcp-concurrent: true
find-process-mode: strict

external-controller: '0.0.0.0:9090'
external-ui: /root/.config/mihomo/ui
secret: 'your-secret'

错误写法:

external-controller: '127.0.0.1:9090'

原因:

Docker 容器内的 127.0.0.1 只代表容器自己,宿主机和反代访问不到。

UI 目录要求

目录结构:

部署目录/
  docker-compose.yml
  config-us.yaml
  ui/

ui 目录内应直接包含:

index.html
assets/
...

而不是只放一个 ui.zip

启动与日志

docker compose down
docker compose up -d
docker logs clash --tail 50

正常情况下不应出现:

Can't find config

如果出现该日志,说明容器没有读到配置文件。


十一、sub2api 使用代理

如果 sub2api 和 Mihomo 在同一台服务器或同一 Docker 网络中,可以让 sub2api 走本地代理。

HTTP 代理:

http://127.0.0.1:7890

SOCKS5 代理:

socks5://127.0.0.1:7891

如果在 Docker 网络中,可能需要使用服务名:

http://clash:7890
socks5://clash:7891

具体取决于 sub2api 容器与 Mihomo 容器是否在同一个 Docker network。


十二、iOS Shadowrocket 导入订阅

导入订阅链接

Shadowrocket -> 右上角 + -> 类型选择 Subscribe -> 填入订阅 URL -> 完成

导入单条节点

复制 vless:// 链接后打开 Shadowrocket,通常会自动识别。

注意事项

如果使用 VLESS + Reality

Shadowrocket 版本必须较新
旧版可能不支持 Reality

十三、风险评估

当前方案抗风险能力

整体评价:

小范围自用:中等偏上
公开传播:风险较高
商业售卖:不建议
长期大流量 4K:有被限速或封 IP 风险

优点

VLESS + Reality 协议伪装较好
小范围用户数量少
Cloudflare 灰云 DNS 不破坏 Reality
服务器 IP 质量尚可
BT 可阻断
可按用户统计流量

风险点

VPS 机房 IP 仍可能被识别
高流量视频特征明显
源站 IP 暴露
面板端口暴露公网
UUID / Token / 面板路径泄露会增加滥用风险
Reality 不是绝对抗封方案

加固建议

使用强密码
更换泄露过的 UUID
更换 Telegram Bot Token
面板和节点使用不同域名
Cloudflare 保持灰云
开启 UFW
阻断 BT
不要公开订阅
定期备份配置
确认商家是否支持换 IP

十四、常见问题与试错总结

面板域名 502

常见原因:

访问地址不完整
Cloudflare 开了橙云
端口未放行

正确访问格式:

https://panel.example.com:20530/随机路径/

Cloudflare 应为:

DNS only 灰云

Mihomo Docker UI 502

常见原因:

容器没有读到 config.yaml
external-controller 写成了 127.0.0.1
ui 目录未正确挂载
反代目标端口错误

正确配置:

external-controller: '0.0.0.0:9090'
external-ui: /root/.config/mihomo/ui

只有自己的节点能通,其他用户不通

常见原因:

只放行了自己的节点端口
其他入站端口未放行

解决:

ufw allow 新端口/tcp
ufw status

3x-ui 单条节点导入后没有 Clash 分组

原因:

vless:// 只是单节点链接
不包含 proxy-groups 和 rules

解决:

使用 SubBoost 生成完整 Clash/Mihomo YAML,再导入客户端。

十五、推荐最终架构

推荐结构:

Cloudflare DNS 灰云
        |
        v
node.example.com -> VPS
        |
        v
3x-ui / VLESS Reality
        |
        v
多客户端 UUID 管理

如果需要让 sub2api 使用代理:

Mihomo Docker
  - HTTP: 7890
  - SOCKS5: 7891
  - UI/API: 9090

sub2api -> http://clash:7890

长期建议:

一个 Reality 入站端口
多个客户端 UUID
Cloudflare 灰云解析
UFW 只放行必要端口
客户端使用 SubBoost/Clash 做精细分流
服务端只做基础节点管理和流量统计

十六、维护命令速查

查看防火墙

ufw status

放行端口

ufw allow 端口/tcp

删除端口

ufw delete allow 端口/tcp

进入 3x-ui 菜单

x-ui

重启 3x-ui

x-ui restart

查看 3x-ui 状态

x-ui status

Docker 重启 Mihomo

docker compose down
docker compose up -d
docker logs clash --tail 50

网络质量测试

bash <(curl -sL https://Check.Place) -N

IP 质量测试

bash <(curl -sL https://Check.Place) -I

结论

这套方案适合 小范围、低调、自用型sub2api + VLESS Reality + 3x-ui + Mihomo/SubBoost 组合。

服务器侧负责:

节点创建
用户管理
流量统计
基础安全

客户端侧负责:

SubBoost 分流
Clash/Mihomo 策略组
国内直连
国外代理
AI/Google/YouTube 分类路由

需要明确的是:

该方案不是抗封专线,不适合公开售卖或大规模传播。

真正稳定的关键是:

用户规模小
链接不公开
端口暴露少
配置定期轮换
防火墙正确放行
保留备份与换 IP 预案

评论