结果码是干什么的
DNS 结果码(rcode)在报文头里只占 4 位,却是排错时的第一个分流点:0 表示成功,2 表示服务器失败,3 表示名字不存在,5 表示策略拒绝。同一个「解析不了」的现象,落到不同码点意味着完全不同的排查方向——码点 3 要看域名与人名拼写,码点 2 要看上游链路与解析器状态,码点 5 要看权限与策略配置。先读码点再动手,能省掉大量无效检查。
基本信息
| 适用平台 | Wireshark / tshark,任何 DNS 流量 |
|---|---|
| 字段 | dns.flags.rcode |
| 基础码点 | 0 NOERROR、1 FORMERR、2 SERVFAIL、3 NXDOMAIN、4 NOTIMP、5 REFUSED |
| 扩展说明 | EDNS0 通过 OPT 记录扩展结果码位宽,分析以工具解析出的字段值为准 |
典型使用场景
- 批量域名解析失败时先按码点分组,把问题收敛到同一类根因
- 区分「域名真的不存在」与「解析器暂时取不到数据」
- 识别上游策略拒绝导致的失败,避免反复检查本地配置
- 在服务迁移或切换解析器后做前后对照,确认失败性质是否改变
- 为工单提供可复核的失败证据:时间、域名、码点三项齐全
- 监控脚本按码点告警,避免把 NXDOMAIN 噪声计入故障率
过滤与统计
过滤与统计
tshark -r dns.pcap -Y 'dns.flags.response == 1 && dns.flags.rcode != 0' \
-T fields -e frame.time -e dns.qry.name -e dns.flags.rcode
# 按码点聚合,先看数量最多的那一类
# 少数码点单独出现时,回到包层面看对应的解析器与域名码点对照读法
| 码点 | 名称 | 典型方向 |
|---|---|---|
| 0 | NOERROR | 成功;但答案段为空属于 NODATA,不是拿到了记录 |
| 1 | FORMERR | 报文格式被解析器拒绝,检查查询构造或中间设备改写 |
| 2 | SERVFAIL | 解析器转述的失败,通常指向上游超时或验证失败 |
| 3 | NXDOMAIN | 域名不存在或拼写错误,含记录类型写错的情况 |
| 4 | NOTIMP | 查询类型不被支持,常见于非常规类型探测 |
| 5 | REFUSED | 策略拒绝或非授权来源,检查访问控制与转发范围 |
同一异常在不同解析器实现下可能落到不同码点,例如有的实现对上游超时回 2、有的回 5,因此对照表用于分流方向,不作为跨厂商的绝对映射。
统计失败率时要把查询与响应分开,只统计响应侧的结果码;把无响应的超时单独归类,否则会低估真实故障面。