私人小机场:多个节点的搭建
复制同一份 Reality + VLESS Vision 配置部署香港、日本和美国节点,并使用 Sub-Store 统一管理多客户端订阅。
当第一个 Reality 节点稳定运行后,可以把同一份 sing-box 配置复制到香港、日本和美国 VPS,组成只供自己、家人或少量可信设备使用的“私人小机场”。
本文采用一套容易维护的结构:
- 所有服务器运行相同的 VLESS + TCP + Reality + Vision 配置。
- UUID、Reality 公私钥、Short ID、端口和 SNI 保持一致。
- 客户端的每个节点只修改服务器 IP 和节点名称。
- 使用 Sub-Store 保存多个 VLESS 节点,并按客户端生成不同格式的订阅。
开始前应先完成搭建第一个节点:sing-box Reality + VLESS Vision。本文不会重新生成密钥,而是复用已经通过测试的服务端配置。
这套方案部署和换机非常简单;代价是任意一台服务器上的私钥泄露,都需要为全部节点更换同一套密钥和 UUID。节点只应分享给可信设备,不适合对外售卖或大规模多人使用。
规划香港、日本和美国节点
| 节点 | 推荐线路 | 主要用途 | 购买选择 |
|---|---|---|---|
| 香港 | RFC Host HK-CO | 日常主力、低延迟 | Mini 起步 |
| 日本 | RFC Host JP-CO(官网当前为 JP2-CO) | 日本内容、香港故障时切换 | Micro 或 Mini |
| 美国 | VMISS US.LA.TRI | 三网优化、大流量和海外服务 | Pro 起步 |
香港:RFC Host HK-CO
香港适合作为默认主力。仅运行 sing-box 时,HK-CO-Mini 的 1 核、1 GB 内存和 1,500 GB 流量已经足够;同时部署监控或其他服务再考虑 Standard。
日本:RFC Host JP-CO
RFC Host 官网当前将完整的日本优化线路标为 JP2-CO。预算优先可选 Micro,希望获得更宽裕内存和更大端口则选 Mini。本文所说的 JP-CO 对应当前 JP2-CO 产品线。
美国:VMISS 洛杉矶 TRI
VMISS 的 US.LA.TRI 面向三网优化。Pro 配置足以承载个人节点,通常比香港套餐拥有更大的端口和更充足的月流量,适合作为下载、海外服务或故障切换节点。
建议先按月购买,分别在晚高峰测试自己的宽带和手机网络。地区名称相同不代表本地路由表现相同,最终顺序应以实际丢包、延迟和速度为准。
准备统一的黄金配置
在第一台节点上确认服务正常:
sing-box check -c /etc/sing-box/config.json
systemctl is-active sing-box
ss -lntp | grep ':443'
把当前配置复制为黄金配置并记录校验值:
install -m 600 /etc/sing-box/config.json /root/sing-box-golden.json
sha256sum /root/sing-box-golden.json
以下字段在所有服务器上必须保持一致:
users.uuidusers.flowtls.reality.private_keytls.reality.short_idlisten_porttls.server_nametls.reality.handshake.server
服务器地址不写在服务端配置中,所以同一文件可以直接部署到不同 VPS。客户端只需使用不同 IP 和节点名称。
在每台 VPS 安装相同环境
三台服务器建议都使用 Debian 12 或 13,并完成上一篇文章中的系统更新、BBR 和防火墙设置。
在每台新 VPS 上通过官方 APT 源安装:
apt update
apt install -y curl ca-certificates gnupg
mkdir -p /etc/apt/keyrings
curl -fsSL https://sing-box.app/gpg.key \
-o /etc/apt/keyrings/sagernet.asc
chmod a+r /etc/apt/keyrings/sagernet.asc
cat >/etc/apt/sources.list.d/sagernet.sources <<'EOF'
Types: deb
URIs: https://deb.sagernet.org/
Suites: *
Components: *
Enabled: yes
Signed-By: /etc/apt/keyrings/sagernet.asc
EOF
apt-get update
apt-get install -y sing-box
sing-box version
尽量让三台机器使用相同 sing-box 主版本。正式升级时先更新一台备用节点,测试正常后再更新其他节点。
复制配置完成重复部署
先把黄金配置下载到自己的电脑:
scp root@第一台服务器IP:/root/sing-box-golden.json .
再从本地电脑逐台上传:
scp sing-box-golden.json root@香港服务器IP:/tmp/config.json
scp sing-box-golden.json root@日本服务器IP:/tmp/config.json
scp sing-box-golden.json root@美国服务器IP:/tmp/config.json
分别登录每台服务器,安装并验证:
install -d -m 755 /etc/sing-box
install -m 600 /tmp/config.json /etc/sing-box/config.json
rm -f /tmp/config.json
sing-box check -c /etc/sing-box/config.json
sha256sum /etc/sing-box/config.json
systemctl enable --now sing-box
systemctl restart sing-box
systemctl status sing-box --no-pager
ss -lntp | grep ':443'
三台机器的 SHA-256 应与黄金配置一致。如果使用的不是 443,请替换为实际端口;云防火墙、系统防火墙和 NAT 映射也必须使用相同的 TCP 端口。
批量部署写法
配置好 SSH 密钥后,也可以在本地循环部署。执行前替换三个示例地址:
for HOST in 香港服务器IP 日本服务器IP 美国服务器IP; do
echo "Deploying $HOST"
scp sing-box-golden.json "root@$HOST:/tmp/config.json" || break
ssh "root@$HOST" '
install -d -m 755 /etc/sing-box &&
install -m 600 /tmp/config.json /etc/sing-box/config.json &&
rm -f /tmp/config.json &&
sing-box check -c /etc/sing-box/config.json &&
systemctl enable --now sing-box &&
systemctl restart sing-box
' || break
done
|| break 会在任一服务器失败时停止循环,避免错误继续扩散。首次搭建仍建议逐台执行。
客户端只修改 IP 和名称
从上一篇文章的生成器复制 VLESS URI,然后制作三份。所有查询参数保持不变,只替换 @ 后、端口前的服务器 IP,以及 # 后的名称:
vless://同一个UUID@香港IP:443?...相同参数...#HK-RFC-HKCO
vless://同一个UUID@日本IP:443?...相同参数...#JP-RFC-JP2CO
vless://同一个UUID@美国IP:443?...相同参数...#US-VMISS-LATRI
IPv6 地址必须放在方括号内:
vless://同一个UUID@[2001:db8::10]:443?...相同参数...#JP-Reality
不要重新输入 UUID、公钥和 Short ID。复制第一条已通过测试的 URI,只替换 IP 和名称最不容易出错。
部署 Sub-Store
Sub-Store 可以保存本地节点、组合多个订阅,并输出 sing-box、Mihomo、Surge、Loon、Egern、Shadowrocket、Quantumult X 等格式。
建议部署在一台稳定的管理服务器上。下面使用官方 Wiki 指向的 Docker 镜像,只监听 127.0.0.1,通过 SSH 隧道访问,避免节点凭据和管理面板直接暴露公网。
准备目录和随机后端路径
确认 Docker 与 Compose 已安装:
docker version
docker compose version
创建持久化目录及随机路径:
install -d -m 700 /opt/sub-store
cd /opt/sub-store
printf 'SUB_STORE_PATH=/%s\n' "$(openssl rand -hex 16)" > .env
chmod 600 .env
cat .env
保存输出的 SUB_STORE_PATH,不要把它发布到公开页面或代码仓库。
编写 Docker Compose
创建 /opt/sub-store/compose.yaml:
services:
sub-store:
image: xream/sub-store:latest
container_name: sub-store
restart: unless-stopped
environment:
SUB_STORE_FRONTEND_BACKEND_PATH: ${SUB_STORE_PATH}
SUB_STORE_CORS_ALLOWED_ORIGINS: http://127.0.0.1:3001
ports:
- "127.0.0.1:3001:3001"
volumes:
- ./data:/opt/app/data
启动并检查:
cd /opt/sub-store
docker compose up -d
docker compose ps
docker compose logs --tail 100 sub-store
健康检查:
SUB_STORE_PATH="$(cut -d= -f2- /opt/sub-store/.env)"
curl "http://127.0.0.1:3001${SUB_STORE_PATH}/api/utils/env"
返回版本信息表示服务正常。数据保存在 /opt/sub-store/data,重建容器不会丢失。
通过 SSH 隧道打开管理面板
在自己的电脑上建立隧道:
ssh -N -L 3001:127.0.0.1:3001 root@SUB_STORE服务器IP
保持终端打开,然后访问 http://127.0.0.1:3001。如果前端没有自动找到后端,先在服务器读取随机路径:
cat /opt/sub-store/.env
假设输出:
SUB_STORE_PATH=/0123456789abcdef0123456789abcdef
则在本地浏览器访问:
http://127.0.0.1:3001?api=http://127.0.0.1:3001/0123456789abcdef0123456789abcdef
确认后端在线。不要把端口改成 0.0.0.0:3001 后直接暴露公网;后端保存了完整节点链接,泄露后相当于泄露全部节点凭据。
在 Sub-Store 添加三个节点
新建本地订阅
进入“订阅”,新建本地订阅:
- 名称:
uufly-private - 显示名称:
私人多节点 - 来源:本地节点
把三条真实 VLESS URI 每行一条粘贴到本地节点内容:
vless://UUID@香港IP:443?encryption=none&flow=xtls-rprx-vision&security=reality&sni=download-installer.cdn.mozilla.net&fp=chrome&pbk=公钥&sid=ShortID&type=tcp#HK-RFC-HKCO
vless://UUID@日本IP:443?encryption=none&flow=xtls-rprx-vision&security=reality&sni=download-installer.cdn.mozilla.net&fp=chrome&pbk=公钥&sid=ShortID&type=tcp#JP-RFC-JP2CO
vless://UUID@美国IP:443?encryption=none&flow=xtls-rprx-vision&security=reality&sni=download-installer.cdn.mozilla.net&fp=chrome&pbk=公钥&sid=ShortID&type=tcp#US-VMISS-LATRI
替换 UUID、公钥、Short ID、IP 和端口。保存后预览,确认:
- 协议为 VLESS。
- 安全类型为 Reality。
- 流控为
xtls-rprx-vision。 - 三个地址不同。
- 名称能区分地区和服务商。
使用组合订阅
以后加入家庭出口或其他订阅时,新建“组合订阅”,把 uufly-private 与其他订阅组合。这样可以统一排序、过滤和重命名,而不必反复复制节点。
推荐命名格式为“地区-服务商-线路”:
HK-RFC-HKCO
JP-RFC-JP2CO
US-VMISS-LATRI
为不同客户端生成订阅
在订阅或组合订阅页面选择“订阅链接”。通用链接可根据客户端 User-Agent 自动选择格式,也可以明确指定:
| 客户端 | 建议输出 |
|---|---|
| Clash Mi、Clash Verge Rev、Mihomo Party | Mihomo / Clash Meta |
| sing-box、SFA、SFM | sing-box |
| Shadowrocket | Shadowrocket |
| Loon | Loon |
| Egern | Egern |
| Quantumult X | QX |
| Surge | Surge |
在客户端中添加 Sub-Store 输出的订阅链接并更新,然后逐个测试三个地区。
本文的 Sub-Store 只在本地 SSH 隧道下可访问,适合电脑端管理和导出。手机需要自动更新时,可选择:
- 连接家庭 VPN 后访问局域网 Sub-Store。
- 使用带认证的 HTTPS 反向代理并限制访问来源。
- 将生成结果同步到自己的私有存储,再提供只读链接。
- 在电脑端导出对应格式,安全传送到自己的设备。
不要为了方便更新而公开裸面板和随机后端路径。
更新、备份和扩容
更新与备份 Sub-Store
更新前先备份:
tar -C /opt/sub-store \
-czf "/root/sub-store-$(date +%F).tar.gz" \
data .env compose.yaml
cd /opt/sub-store
docker compose pull
docker compose up -d
docker compose logs --tail 100 sub-store
备份包含完整节点凭据,应按私钥文件处理。
更新 sing-box
先更新一台非主力节点:
apt update
apt install --only-upgrade sing-box
sing-box check -c /etc/sing-box/config.json
systemctl restart sing-box
客户端测试正常后再更新其他机器,不要同时重启全部节点。
增加或替换节点
- 安装相同版本 sing-box。
- 复制黄金配置并通过
sing-box check。 - 放行统一端口并启动服务。
- 复制现有 VLESS URI,只替换服务器 IP 和名称。
- 在 Sub-Store 添加新 URI 或替换旧地址。
- 让所有客户端刷新订阅。
迁移服务器时密钥参数无需变化,只需在 Sub-Store 更新对应 IP。
故障隔离与密钥轮换
只有一个地区无法连接
在对应服务器检查:
systemctl status sing-box --no-pager
journalctl -u sing-box -n 100 --no-pager
ss -lntp | grep ':443'
sha256sum /etc/sing-box/config.json
服务正常时继续检查云防火墙、本地运营商路由和 VPS IP 状态。其他地区可用,说明统一配置大概率没有问题。
全部节点同时无法连接
优先检查订阅是否被错误修改,以及 UUID、公钥、Short ID、SNI 是否一致。三个不同地区同时发生线路故障的概率通常低于订阅参数错误。
任意一台服务器疑似泄露
所有节点共用凭据,应立即:
- 在第一篇搭建教程的生成器中刷新全部参数。
- 更新黄金配置。
- 逐台替换服务端配置并重启。
- 更新 Sub-Store 中三条 URI。
- 刷新所有可信设备订阅。
- 销毁旧 VPS 或重装可疑服务器。
密钥轮换会让旧订阅立即失效。建议先更新服务器,再更新 Sub-Store,最后让客户端刷新,并在过程中保留一个临时备用连接。