VTY 品牌域名防护体系 · 产品需求文档(PRD)
| 字段 | 内容 |
|---|---|
| 项目代号 | vty-domain-shield |
| 归属 | VTY 体系 · 独立子项目(与前台站点、中控、操作文档解耦) |
| 文档版本 | v1.0 |
| 状态 | 待评审 |
| 适用角色 | 产品 / 技术 / 运维 / 测试 / 风控 |
| 修订日期 | 2026-08-26 |
0. 一页结论(评审先看)
要解决什么: 品牌域名(如 winbet.com)一旦直接挂站点内容,极易被举报、监控、扫描,导致品牌资产被污染或封禁。需要一套「品牌域零内容 + 双段跳转 + 动态分享 + 来源可统计」的长期可用方案。
怎么做(两段保护):
- 运维侧(第一段):品牌域名在边缘层做 纯 301,域名上 无任何业务内容、无 HTML、无静态资源。
- 技术侧(第二段):用户落到「跳转入口 / 域名池」后,由系统 二次跳转到当前可用站点域名;分享域名 动态解析 当前已二次跳转后的站点域;品牌域进入流量 可埋点统计。
最终目标: 品牌域名长期干净可续用;真实站点域名可轮换、可止血;分享链路永远指到「当前活站」;品牌引流可量化。
1. 需求背景
1.1 业务背景
- VTY 对外有 品牌域名(示例:
winbet.com一类主品牌域),用于广告、投放、口碑传播、线下物料等「品牌入口」。 - 真正承载产品能力的是 站点域名池(可轮换的业务域),会因监管、投诉、DNS 污染、CDN 风控等原因失效。
- 若品牌域直接反代/托管完整站点:
- 扫描器、举报通道可直接抓到业务页面特征;
- 品牌域与站点域「同生共死」,品牌资产被牵连;
- 分享链接写死后,站点一换全线失效。
1.2 现状问题(假设痛点,评审可改)
| 问题 | 影响 |
|---|---|
| 品牌域挂内容或被反代到站点 | 易被扫描/举报;品牌域高风险 |
| 仅一次跳转、跳转目标写死 | 站点域被封后入口全挂 |
| 分享链接写死站点域 | 换域后历史分享全部失效 |
| 无法区分「是否从品牌域进来」 | 投放/品牌效果无法统计 |
| 运维与技术职责混在一起 | 出事后不清楚谁切 301、谁切域名池 |
1.3 为什么独立成项目
- 域名防护是 跨前台、中控、投放、运维 的基础设施能力,不应绑死在某一个业务仓库里。
- 需要单独的配置中心、解析 API、埋点口径、值班 Runbook,便于评审与验收。
2. 目标与非目标
2.1 目标(Must)
- 品牌域名零内容:对外任何探测(GET/HEAD/爬虫)仅见跳转或空响应策略约定结果,不得出现业务页、登录页、活动页、接口文档、目录列表。
- 两段保护可落地:
- 运维侧:品牌域 → 跳转入口域(301,边缘完成);
- 技术侧:跳转入口 → 当前站点域(域名池二次跳转)。
- 最终站点域长期可用:通过域名池轮换、健康探测、一键摘除,保证用户可到达活站。
- 分享域名动态获取:分享侧不写死站点域,而是解析「当前二次跳转后的站点域」。
- 品牌来源可统计:凡经品牌域进入的会话,埋点可归因到具体品牌域(及可选投放参数)。
- 职责清晰:技术做什么、运维做什么、测试验什么,评审一眼能拆工单。
2.2 非目标(Out of Scope / 本期不做)
- 不在本 PRD 内实现完整前台业务功能(充值、投注等)。
- 不替代法务/合规对品牌物料的审批流程(仅提供技术承载方案)。
- 不承诺对抗国家级深度流量分析;目标是 降低被举报/被扫描到业务内容的概率,并 提升站点域可替换性。
- 不把「短链营销平台」做成完整 SaaS(仅定义分享解析与跳转所需最小能力)。
2.3 成功标准(可量化)
| 指标 | 目标 |
|---|---|
| 品牌域内容探测 | 自动化扫描 0 命中业务特征页(见测试章) |
| 站点域故障切换 | 摘除故障域后,新用户 ≤ 1 分钟内落到新活站(配置 TTL 内) |
| 分享解析正确率 | ≥ 99.9% 返回「当前主站域」 |
| 品牌归因覆盖率 | 品牌域 hop 进入会话,埋点带 brand_domain ≥ 99% |
| 角色 Runbook | 封禁/攻击场景,技术与运维各有可执行步骤 |
3. 术语与域名分层
评审约定:下文用「角色名」称呼域名类型,落地时由配置中心登记真实 FQDN。
| 角色 | 示例(虚构) | 是否允许业务内容 | 职责摘要 |
|---|---|---|---|
| 品牌域 Brand | winbet.com / www.winbet.com | 禁止 | 对外品牌入口;仅运维边缘 301 |
| 跳转入口域 Entry | go-xx.net 等入口池 | 仅允许「跳转页/接口」,禁止完整站点 | 技术二次跳转与风控入口 |
| 站点域 Site | play-a.com 等站点池 | 允许完整业务 | 真实产品承载 |
| 分享域 Share | s-xx.com | 仅短链/解析跳转 | 动态给出当前 Site |
| 埋点/采集域 Track | t-xx.com 或走站点同源采集 | 仅采集接口 | 统计品牌来源等 |
| 管理域 Admin | 内网或独立管理域 | 管理后台 | 域名池/开关/审计(不对公品牌域暴露) |
3.1 核心原则
- 品牌域永不托管业务内容(含错误页定制文案、品牌落地页、JS SDK 大包)。
- 站点域可牺牲、可轮换;品牌域尽量不动、不暴露。
- 分享永远解析「当前 Site」,不解析「历史 Site」。
- 归因凭证在第一跳生成、第二跳透传、落地核销,防止凭空刷量。
4. 总体方案(架构)
4.1 双段跳转主路径
用户点击物料 / 输入品牌域
│
▼
┌───────────────────────────────┐
│ ① 运维侧 · 品牌域边缘 │
│ DNS → CDN/LB │
│ 仅返回 HTTP 301 │
│ Location: https://{Entry}/... │
│ 无 Body / 无业务资源 │
└───────────────┬───────────────┘
│
▼
┌───────────────────────────────┐
│ ② 技术侧 · 域名池二次跳转 │
│ Entry 校验 + 风控 + 选活站 │
│ 302/307 → https://{Site}/... │
│ 写入 hop 凭证 & 埋点 │
└───────────────┬───────────────┘
│
▼
用户进入当前可用站点4.2 分享路径
用户打开分享链接 https://{Share}/{code}
│
▼
Share 服务查询「当前主 Site」(与 Entry 二次跳转同一数据源)
│
▼
302/307 → https://{Site}/... (可带分享归因,不一定带品牌归因)4.3 关键数据流(品牌进入)
- 运维 301 的 Location 必须带 可校验的 hop 参数(或固定 path 映射到品牌 ID),例如:
https://entry.example/r/{brandId}?sig=...&ts=...
- Entry 校验签名/时效 → 生成
hop_id→ 二次跳到 Site,URL 或 Cookie/Local 凭证携带brand_domain/brand_id。 - Site 首屏或网关上报:
entry_type=brand、brand_domain、hop_id、UA、落地 path。 - 统计侧去重(同一
hop_id只计一次有效进入)。
5. 运维要做什么(Ops)
本章是运维实施与值班的「做什么」;验收标准见第 9 章。
5.1 职责清单
| 编号 | 事项 | 说明 |
|---|---|---|
| O-1 | 品牌域 DNS | 仅指向「纯跳转边缘」;禁止指向站点源站 / 对象存储站点桶 |
| O-2 | 边缘 301 规则 | 全路径强制 HTTPS;统一 301 到 Entry;禁止 200 业务页 |
| O-3 | 证书与 TLS | 品牌域证书有效;建议 HSTS(评审决定是否 preload) |
| O-4 | 空内容硬化 | 关闭目录索引、默认欢迎页、探针页、Server 指纹过度暴露 |
| O-5 | WAF/ACL 基线 | 品牌域仅允许必要方法(建议仅 GET/HEAD);限制异常扫描 |
| O-6 | 监控告警 | 品牌域出现非 301、出现 Body、证书到期、解析漂移 |
| O-7 | 变更与审计 | 任何品牌域 Location 变更走工单;保留变更记录 |
| O-8 | 封禁应急 | 品牌域被污染时的「只保留跳转 / 切备用 Entry」SOP |
5.2 品牌域「零内容」强制规范
允许:
- DNS 记录(A/AAAA/CNAME)指向跳转边缘;
- TLS 握手;
301/308(推荐 301)且Location指向 Entry;- 必要的安全响应头(如
Strict-Transport-Security)。
禁止:
- 任何 HTML/JS/CSS/图片/字体业务资源;
- 反向代理到站点应用;
- 在品牌域部署「品牌介绍页」「下载页」「客服页」;
- 开放无关端口与管理入口;
- 把品牌域加入站点 CDN 的「同站缓存组」导致内容串域。
探测判定(运维自检):
curl -sI https://winbet.com/
# 期望:HTTP/2 301(或 308)
# 期望:Location 指向 Entry
# 期望:无业务 Set-Cookie(若必须 Cookie,需评审例外)
curl -sL --max-redirs 0 https://winbet.com/ | wc -c
# 期望:Body 为空或仅边缘默认极短响应(以规范为准,推荐空)5.3 运维侧防封策略
| 策略 | 做法 |
|---|---|
| 品牌与站点隔离 | 品牌域永不解析到 Site IP/源站 |
| 多 Entry 热备 | 301 目标可在多个 Entry 间切换(配置中心 + 边缘规则) |
| 低暴露面 | 品牌域不提供 API、不提供 robots 业务说明、不提供 sitemap 业务 URL |
| 注册商/DNS 分散 | 品牌域 DNS 与站点域 DNS 供应商可分离,降低连带 |
| 证书独立 | 品牌域证书不与站点域乱配 SAN 混用(避免证书透明度关联过度) |
| 变更冷静期 | Location 变更灰度 + 回滚开关 |
5.4 运维侧防攻击策略
| 策略 | 做法 |
|---|---|
| 方法限制 | 仅 GET/HEAD;拒绝 POST/PUT 等 |
| 速率限制 | 对品牌域做连接/请求速率限制,防扫库式探测 |
| WAF 基础规则 | 拦截常见漏洞探测路径(即便会 301,也减少边缘开销) |
| Bot 管理(可选) | 对高频扫描 UA/IP 挑战或丢弃 |
| DDoS 防护 | 品牌域接入边缘清洗;攻击时保「跳转可用」优先于「开放探测」 |
| 日志脱敏 | 品牌域访问日志保留状态码/Location/IP 哈希;不落业务数据 |
5.5 运维交付物
- 《品牌域接入清单》模板(域名、DNS、证书、301 Location、负责人)
- 边缘配置样例(Nginx / CDN Rule,评审选用)
- 监控看板:301 占比、非 301 告警、证书到期、解析一致性
- 应急 Runbook:品牌域异常 / Entry 不可用 / 证书失败
6. 技术要做什么(Tech)
本章是研发与架构的「做什么」;接口以逻辑契约描述,实现可选 Worker/网关/BFF。
6.1 职责清单
| 编号 | 事项 | 说明 |
|---|---|---|
| T-1 | 域名池服务 | 维护 Entry / Site / Share 池状态:启用、权重、健康、主备 |
| T-2 | 二次跳转 | Entry 根据策略选出当前 Site,302/307 跳转 |
| T-3 | 分享解析 | Share 动态返回/跳转到「当前二次跳转所用的 Site」 |
| T-4 | 品牌归因 | 校验运维 hop → 生成 hop_id → 落地埋点 |
| T-5 | 配置中心/管理端 | 域名上下线、主站切换、审计日志(管理域) |
| T-6 | 健康探测 | 对 Site/Entry 主动探测;不健康自动摘除 |
| T-7 | 防刷与风控 | 跳转接口防伪造、防重放、防批量撞库式跳转 |
| T-8 | 观测 | 跳转成功率、池容量、归因成功率、分享解析延迟 |
6.2 域名池模型(逻辑)
Site 记录字段(最小集):
| 字段 | 说明 |
|---|---|
domain | FQDN |
status | active / standby / disabled / blocked |
weight | 流量权重 |
is_primary | 是否当前主站(分享解析默认读主站) |
health | 最近探测结果 |
tags | 地区/线路等 |
updated_at / operator | 审计 |
规则:
- Entry 二次跳转与 Share 解析 共用同一「当前 Site」决策(避免分享到 A、入口跳到 B)。
blocked域立即从决策中剔除;人工确认后可回池。
6.3 二次跳转(Entry)行为
- 接收来自品牌域 301 的请求(带
brandId/sig/ts或等价映射)。 - 校验:签名、时效、品牌是否启用。
- 风控:IP/UA/频率;可疑可降级到验证页(验证页只在 Entry,不在品牌域)。
- 选择 Site:
primary优先,否则按权重从 healthy 集合选取。 - 签发
hop_id(一次性或短TTL)。 - 302/307 到
https://{site}/?_hop=...或 Set-Cookie(需 Secure/HttpOnly/SameSite 评审)。 - 异步记:跳转成功日志(品牌、Entry、Site、耗时)。
失败降级:
- 无可用 Site → 返回统一维护响应(仅 Entry 上),并告警;
- 签名失败 → 404/410,不暴露池信息。
6.4 分享域动态获取
产品要求: 分享域名不固化站点域;任何时刻解析结果 = 「当前域名池二次跳转会落到的站点域」。
推荐接口(逻辑):
GET /api/v1/resolve/current-site
- 鉴权:服务端密钥 / 边缘 mTLS / 签名(不对公匿名滥刷)
- 返回:{ "site": "play-a.com", "https": true, "version": "..." }
GET /{code}(面向用户)
- 302 到 https://{currentSite}/... + 分享归因参数
客户端/投放侧规范:
- App、社群、代理后台「一键复制分享链接」必须调 Share/Resolve,禁止缓存超过配置 TTL(建议 ≤ 60s,可配置)。
6.5 埋点监控(品牌来源)
必须上报字段:
| 字段 | 说明 |
|---|---|
entry_type | brand / share / direct / other |
brand_domain | 如 winbet.com(仅 brand 有) |
brand_id | 配置中心 ID |
hop_id | 去重与稽核 |
entry_domain | 实际 Entry |
site_domain | 实际落地 Site |
landing_path | 落地路径 |
ts / ua / ip_hash | 基础维度 |
统计口径:
- 品牌进入 UV/PV:
entry_type=brand且hop_id首次核销; - 品牌→注册/充值:用
hop_id或会话归因链路关联(与现有数据仓库对齐); - 禁止只靠 Referer(品牌域 301 后 Referer 不稳定,只能作辅助)。
6.6 技术侧防封策略
| 策略 | 做法 |
|---|---|
| 站点池容量 | 维持 N 个可切 Site(容量指标进 SLO) |
| 自动摘除 | 健康检查失败自动 disabled,告警人工复核 |
| 主站秒切 | 管理端一键切换 is_primary,Entry/Share 同步 |
| 入口池 | 多个 Entry,品牌 301 可切备用 Entry(与运维联动) |
| 特征收敛 | Entry 页极简,减少可指纹业务特征 |
| 配置下发 | 边缘/节点短 TTL 拉取池状态,避免长缓存指到死域 |
6.7 技术侧防攻击策略
| 策略 | 做法 |
|---|---|
| 跳转参数签名 | HMAC + 时间窗,防伪造品牌归因 |
| 防重放 | hop_id 一次性核销或短 TTL |
| Resolve 鉴权 | 分享解析接口防未授权批量拉取池信息 |
| 速率限制 | Entry/Share/Track 分层限流 |
| 信息隐藏 | 错误响应不返回完整域名池列表 |
| WAF/Bot | Entry/Share 接入防护;管理 API 独立网络策略 |
| 审计 | 所有域名状态变更、主站切换写审计日志 |
6.8 技术交付物
- 域名池服务 + 管理 API 说明
- Entry 二次跳转时序与状态码规范
- Share Resolve 契约与 SDK/调用示例
- 埋点字典与数仓字段对齐表
- 技术应急 Runbook:Site 全挂 / 归因刷量 / 解析被刷
7. 技术 × 运维协作接口(必须对齐)
| 接口点 | 运维提供 | 技术提供 | 共同约定 |
|---|---|---|---|
| 品牌 → Entry | 301 Location 模板 | Entry path/签名算法 | Location 必须可归因到 brand |
| Entry 切换 | 改边缘 Location | Entry 池健康与容量 | RTO:×× 分钟 |
| Site 被封 | DNS/CDN 侧可协助摘除解析 | 池状态切换主站 | 技术主责切换,运维协助清理 |
| 证书 | 品牌/Entry/Share 证书 | Site 证书(或共同) | 到期日历共享 |
| 攻击 | 边缘清洗、封禁 IP | 应用限流、签名失效 | 联合演练 |
| 监控 | 边缘状态码、带宽 | 跳转成功率、池健康 | 统一告警升级路径 |
变更原则:
- 改品牌域 301 → 运维主责,技术复核 Location 是否可被 Entry 校验。
- 改当前 Site → 技术主责,运维无需改品牌域(这是方案价值点)。
8. 关键场景与时序
8.1 品牌域首次进入
- 用户访问
https://winbet.com/ - 边缘 301 →
https://{entry}/r/winbet?sig=...&ts=... - Entry 校验通过,选主站
play-a.com,生成hop_id - 302 →
https://play-a.com/?_hop=... - 站点核销
_hop,上报entry_type=brand, brand_domain=winbet.com
8.2 站点域被封后的用户路径
- 技术将
play-a.com标blocked,play-b.com升主站 - 品牌域 不改(仍 301 到 Entry)
- 新用户经 Entry 自动到
play-b.com - 分享 Resolve 同步返回
play-b.com - 运维可选:清理
play-a.com解析/缓存(协助)
8.3 分享链接
- 代理复制链接 → 后台调 Resolve → 得到当前 Site 或得到 Share 短链
- 用户打开 Share 短链 → 302 当前 Site
- 埋点
entry_type=share(若该分享由品牌活动生成,可另有campaign_id,与品牌 hop 区分)
9. 测试要做什么(QA)——评审可直接拆用例
9.1 品牌域零内容(P0)
| 用例 | 步骤 | 期望 |
|---|---|---|
| TC-B1 | HEAD/GET 品牌根路径 | 301/308,Location 到 Entry |
| TC-B2 | GET 品牌随机路径 /login /promo | 仍 301 到 Entry(或统一策略),不得 200 业务页 |
| TC-B3 | 下载 Body | 无业务 HTML 特征(无标题/表单/钱包文案等) |
| TC-B4 | 常见扫描路径 | 不暴露源站指纹与业务资源 |
| TC-B5 | HTTP→HTTPS | 强制跳转安全 |
9.2 双段跳转(P0)
| 用例 | 步骤 | 期望 |
|---|---|---|
| TC-J1 | 完整跟随跳转(限制人工检查两跳) | 第一跳运维 301,第二跳技术 302/307 到 Site |
| TC-J2 | 伪造签名访问 Entry | 拒绝,不进入 Site |
| TC-J3 | 过期 ts | 拒绝 |
| TC-J4 | 主站切换后立即访问品牌域 | 落到新主站(在 TTL 内) |
9.3 分享动态解析(P0)
| 用例 | 步骤 | 期望 |
|---|---|---|
| TC-S1 | Resolve 当前 Site | 与 Entry 决策一致 |
| TC-S2 | 切换主站后再 Resolve | 返回新主站 |
| TC-S3 | 无鉴权滥刷 Resolve | 被拒绝或限流 |
| TC-S4 | 旧分享短链 | 仍跳到「当前」Site,而非创建时的旧 Site |
9.4 埋点归因(P0)
| 用例 | 步骤 | 期望 |
|---|---|---|
| TC-T1 | 品牌进入 | 事件含 entry_type=brand + brand_domain + hop_id |
| TC-T2 | 同一 hop_id 重复上报 | 有效进入只计 1 |
| TC-T3 | 直连 Site | 不得被记为品牌进入 |
| TC-T4 | 分享进入 | entry_type=share,不与品牌混淆 |
9.5 防封/防攻(P1)
| 用例 | 步骤 | 期望 |
|---|---|---|
| TC-F1 | 标记 Site blocked | 流量不再分配到该域 |
| TC-F2 | Entry 限流 | 超阈返回保护性响应 |
| TC-F3 | 品牌域只允许 GET/HEAD | POST 被拒 |
| TC-F4 | 管理 API 公网 | 不可未授权访问 |
9.6 验收签字栏(评审用)
| 角色 | 验收焦点 | 签字 |
|---|---|---|
| 运维 | 品牌域零内容 + 301 + 监控 | |
| 技术 | 域名池 + 二次跳转 + 分享 + 埋点 | |
| 测试 | P0 用例全过 | |
| 产品 | 目标与口径确认 |
10. 监控、告警与值班
10.1 运维监控
- 品牌域:非 301 比率、有 Body 告警、证书到期、DNS 漂移
- 边缘:5xx、回源(品牌域应无业务回源)、带宽突刺
10.2 技术监控
- Entry 跳转成功率、二次跳延迟
- Site 池:healthy 数量、主站变更事件
- Share Resolve:成功率、延迟、鉴权失败率
- 埋点:品牌归因成功率、
hop核销失败率
10.3 升级路径
- Site 单点故障 → 技术切主站
- Entry 故障 → 运维切品牌 301 到备用 Entry + 技术修 Entry
- 品牌域被投诉/污染 → 运维保零内容与跳转;技术评估是否轮换 Entry;尽量不把业务搬回品牌域
11. 分期建议(便于排期)
Phase 1(MVP)
- 品牌域纯 301 + Entry 二次跳转 + 单主站切换
- 基础埋点(品牌进入)
- 手工健康切换
Phase 2
- Share 动态解析与短链
- 自动健康探测与摘除
- 完整审计与看板
Phase 3
- 多品牌域批量接入
- 更强 Bot/防刷与投放参数体系
- 与代理后台「一键分享」打通
12. 风险与开放问题(评审必答)
| 编号 | 问题 | 建议决策人 |
|---|---|---|
| Q1 | 品牌域 301 是否允许带 path 透传? | 产品+技术 |
| Q2 | hop 凭证用 URL 参数还是 Cookie? | 技术+安全 |
| Q3 | HSTS preload 是否对品牌域启用? | 运维+安全 |
| Q4 | 分享解析 TTL 与客户端缓存上限? | 技术+运营 |
| Q5 | 品牌进入与付费归因窗口(7 日?) | 数据+产品 |
| Q6 | Entry 是否允许极简人机验证页? | 风控+产品 |
13. 附录
A. 角色 RACI(摘要)
| 事项 | 产品 | 技术 | 运维 | 测试 |
|---|---|---|---|---|
| 品牌零内容标准 | C | C | A/R | R |
| 301 配置 | C | C | A/R | R |
| 域名池与二次跳转 | C | A/R | C | R |
| 分享动态解析 | C | A/R | I | R |
| 埋点口径 | A | R | I | R |
| 防封演练 | C | R | R | R |
| 防攻击演练 | C | R | R | R |
B. 示例:边缘 301(示意,非生产配置)
# 品牌域 server:只跳转,不提供内容
server {
listen 443 ssl http2;
server_name winbet.com www.winbet.com;
# ssl_certificate ...;
location / {
return 301 https://entry.example/r/winbet?ts=$msec&sig=...;
}
}生产签名应由边缘函数或统一网关生成,避免在配置文件写死可伪造参数。
C. 文档维护
- 本项目仓库:
vty-domain-shield - 本 PRD 为评审基线;变更需记版本与修订说明。
文档结束。