在抓包里读 DNS
DNS 流量结构简单,在 Wireshark 里判读很直观:一次查询对应一次响应,事务 ID 相同,响应里带有 rcode 状态码。常见排查动作有三个——看查询与响应是否配对(有无只发不收)、看 rcode 是否为 0(区分 NXDOMAIN 与 SERVFAIL)、看是否发生重试(相同查询重复出现且间隔接近超时值)。再加上内置的响应时间统计,就能量化慢在哪台服务器上。
基本信息
| 适用平台 | Wireshark / tshark,分析任意端口对 53 的抓包 |
|---|---|
| 基础过滤 | dns、dns.qry.name contains "example.com" |
| 方向与状态 | dns.flags.response == 0 为查询,dns.flags.rcode != 0 为错误应答 |
| 截断标志 | dns.flags.truncated == 1 表示响应被截断,客户端应改走 TCP |
| 统计入口 | Statistics → Service Response Time → DNS |
典型使用场景
- 排查解析慢:用响应时间统计比较各 DNS 服务器的平均与最大耗时
- 确认是否被重试:同一事务 ID 重复出现说明发生了超时重试
- 定位截断问题:TC 标志置位后观察客户端是否真的改走 TCP
- 区分错误类型:rcode 为 3 与 2 的处置方向完全不同
- 核对解析结果:比对响应中的地址与预期是否一致
DNS 过滤与统计
DNS 过滤与统计
# 全部 DNS 流量
dns
# 指定域名
dns.qry.name contains "example.com"
# 只看查询
dns.flags.response == 0
# 非 0 的错误应答
dns.flags.rcode != 0
# 被截断的响应(客户端应改用 TCP 53)
dns.flags.truncated == 1
# 统计:Statistics → Service Response Time → DNS,可看到各服务器平均与最大响应时间rcode 速查
| rcode | 含义 | 处置方向 |
|---|---|---|
| 0 | NOERROR(也可能是 NODATA:域名存在但该类型无记录) | 正常,注意区分 NODATA 与无记录 |
| 2 | SERVFAIL(权威服务器失败或验证失败) | 查上游转发与 DNSSEC 配置 |
| 3 | NXDOMAIN(域名不存在) | 核对拼写、search 域与记录是否已发布 |
| 5 | REFUSED(服务器按策略拒绝) | 确认查询来源是否在服务器允许范围内 |
同一事务 ID 的查询重复出现且间隔接近超时时间,说明发生了 DNS 重试;据此可区分「服务器慢」与「第一台服务器完全无响应」两种情况。
统计前先确认 DNS 协议解析未被关闭:在分析菜单的已启用协议里勾选 DNS,否则过滤器会匹配不到任何报文,误以为没有 DNS 流量。