DNS 查询报文结构
一次 DNS 查询报文由报头、问题段,以及可能出现的回答、授权和附加段组成。抓包分析通常从问题段入手:用 dns.qry.name 定位域名、dns.qry.type 区分记录类型、dns.id 把请求与响应配对。问题段是理解「这次解析在问什么」的最短路径。
基本信息
| 适用平台 | Wireshark(dns 协议解析) |
|---|---|
| 关键字段 | dns.qry.name、dns.qry.type、dns.id |
| 常见类型值 | 1 是 A,28 是 AAAA,5 是 CNAME,15 是 MX |
| 协议依据 | RFC 1035(DNS 实现与规范) |
典型使用场景
- 确认在问什么:域名与记录类型是判读的起点
- 配对请求与响应:用事务 ID 把两条报文关联起来
- 分析解析链:把 CNAME 指向与最终地址记录串起来看
- 统计查询分布:按域名聚合找出查询量最大的目标
- 排查名字差异:抓包中的名字可能带上了搜索域后缀
常用过滤
常用过滤
dns.qry.name == "api.example.com" # 指定域名
dns.qry.type == 28 # AAAA 记录
dns.flags.response == 0 # 只看查询方向
dns.id == 0x1234 # 按事务 ID 配对请求与响应常见记录类型
| 类型值 | 名称 | 含义 |
|---|---|---|
| 1 | A | IPv4 地址记录 |
| 28 | AAAA | IPv6 地址记录 |
| 5 | CNAME | 别名指向 |
| 15 | MX | 邮件交换记录 |
查询名不区分大小写,并且可能被客户端补上搜索域后缀。过滤之前先看一眼原文,直接用应用里写的短名字去匹配往往命中不到。
同一个域名同时查 A 与 AAAA 会产生两条独立查询,统计查询次数时要分别计数,否则会得出翻倍的解析量。
事务 ID 用于把请求与响应配对,重试时该值可能相同也可能变化,取决于实现。配对时把 ID、源端口与查询名放在一起看更可靠。
回答段、授权段与附加段分别是解析结果、权威服务器提示与随附数据。只看问题段会漏掉「是谁回答了这条查询」这类关键信息,判断解析来源时要把几段合起来看。