首页/网络/网络排障速查/dig +norecurse:递归查询与缓存命中排查
DNS 与解析排查46 条

dig +norecurse:递归查询与缓存命中排查

普通查询 rd=1 让服务器代为递归;+norecurse 只查它的缓存/授权数据:返回答案=命中缓存,返回空/REFUSED=该服务器上确无数据。

网络排障速查网络更新于 2026-10-13

dig +norecurse 是什么

普通查询会带上 RD=1,让 DNS 服务器代为递归解析;加 +norecurse 后服务器只回答自己缓存或授权范围内的数据,不会去别处查找。由此可以判断『这个答案是从哪来的』:返回答案说明该服务器上有缓存,返回空或 REFUSED 说明它手上确实没有这条数据。这是排查『解析结果不一致』与『传播慢』的基本手法。

基本信息

适用平台Linux/Unix 客户端(BIND 9 的 dig)
关键标志RD(期望递归)、RA(服务器允许递归)、AA(权威应答)
对应命令dig +norecurse / dig +recurse / dig +trace
典型用途判断缓存命中、逐级定位缓存来源、确认权威应答

典型使用场景

  • 排查『部分用户解析到旧地址』:逐级用 +norecurse 问,找出哪一级还留着未过期的旧记录
  • 确认某台服务器是否真的有这条记录:有答案说明缓存或授权命中,空答案说明它没有
  • 验证权威服务器:对权威发非递归查询应直接返回并带 AA 标志
  • 切换 DNS 服务商时做迁移验证:确认新老服务器上的答案差异与残留

递归标志对比

递归标志对比
# 只问缓存:命中时直接返回答案
 dig +norecurse @192.168.1.1 example.com
# 默认行为:允许服务器代为递归
dig +recurse @192.168.1.1 example.com
# 对权威服务器发非递归查询:应直接返回答案并带 aa 标志
dig +norecurse +time=2 +tries=1 @ns1.example.com example.com
# 只看关键标志,便于脚本化比对
dig +norecurse @192.168.1.1 example.com | grep -E 'status|flags|ANSWER'

返回结果判读

返回情况含义下一步
答案 + ra 正常该服务器缓存命中或具备授权继续向上或向下逐级核对
NOERROR 但无记录(NODATA)域存在但没有该类型记录与 NXDOMAIN 区分,责任判断不同
REFUSED服务器拒绝非递归查询换支持的方式或改用其上级缓存
SERVFAIL服务器处理出错或后端不可达结合递归查询与权威直查交叉验证
解析器缓存与『传播慢』的关系:用 +norecurse 依次询问每一级 DNS,可以清楚看到谁的缓存还留着旧值(TTL 未过期),从而判断到底要等多久。
对外只提供递归服务的服务器收到非递归查询通常会 REFUSED,这是正常设计而不是故障;排查时先弄清目标服务器承担的是递归还是权威角色。

易错点

  • 把 REFUSED 直接当作服务器故障:只提供递归的服务器拒绝非递归查询是正常行为
  • 把 RA 标志当作『能递归』的唯一依据:还要看 ACL 是否允许你的来源地址
  • 在同一台递归服务器上查缓存却用默认查询(带 RD):永远得到递推结果,看不出缓存状态
  • 忽略 NODATA 与 NXDOMAIN 的区别:前者说明域存在、类型缺失,后者说明域不存在,处置方向完全不同

数据来源与参考

  • RFC 1034/1035(RD/RA 标志)
  • BIND 9 dig 手册(+norecurse)

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌