7d89ec9d91
- 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>
59 lines
3.4 KiB
Markdown
59 lines
3.4 KiB
Markdown
# infra/domains — 域名池 + CDN 前置 + 签名端点分发
|
||
|
||
配置即代码 + 离线工具 + 契约文档,落实 doc/05(CDN 前置 / 源站隐藏 / 回源鉴权 / 四组域名 + 冷备 / 被封 Runbook)与 doc/06(Ed25519 签名 + 私钥离线 + 公钥内置 + 防回滚)。
|
||
|
||
> **本目录不含任何私钥 / 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)
|
||
|
||
- CDN(`cdn/terraform/origin.tf`)在回源请求上注入 `X-Origin-Auth: <随机值>`。
|
||
- 源站 `server/internal/originauth` 中间件:**源 IP 不在 CDN 回源网段** 或 **鉴权头不符** → 403。
|
||
- **季度轮换(双值过渡)**:
|
||
1. 源站先把新值加为 `Config.Previous`→`Config.Current` 之外的受信值(即同时接受新旧两值)。
|
||
2. CDN 侧 `terraform apply` 把 `origin_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/`
|
||
- Terraform:`cd cdn/terraform && terraform fmt -check && terraform validate`(需真实账号才能 `apply`)
|
||
- 仓库扫描:无私钥、无 token、无身份信息(见各文件头部约束)。
|