Files
pangolin/infra/domains
wangjia 7d89ec9d91 feat(infra/domains): 域名池 + CDN 前置 + 签名端点分发 (tsk_NU9JuUweHWMt)
- domains.md: 四组域名隔离登记 + 冷备池 ≥5 + 启用流程(不含身份信息)
- cdn/terraform: Cloudflare 配置即代码(WAF/bot/速率限制/代理DNS/回源鉴权注入)+ 30min 重放 Runbook
- server/internal/originauth: 回源鉴权中间件,非 CDN 网段或鉴权头不符一律 403,支持双值轮换
- tools/endpoint-signer: 离线 Ed25519 签名 CLI(端点 + 公告文档,单调版本防回滚,key_id 双公钥轮换)
- tools/publish-mirrors: ≥3 镜像发布 + hash 一致性校验 + 故障转移取回
- CLIENT-CONTRACT.md: schema/验签/防回滚/合并/兜底链/channel 客户端契约
- 出站独立出口要求写入部署文档;私钥/token/身份信息一律不入库

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-13 14:21:55 +08:00
..

infra/domains — 域名池 + CDN 前置 + 签名端点分发

配置即代码 + 离线工具 + 契约文档,落实 doc/05(CDN 前置 / 源站隐藏 / 回源鉴权 / 四组域名 + 冷备 / 被封 Runbook)与 doc/06Ed25519 签名 + 私钥离线 + 公钥内置 + 防回滚)。

本目录不含任何私钥 / token / 身份信息。 私钥离线两地保存,token 由 rbw / CI Secret 注入,身份线索离线台账管理。

目录结构

路径 内容
domains.md 四组域名隔离登记 + 冷备池 + 启用流程(不含身份信息)
cdn/terraform/ Cloudflare 配置即代码:WAF + bot + 速率限制 + DNS + 回源鉴权;30min 重放 Runbook
tools/endpoint-signer/ 离线 Ed25519 签名 CLI:端点文档 + 公告文档
tools/publish-mirrors/ 多镜像发布 + 一致性校验 + 故障转移取回
CLIENT-CONTRACT.md 客户端联动契约:schema / 验签 / 防回滚 / 合并 / 兜底链 / channel
examples/ 端点 / 公告 payload 与镜像配置示例
〔关联〕../../server/internal/originauth/ Go 回源鉴权中间件(非 CDN 网段或鉴权头不符一律 403)

数据流

端点池 JSON ──(endpoint-signer, 离线)──> endpoints.v1.json (Ed25519 签名)
                                              │
                                  (publish-mirrors) 推 ≥3 镜像 + 校验 hash 一致
                                              │
                        CF Pages / GitHub<独立账号> / 对象存储
                                              │
        客户端按 mirror_urls 故障转移取回 ──> 验签 + 防回滚 + schema ──> 合并进端点池
                                              │
                              (CLIENT-CONTRACT.md 兜底链第 5 层)

回源鉴权与轮换(doc/05 §2 / doc/06 §6

  • CDNcdn/terraform/origin.tf)在回源请求上注入 X-Origin-Auth: <随机值>
  • 源站 server/internal/originauth 中间件:源 IP 不在 CDN 回源网段鉴权头不符 → 403。
  • 季度轮换(双值过渡)
    1. 源站先把新值加为 Config.PreviousConfig.Current 之外的受信值(即同时接受新旧两值)。
    2. CDN 侧 terraform applyorigin_auth_value 切到新值。
    3. 传播完成后源站去掉旧值。 期间新旧两值都通(验收要求)。

部署要求:出站请求走独立出口(写入部署文档)

源站的出站请求不得暴露源站地址doc/05 §2 源站 IP 隐藏)。以下出站必须走独立出口(独立 NAT / 出口代理 / 独立弹性 IP),与源站入站 IP 分离:

  • 支付 webhook 回调校验(codes 模块回访发卡店 / 收款通道)。
  • 广告回执校验/v1/ads/unlock 等向广告平台核验回执)。
  • 任何源站主动发起的第三方 API 调用。

理由:对端日志或证书透明度 / DNS 历史一旦记录源站出站 IP,等于泄露源站。出口 IP 与入站源站 IP 解耦后,换源站(IaC 重建)不牵连出口,反之亦然。部署时在 04 章网络拓扑落实该独立出口。

校验

  • Go 工具:cd tools && go test ./...
  • 回源中间件:cd ../../server && go test ./internal/originauth/
  • Terraformcd cdn/terraform && terraform fmt -check && terraform validate(需真实账号才能 apply
  • 仓库扫描:无私钥、无 token、无身份信息(见各文件头部约束)。