代理 DNS TTL 与故障转移验证:避免陈旧网关导致中断

代理网关本身可能完全正常,客户端却仍在访问已经退役的地址。常见原因不是权威记录,而是更长寿命的下游缓存、负应答、解析失败缓存,或仍在复用的连接池。本指南把这些隐藏状态转化为可验收的切换门槛。
权威 TTL 只是起点
正向应答会缓存地址;不存在的名称也有负缓存;临时解析失败可能被缓存;递归解析器在上游故障时还可能返回陈旧但曾经有效的应答。即使 DNS 已更新,应用仍可能长期复用现有套接字。
RFC 2308 规定负缓存,RFC 8767 描述陈旧 DNS 数据服务,RFC 9520 明确解析失败缓存要求。可靠迁移必须验证这四类行为,不能只看控制台里的 TTL。
绘制完整解析路径
逐层记录可能保留应答的位置:
- 操作系统与语言运行时缓存;
- 本地存根解析器与递归解析器;
- 浏览器、JVM、容器和服务网格;
- 本地解析与代理端解析;
- 独立的 A 与 AAAA 记录;
- HTTP keep-alive、HTTP/2、QUIC 与连接池;
- 主代理和备用代理网关名称;
- 受限目标必须使用的 fail-closed 控制。
安全重叠窗口应依据最长的实测寿命,而不是最短的配置 TTL。
建立安全测试区
使用自有测试域名和两个无害端点。端点 A 代表旧网关,端点 B 代表新网关;各自返回一个不含敏感信息的唯一标记。不要通过中断生产域名或访问未获授权的系统进行测试。
八步验证流程
1. 建立干净基线
仅清理有文档依据的测试缓存,启动新客户端进程并连续请求。记录解析器、地址族、命中端点、查询耗时、连接是否复用和时间戳。
2. 测量正向缓存到期
先让记录指向 A,稳定后改为 B。按固定间隔从各代表性运行时和地区探测。验收标准是所有新连接都在批准窗口内转向 B。
3. 测试负缓存
查询一个刻意不存在的测试名称,随后创建它,测量各客户端持续返回“不存在”的时间。本地解析和代理端解析模式都要覆盖。
4. 测试解析失败缓存
在隔离的测试解析器中模拟临时上游故障,恢复后测量客户端恢复时间。重试必须有上限,且不能放大解析器负载。
5. 识别陈旧应答
在已有有效缓存时暂时隔离权威测试源,确认递归解析器是否返回陈旧数据、持续多久、会给迁移带来什么后果。它能提高可用性,也会延长旧网关的安全保留时间。
6. 分别验证 A 与 AAAA
分别修改 IPv4 和 IPv6 记录。确认两个地址族都能收敛并接受健康检查,避免单个故障地址族静默吸收大量流量。
7. 排空连接池
使用长寿命 HTTP/2、QUIC 和 keep-alive 连接重复切换。DNS 收敛不会迁移已建立的连接,因此必须定义最大连接寿命和受控排空流程。
8. 证明 fail-closed
对必须经过授权代理的工作负载,在测试环境中移除全部允许端点。客户端应明确停止并报错,不能回退为直连或未经批准的网关。
更安全的迁移时间线
至少在计划切换前一个“原 TTL”周期降低 TTL。重叠期间同时保留新旧网关。修改记录后观察新连接收敛,排空旧连接;只有最长实测缓存与连接寿命均结束后,才能退役旧网关。
验收门槛
- 所有目标地区的新连接均在窗口内收敛;
- 负缓存与临时失败缓存按限制恢复;
- 陈旧应答行为已测量并计入重叠期;
- IPv4 与 IPv6 均通过可用性和身份检查;
- 解析故障期间重试量受控;
- 旧连接排空且无请求丢失;
- 没有授权代理时,受限工作负载保持 fail-closed。
切换前检查清单
- [ ] 解析路径和缓存责任方已记录
- [ ] 迁移时间线保留了原 TTL 周期
- [ ] 正向、负向、失败和陈旧缓存测试通过
- [ ] IPv4 与 IPv6 已分别测试
- [ ] 最大连接寿命与排空策略已验证
- [ ] 回滚记录和网关容量已就绪
- [ ] 告警能区分 DNS、连接、TLS 和应用错误
- [ ] 结果已关联 DNS 泄漏与双栈一致性测试
常见问题
切换前五分钟降低 TTL 是否足够?
只有旧 TTL 和所有下游缓存都已经到期才可能足够,否则客户端仍可按原寿命保留旧应答。
DNS 查询成功是否证明代理故障转移有效?
不能。连接池可能仍连着旧网关,代理端解析结果也可能与本地解析不同。
是否应禁用陈旧 DNS 应答?
不应一概禁用。它能在解析器故障时保持可用性,但必须测量持续时间并计入网关退役计划。
相关 98IP 指南
合规说明
仅测试你拥有或已获授权的域名、解析器、代理网关和端点。限制请求频率,保留审计日志,并遵守目标服务条款与适用的数据保护规则。
来源说明:互联网工程任务组,RFC 2308,1998 年 3 月;RFC 8767,2020 年 3 月;RFC 9520,2023 年 12 月。