DNS 报文结构
一条 DNS 报文由 12 字节固定头和四个区段组成:问题区(要查的名字与类型)、回答区、权威区、附加区。头部里的 ID 与标志位决定这是查询还是响应、要不要递归、答案是否被截断、DNSSEC 校验到了哪一步。抓包或 dig 输出看不明白时,绝大多数疑问都能在这几个标志位里找到答案。
头部字段读法
| 字段 | 含义 | 排障关注点 |
|---|---|---|
| ID | 查询标识,用于匹配请求与响应 | 防伪造依赖随机化,固定 ID 可被抢答 |
| QR | 0 查询,1 响应 | 抓包时先分清方向 |
| Opcode | 0 标准查询,另有 NOTIFY、UPDATE | 动态更新与主从通知走别的取值 |
| AA | 权威答案标志 | dig 输出里的小写 aa |
| TC | 截断,说明超长需改用 TCP | 出现即改 TCP 或调大缓冲 |
| RD / RA | 请求递归 / 服务器支持递归 | RA=0 说明对方不替你递归 |
| AD / CD | DNSSEC 已验证 / 请求禁用校验 | dig 里的 ad 标志 |
| RCODE | 响应码 | NOERROR、NXDOMAIN、SERVFAIL、REFUSED |
查看标志位与区段
查看标志位与区段
dig www.example.com +noall +comments # 只看头部与标志位
dig +cd www.example.com +noall +comments # CD=1 表示请求端禁用校验
dig +dnssec example.com | grep -i 'flags' # 观察 ad 标志
dig +noall +answer +additional example.com MX # 看附加区里的胶水记录典型使用场景
- 解析超时排查:先看有没有响应回来,再看 RCODE 与 TC 标志,避免一上来就怀疑链路
- DNSSEC 相关故障:用 ad 与 cd 判断是校验失败还是请求端主动放弃了校验
- 权威与递归定位:用 aa 判断答案来自权威服务器还是缓存递归
- 抓包比对:核对 ID 是否一致,识别是否存在抢答或丢包重传
- 协议开发与联调:按区段核对压缩指针与记录顺序
TC 置位只代表这次 UDP 响应塞不下,并不表示答案有错;解析器收到后应改用 TCP 重试。忽略 TC 不重试,是很多「大响应域名偶发解析超时」的根因。多数验证都可用简洁的 dig 标志位完成。
伪造源地址的查询配合大响应(如 ANY 或大量记录)可形成放大攻击。对外提供的递归解析器必须做访问控制与速率限制,权威服务器应慎用超大类 ANY 响应。