DNS 的 NXDOMAIN、NODATA、SERVFAIL、REFUSED 和 Timeout 有什么区别?
DNS 的 NXDOMAIN、NODATA、SERVFAIL、REFUSED 和 Timeout 有什么区别?
五种结果快速对比
RCODE 位于 DNS 响应头。NODATA 没有专属 RCODE,需要根据 NOERROR、Answer 区没有所求类型及 Authority 区等内容判断。Timeout 连 DNS 响应都可能没有收到,所以不能从它推断权威数据是否存在。
NXDOMAIN:查询的名称不存在
NXDOMAIN 对应 RFC 1035 中的 Name Error,RCODE 为 3。它表示问题中的 QNAME 不存在,而不是“这一个记录类型不存在”。例如查询 missing.example.com A 得到权威 NXDOMAIN,含义是 missing.example.com 这个 DNS 名称不存在;随后查询同一名称的 AAAA、MX 等类型通常也不应把它当作存在。
权威服务器返回可缓存的 NXDOMAIN 时,应在 Authority 区携带相关区域的 SOA 记录,使递归解析器能够按照否定缓存规则保存结果。刚创建域名或修复拼写后仍持续看到 NXDOMAIN,可能是递归解析器正在使用此前的否定缓存,而不一定是新记录尚未写入权威服务器。
status: NXDOMAIN
ANSWER: 0
AUTHORITY: example.com. SOA ...
需要核对响应是否来自预期解析器、递归链最终访问了哪个权威服务器,以及父区委派是否一致。如果只有某个解析器返回 NXDOMAIN,而直接查询各权威实例结果不同,可能存在缓存、权威数据未同步或错误委派,不能只通过反复刷新浏览器判断。
CNAME 链也会影响观察。原始名称可能存在 CNAME,但目标名称不存在,最终响应仍可能带有 CNAME 与 NXDOMAIN。诊断输出应保留完整 Answer、Authority 和查询名称,不能只抄最后一行错误。
NODATA:名称存在,但没有这个记录类型
NODATA 的典型表现是 RCODE 为 NOERROR,但 Answer 区没有与所请求类型相关的答案,且 Authority 区通常包含 SOA。它说明名称本身存在,只是该 RRset 不存在。例如 www.example.com 有 A 记录但没有 AAAA,查询 AAAA 可能得到 NODATA;这与整个 www.example.com 不存在的 NXDOMAIN 不同。
status: NOERROR
QUESTION: www.example.com. AAAA
ANSWER: 0
AUTHORITY: example.com. SOA ...
不能看到 NOERROR 就断定查询成功返回了地址。应用需要同时检查 Answer 区、记录类型和 CNAME 处理结果。某些工具把 NODATA 显示为“no answer”或空结果,而不是使用 NODATA 字样,因为它不是一个独立 RCODE。
NODATA 同样可以被否定缓存。若刚添加 AAAA、TXT 或 MX 记录,递归解析器可能暂时仍返回旧的空 RRset。排查应记录 SOA 提供的否定缓存信息,并对比直接权威查询与递归查询,而不是随意清空整台机器的所有缓存。
空非终结节点也说明名称存在不一定有记录。DNS 树中某个名字可能因为下级名称存在而成为节点,但自身没有所查询的 RRset,此时应得到 NODATA 而不是 NXDOMAIN。仅根据“这个名字没有 A”就删除整个域名对象,会破坏下级结构。
SERVFAIL:服务器无法完成解析
SERVFAIL 对应 RCODE 2,表示服务器因自身或解析过程中的问题无法处理查询。它不说明名称存在或不存在。递归解析器无法联系权威服务器、遇到无效委派、DNSSEC 验证失败、权威区不可用或内部资源异常时,都可能返回 SERVFAIL。
SERVFAIL 信息量有限。RFC 8914 定义 Extended DNS Errors(EDE),允许响应附带更具体原因,例如 DNSSEC Bogus、Signature Expired、No Reachable Authority、Network Error 或 Not Ready。EDE 不改变原有 RCODE 的处理语义,但能显著缩小排查范围。工具和解析器不一定都展示 EDE,因此应确认实际响应是否包含 EDNS 扩展。
看到 SERVFAIL 时,先在同一时刻对比多个递归解析器,再直接查询委派链上的权威服务器,并检查 DNSSEC 验证结果。若关闭验证的解析器能得到答案而验证解析器均返回 SERVFAIL,这只是 DNSSEC 问题的强线索,不应通过永久关闭 DNSSEC 作为修复。
有限重试或换用另一个合规递归服务器有助于判断局部故障,但不能无限循环。失败可能被短期缓存,RFC 9520 对解析失败的负缓存作出更新;高频重试会放大权威或网络故障,并可能触发限速。
REFUSED:服务器收到了查询,但不愿处理
REFUSED 对应 RCODE 5。RFC 1035 的定义是服务器出于策略原因拒绝执行指定操作。例如一台仅供内网使用的递归解析器收到公网客户端请求,可能返回 REFUSED;权威服务器收到不允许的区域传送请求也可以拒绝。
REFUSED 证明至少收到了 DNS 层响应,因此它与防火墙静默丢包导致的 Timeout 不同。应核对客户端是否查询了正确角色的服务器:权威 DNS 不必为任意互联网名称提供递归;企业递归 DNS 也可能只允许指定网段、接口或认证客户端。
EDNS Extended DNS Error 可以进一步说明 Not Authoritative、Blocked、Censored 或其他策略原因,但额外文本主要面向人类诊断,不能让自动化系统依赖任意文本做安全决策。客户端仍要首先按 REFUSED RCODE 处理,再把 EDE 作为补充证据。
不要通过打开全球递归权限来“修复”REFUSED。开放递归解析器可能被滥用进行反射放大攻击。正确做法是调整客户端使用的服务器、受控 ACL、VPN/内网路径或权威区域配置,并验证最小授权范围。
Timeout:没有及时获得响应,不是 DNS 错误码
Timeout 表示查询程序在自己的等待期限内没有得到可接受的响应。原因可能是请求根本没发出、UDP 53 被阻断、响应包被丢弃、服务器繁忙、路由不通、客户端选择了不可达的 IPv6 地址,或因截断后切换 TCP 失败。
没有响应就没有 RCODE,因此日志写成“DNS returned TIMEOUT code”是不准确的。应记录目标服务器 IP、端口、传输、地址族、尝试次数和每次耗时。如果客户端配置多个解析器,还要区分第一个超时后第二个成功的情况,否则用户只看到延迟,却误判为全部 DNS 失败。
DNS 通常先使用 UDP,但较大响应、截断标志或本地策略可能要求改用 TCP;加密 DNS 又可能使用 TLS 或 HTTPS。UDP 查询成功不证明 TCP fallback 正常,DoH 页面可访问也不证明该解析请求未被应用自身策略阻断。要按实际传输路径分别验证。
重试应有次数和总时长上限,并使用不同权威实例或解析器做单变量对照。若每次都向同一无响应目标高频重发,只会增加拥塞。抓包时应保护用户查询隐私,并限制采集范围与保留时间。
否定缓存为什么会让修复看起来没生效
NXDOMAIN 和 NODATA 是关于名称数据的否定答案,权威 SOA 为递归解析器提供可缓存时间。SERVFAIL 和其他解析失败也可能按更新后的规范进行受限缓存,以避免查询风暴。不同结果的缓存语义不能混用。
排查时同时记录 Answer、Authority、RCODE、EDE、响应者和 TTL。直接查询权威得到新记录,而公共递归仍给出旧 NXDOMAIN,通常应等待否定 TTL 或使用受控刷新能力;如果不同权威实例本身答案不一致,则应先修复区域发布,而不是等待缓存自然消失。
本机缓存只是链路中的一层。浏览器、操作系统、局域网网关、企业转发器和公共递归都可能缓存。清空某一层后立即恢复,并不能证明该层是根因;需要用明确指定服务器的查询结果建立证据链。
安全排查顺序
第一步保存原始查询:精确的 QNAME、QTYPE、使用的服务器、时间、网络和工具输出。第二步判断有没有响应;无响应走 Timeout 路径,有响应则读取 RCODE、Answer、Authority、AA、TC 和 EDE。
第三步对比同一名称的相关类型,例如 A 与 AAAA,区分 NXDOMAIN 和 NODATA。第四步沿委派链直接查询权威服务器,检查各实例是否一致。第五步才检查缓存、DNSSEC、ACL、网络和应用自身的 fallback 行为。
不要把改 hosts、永久切换到不验证的解析器或关闭防火墙当作最终修复。这些动作会绕开原路径并改变安全边界。诊断对照应最小化、可恢复,并在验证后恢复原配置。
常见问题
NXDOMAIN 和 NODATA 最核心的区别是什么?
NXDOMAIN 表示查询名称不存在;NODATA 表示名称存在,但没有请求的记录类型。前者使用 RCODE 3,后者通常是 NOERROR 加空的相关答案,并结合 Authority 内容判断。
SERVFAIL 是否说明域名没有配置?
不能。SERVFAIL 表示解析器无法完成处理,可能是权威不可达、委派错误、DNSSEC 验证失败或服务器故障。应查看 EDE、委派链和直接权威查询。
REFUSED 和 Timeout 哪个更接近防火墙问题?
Timeout 更可能涉及静默丢包或不可达,但也可能是服务器无响应。REFUSED 则说明收到了一条明确的 DNS 拒绝响应,通常应检查服务器角色、ACL 和策略。
添加记录后为什么仍返回 NXDOMAIN?
递归解析器可能缓存了先前的否定答案,也可能部分权威实例尚未同步。先比较直接权威查询,再读取否定 TTL;不要只反复清理浏览器缓存。
更换公共 DNS 后恢复是否证明原 DNS 有问题?
这是局部解析器或缓存差异的线索,但不是完整证明。两台解析器可能使用不同缓存、DNSSEC策略、网络路径或过滤规则,应保存双方完整响应并继续定位。
参考资料
1. RFC Editor, RFC 1035 — Domain Names Implementation and Specification: https://www.rfc-editor.org/info/rfc1035/
2. RFC Editor, RFC 2308 — Negative Caching of DNS Queries: https://www.rfc-editor.org/info/rfc2308/
3. RFC Editor, RFC 8914 — Extended DNS Errors: https://www.rfc-editor.org/info/rfc8914/
4. RFC Editor, RFC 9520 — Negative Caching of DNS Resolution Failures: https://www.rfc-editor.org/info/rfc9520/
5. RFC Editor, RFC 8020 — NXDOMAIN: There Really Is Nothing Underneath: https://www.rfc-editor.org/info/rfc8020/
6. RFC Editor, RFC 9499 — DNS Terminology: https://www.rfc-editor.org/info/rfc9499/