应用层报文判读71 条

DNS 结果码速查表

结果码决定失败性质:0 成功、2 服务器失败、3 名字不存在、5 拒绝:排错时按码点分流到不同方向。

结果码是干什么的

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
# 按码点聚合,先看数量最多的那一类
# 少数码点单独出现时,回到包层面看对应的解析器与域名

码点对照读法

码点名称典型方向
0NOERROR成功;但答案段为空属于 NODATA,不是拿到了记录
1FORMERR报文格式被解析器拒绝,检查查询构造或中间设备改写
2SERVFAIL解析器转述的失败,通常指向上游超时或验证失败
3NXDOMAIN域名不存在或拼写错误,含记录类型写错的情况
4NOTIMP查询类型不被支持,常见于非常规类型探测
5REFUSED策略拒绝或非授权来源,检查访问控制与转发范围
同一异常在不同解析器实现下可能落到不同码点,例如有的实现对上游超时回 2、有的回 5,因此对照表用于分流方向,不作为跨厂商的绝对映射。
统计失败率时要把查询与响应分开,只统计响应侧的结果码;把无响应的超时单独归类,否则会低估真实故障面。

易错点

  • 拿到失败域名就直接去查记录配置:不先读码点会漏掉「解析器故障」与「策略拒绝」这两类与记录无关的原因
  • 把 SERVFAIL 当成域名问题:它是解析器代答的失败,根因通常在上游链路或验证环节
  • 把 NODATA 计入成功:结果码为 0 但答案段为空的响应在监控里常被漏判
  • 只看单个域名:解析器级故障需要多个对照域名才能与域名级问题区分开

数据来源与参考

  • RFC 1035(rcode)
  • RFC 2308(NODATA)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌