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,这是正常设计而不是故障;排查时先弄清目标服务器承担的是递归还是权威角色。