Chapter 04 · Infrastructure & Topology
机器与网络拓扑
目标:弹性可变的网络拓扑——所有节点可一键更换或自动更换,IP 可随时轮换;任何单点被识别、被阻断都不影响整体服务。设计核心是「节点是牲口不是宠物」:节点无状态、可丢弃、分钟级重建。
§1三层弹性拓扑
用户REALITY / Hysteria2
→
入口层 Entry消耗品 IP 池 · 多厂商 · 高频轮换
→
中转层 Relay(可选)内部隧道转发
→
落地层 Exit精品 IP · 稳定出口 · 用户不可见
免费用户:直连消耗品池入口(单跳直出)。付费用户:入口 → 落地两跳为主,中转层在入口与落地间链路质量差时按需启用。
被识别阻断的永远是入口 IP(暴露面);落地 IP 只对内部隧道可见,几乎不会被烧
| 角色 | 暴露面 | IP 等级 | 更换频率 | 跑什么 |
|---|---|---|---|---|
| entry 入口 | 直面用户与审查(唯一公网暴露) | 消耗品池:冷门小厂、便宜、可隐私购买 | 被封即换;常态每 2–4 周主动轮换 | sing-box(REALITY + Hy2 端口跳跃)+ agent |
| relay 中转 | 仅入口可见 | 低价大带宽 | 低频 | 内部隧道转发 + agent |
| exit 落地 | 仅中转/入口可见 | 精品池:稳定厂商、原生 IP、解锁好 | 极低频 | 出口 + agent |
| probe 探针 | — | 境内多 ISP 拨测点 + 境外对照点 | — | 探测脚本,结果回报控制面 |
- 分级对应套餐(plan/ 既定策略):免费用户消耗免费池入口(tier=free),被封损失最小;付费用户走 tier=pro 入口 + 落地分层,体验稳定。
- 起步规模可以「入口=落地」单跳跑通,拓扑字段(role)从第一天就建模,后续平滑演进为分层,客户端无感。
§2节点无状态化(可丢弃的前提)
- 节点上只有:sing-box + agent 二进制 + 由控制面下发的运行时配置(用户 UUID 表、伪装 SNI、密钥)。零用户库、零日志、零持久数据。
- 全部由
cloud-init一段脚本拉起:装 agent → agent 持引导 token 向控制面 mTLS 注册 → 控制面下发完整配置。重建一台 = 开机 + 等注册,约 3–5 分钟。 - 节点间不互信:中转/落地链路用独立隧道密钥,按节点对发放,回收节点即吊销。
§3节点生命周期状态机
provisioning厂商 API 开机中
→
probing探活:境内外可达性验证
→
up在目录 · 接受连接
→
draining不接新连接 · 排空存量
→
down已出目录
→
destroyed销毁 · IP 释放
up → down(跳过 draining):判封确认时立即下架。probing 失败 → 直接 destroyed(坏 IP 不入池)。每次迁移写 node_events 并 bump 目录 version。
- 目录灰度:
nodes任何变更 bump 全局 version;客户端带if_version轮询(在线连接中收到目录推送可平滑迁移);客户端缓存最后一份可用目录兜底。 - draining 排空:默认 30 分钟或存量连接归零,先到为准;免费节点可直接硬切(用户重连成本低)。
§4一键更换与自动更换
4.1 一键更换(管理端按钮 / CLI 一条命令)
replace(node)管理端触发
→
开新机厂商 API(同区域 · 厂商池内可换家)
→
cloud-init装 agent · 自注册
→
probing境内外探活通过
→
新机入池version bump
→
旧机 draining→ destroy · IP 释放
先建后拆(make-before-break):任何更换动作期间容量不下降
- 换 IP 不换机(更轻量):厂商支持弹性 IP 时直接 API 换绑 → 探活 → 更新 endpoint → version bump,全程分钟级。
- 全量轮换:同一命令对整个池滚动执行(并发度 1–2),用于例行轮换或大面积事件后重建。
- 所有动作幂等、写
audit_log与node_events;基础设施定义用 Terraform + 厂商 API 适配层(providers 表登记,凭证独立 secrets 管理)。
4.2 自动更换:判封 → 下架 → 补新
判封信号(三路互证,避免误判)
| 信号源 | 采集 | 说明 |
|---|---|---|
| 境内探针 | 电信 / 联通 / 移动 ≥3 个拨测点,每 5 分钟:TCP 连通 + TLS 握手 + 真实协议握手 | 核心信号;探针点用境内云函数/拨测服务,与运营身份隔离 |
| 境外对照 | 境外探针同款探测 | 区分「被墙」与「机器挂了」:境内挂 + 境外通 = 疑似被封;两边都挂 = 故障 |
| 流量侧 | agent 上报在线数/带宽,环比骤降(如 15 分钟内 −80%) | 辅助信号,提早怀疑 |
判定与处置规则(scheduler 驱动,阈值可配)
- 疑似:境内 ≥2/3 拨测点连续 2 个周期失败,且境外正常 →
blocked_suspect,节点降权(weight→10),加密探测频率。 - 确认:连续 6 个周期(30 分钟)维持上述状态 →
blocked_confirmed→ 立即down出目录 + 自动触发 §4.1 补新流程。 - 故障(境内外同挂):走告警人工介入,不消耗 IP 配额重建。
- 容量保护:自动补新失败(厂商 API 错误、新机探活不过)连续 3 次 → 升级为告警;池内 up 节点低于水位线(如 tier 内 <70%)→ 无条件告警。
- 熔断:1 小时内同池自动更换 >N 台(疑似大面积事件)→ 暂停自动重建、保留现场、人工决策(可能需要换厂商/换区域/换伪装 SNI 而非头铁补机)。
主动降低被封概率(比换得快更重要)
- REALITY 伪装 SNI 定期评估更换(目标站不可被墙、延迟特征合理);密钥/short_id 随节点轮换。
- Hysteria2 端口跳跃(区间随机),抗 UDP QoS 与端口特征。
- 新 IP 上线前先「养」:探活通过后小流量灰度 24h 再放满 weight,避免新 IP 行为突变被标记。
- 免费池与付费池物理隔离(不同厂商账号),免费池被批量烧不殃及付费池。
§5调度、容量与厂商池
5.1 节点目录排序(服务端)与智能选择(客户端)
- 服务端目录按
score = f(实时负载, 探针延迟, weight, tier)排序下发,给客户端一个好的默认顺序与「信号条」数据。 - 客户端「智能选择」(UI 默认选中):sing-box URLTest 在候选前 N 个节点本地实测自动择优——最终路径决策在端上,服务端只缩小候选集。
5.2 厂商池策略
| 池 | 厂商画像 | 要求 |
|---|---|---|
| 消耗品池(entry/free) | 冷门小厂 ≥3 家,按量/小时计费,IP 便宜量大 | 有 API 可自动开退机;支持加密货币付款、隐私注册;避开被重点封锁的大厂 IP 段 |
| 精品池(exit/pro entry) | 稳定厂商 1–2 家,原生 IP、带宽质量好 | 同样隐私注册;区域:HK / JP / SG / US 起步 |
- 每家厂商独立账号、独立邮箱、加密货币付款——厂商之间、厂商与域名/收款之间不产生身份关联(红线,见 06 章)。
- 控制面(API + MySQL + Redis)部署在与节点完全无关的稳定云上,不放任何代理流量;节点全灭不影响控制面,反之亦然。
5.3 监控告警
- 节点心跳缺失(>90s)、池水位、自动更换熔断、探针自身失联、兑换失败率、注册转化漏斗。
- 告警出口:TG bot(运营专用匿名号)。所有告警附 runbook 链接(05 章)。