题干与适用场景
这道通用技术题考察 DNS 协议、缓存语义和故障排查。候选人需要区分“名称不存在”“名称存在但没有该类型数据”与“解析失败”,并说明为什么修复权威数据后,递归解析器仍可能继续返回旧的负答案。
面试官考察什么
- 能否区分 NXDOMAIN 与 NODATA,而不是把所有空答案都称为域名不存在。
- 能否说明 SOA 记录如何为负响应提供缓存时间,以及失败缓存的独立规则。
- 能否沿 stub、递归解析器、权威服务器链路验证事实和剩余 TTL。
- 能否设计创建记录、回滚和监控方案,避免盲目清缓存或频繁重试。
回答前需要澄清的问题
先确认查询名称、记录类型、查询时间和实际响应码;权威服务器是否已经加载新区域;递归解析器是否启用了 DNSSEC 验证;问题发生在所有解析器还是特定网络;客户端是否通过本地缓存、服务网格或应用级 DNS 缓存访问。
30 秒回答框架
我会先直接向权威服务器查询,确认名称和记录类型;再从多个递归解析器记录 NXDOMAIN、NODATA 或 SERVFAIL 及其 SOA、TTL。NXDOMAIN 表示名称不存在,NODATA 表示名称存在但没有请求类型;两者可按 SOA 的负缓存参数缓存。若权威已正确而递归仍返回旧答案,必须等待负 TTL 或按运营商能力处理,不能假设刷新客户端就能清除上游缓存。
分步骤深入解答
1. 区分三种负面结果
NXDOMAIN 是权威链路确认查询名称不存在;NODATA 通常返回成功响应但答案区为空,表示名称存在却没有请求的 RR 类型。SERVFAIL 则表示解析过程失败,例如权威不可达或 DNSSEC 验证失败,不能直接当作“名称不存在”。不同响应会影响客户端是否缓存以及后续重试。
2. 说明负缓存时间从哪里来
RFC 2308 规定,NXDOMAIN 和 NODATA 可携带 SOA,递归解析器使用 SOA 的负缓存 TTL(现代实现通常取 SOA 的 MINIMUM 与 SOA TTL 中较小者)决定保留时间。权威管理员应把该值视为新记录发布和撤销的传播窗口。RFC 9520 进一步规定解析失败也应进行有限时间的负缓存,但失败缓存不应无限期阻断恢复。
3. 设计可重复的排查路径
先使用 dig @authoritative-server api.example.com A +norecurse 核对权威答案、SOA 和序列号,再对多个递归解析器执行相同查询,记录 status、Authority 区、SOA TTL 和时间戳。若权威返回 A 而递归返回 NXDOMAIN,说明负缓存或委派路径仍旧;若权威也返回 NXDOMAIN,检查区域文件、发布序列和查询名称;若返回 SERVFAIL,检查可达性、委派和 DNSSEC。
4. 处理缓存污染与重试风暴
应用不应在负答案上立即高频重试;为服务发现设置有上限的退避,并记录响应码和缓存剩余时间。对新域名先在生产前创建记录,避免用户第一次查询时把 NXDOMAIN 写入大量递归缓存。变更后监控多个地区的负答案比例,区分递归缓存仍未过期与权威链路持续失败。
5. 规划恢复和回滚
不能强制所有公共递归解析器立刻删除负缓存。可行做法是等待负 TTL 到期、联系可控递归解析器清理、修复权威或 DNSSEC 问题,并在应用层暂时保留旧端点或备用发现路径。修复后持续验证权威、递归和真实请求三层,确认 NXDOMAIN/SERVFAIL 比例恢复,再移除降级措施。
高质量示范回答
我先把 NXDOMAIN、NODATA 和 SERVFAIL 分开。NXDOMAIN 是名称不存在,NODATA 是名称存在但没有请求的记录类型,SERVFAIL 是解析链路失败。直接查询权威服务器确认区域和序列号,再从多个递归解析器观察响应码、Authority 区的 SOA 和剩余 TTL。负响应可依据 SOA 的负缓存 TTL 保留,所以刚创建记录后仍可能得到旧 NXDOMAIN;解析失败也可能被有限时间缓存。排障时避免让应用在负答案上忙等,提前创建记录、设置合理的负 TTL,并在修复后等待缓存窗口、监控多地区递归结果和真实流量,必要时保留备用端点。
常见错误
- 把 NXDOMAIN、NODATA 和 SERVFAIL 当成同一种“空结果”。
- 只清理本机缓存,却忽略递归解析器的负缓存。
- 认为修改 SOA 后所有已经存在的负缓存会立即缩短。
- 在权威仍故障时不断重试,制造递归和应用层压力。
- 只验证 A 记录,忽略 AAAA、委派、DNSSEC 或查询名称拼写。
追问及应对
创建 A 记录后为什么仍是 NXDOMAIN?
先确认权威服务器已加载新区域且委派指向正确。若权威已返回 A,递归解析器看到的 NXDOMAIN 多半是此前缓存的负答案,需要等待其 SOA 负 TTL 到期。
NODATA 会不会阻止以后新增 AAAA?
会。递归解析器可能缓存“名称存在但没有 AAAA”的 NODATA;新增 AAAA 后,客户端仍可能在该负 TTL 内得到空答案。
SERVFAIL 也能缓存吗?
可以,现代规范要求对解析失败进行有限时间的负缓存,但实现会限制时长。修复权威或 DNSSEC 后仍需等待失败缓存窗口,并用多个递归解析器验证。
能否用随机子域绕过负缓存?
不能把它当通用修复。随机名称会产生更多权威查询和缓存压力,且无法修复真实的委派、区域或 DNSSEC 错误;应先修复权威事实并等待既有缓存过期。