DNS 响应码是什么
RCODE 是 DNS 应答头里的四位状态字段,说明这次查询的结果类别。解析失败时先看它比什么都快:NOERROR 表示查询本身成功(答案可能为空)、NXDOMAIN 表示域名根本不存在、SERVFAIL 通常是上游或权威出问题、REFUSED 是策略拒绝。区分这几种,能立刻把排查方向缩小到一半。
基本信息
| 字段位置 | DNS 报文头的 4 位 RCODE 字段 |
|---|---|
| 扩展形式 | EDNS0 可扩展到 12 位,支持更多取值 |
| 常见取值 | 0 NOERROR、2 SERVFAIL、3 NXDOMAIN、5 REFUSED |
| 规范 | RFC 1035 §4.1.1、RFC 6895、IANA 注册表 |
| 查看方式 | dig 输出中的 status 字段 |
| 易混淆项 | NOERROR 且无答案不等于失败 |
典型使用场景
- 解析失败的第一诊断步骤:先确认是域名不存在还是服务器故障
- 排查递归器与权威的分歧:直连权威对比 RCODE 定位问题在哪一侧
- 识别策略拒绝:内网 DNS 的 ACL 不允许递归时返回 REFUSED
- DNSSEC 验证失败排查:验证不过常表现为 SERVFAIL
- CDN 与 DNS 服务商的展平记录异常时,上游返回的 SERVFAIL 会透传给用户
查看与对比 RCODE
查看与对比 RCODE
dig @8.8.8.8 example.invalid +noall +comments | grep -i status
dig example.com +noall +comments | grep -i -E 'status|flags'
dig @ns1.example.com example.com A +noall +comments | grep -i status # 直连权威对比
dig +dnssec example.com +noall +comments # 观察 AD 标志与 status
dig +short +tries=1 example.com A # 减少重试,看清单次结果RCODE 逐值读法
| RCODE | 含义 | 常见原因 |
|---|---|---|
| NOERROR (0) | 查询成功,答案可能为空 | 记录类型不匹配时也会返回 0 且无答案 |
| FORMERR (1) | 报文格式错误 | 请求方构造异常或中间设备改写报文 |
| SERVFAIL (2) | 服务器处理失败 | 权威超时、DNSSEC 验证失败、上游故障 |
| NXDOMAIN (3) | 域名不存在 | 拼写错误、未创建记录、否定缓存 |
| NOTIMP (4) | 操作未实现 | 非常规 Opcode 或功能未开启 |
| REFUSED (5) | 策略拒绝 | ACL 不允许递归或不允许区域传送 |
| BADVERS (16) | EDNS 版本不支持 | 老设备遇到 EDNS0 查询 |
看到 NOERROR 却没有答案,不代表解析坏了:可能是查询类型不对(例如查 A 但只配了 CNAME 到别处),也可能是该名字存在但没有对应类型。要进一步看 ANSWER 与 AUTHORITY 区段的内容。
区分递归器与权威的故障:直连权威拿到正常答案而递归返回 SERVFAIL,说明问题在递归器或其 DNSSEC 验证链上;两边都 SERVFAIL 则更可能是权威本身不可达或配置错误。