DNS 过滤在做什么
DNS 相关的显示过滤器围绕三个字段展开:dns.qry.name 是查询名,dns.flags.rcode 是响应码,dns.time 是响应耗时。这三个字段组合起来就能回答解析排查里的大部分问题:查的是哪个域名、服务端给的是什么结果、等了多久。响应码里最常见的是 0 表示正常、2 表示服务端失败、3 表示域名不存在、5 表示被拒绝,区分它们能直接判断是域名写错、服务端故障还是策略拦截。
基本信息
| 查询名 | dns.qry.name contains "example.com" |
|---|---|
| 响应码 | dns.flags.rcode == 3 |
| 响应耗时 | dns.time > 0.5 |
| 请求与响应 | dns.flags.response == 0 与 == 1 |
| 常见响应码 | 0 正常、2 服务端失败、3 域名不存在、5 被拒绝 |
响应码对照
| 取值 | 含义 | 排查方向 |
|---|---|---|
| 0 | NoError,正常应答 | 解析正常,继续看耗时与结果内容 |
| 1 | 格式错误 | 少见,通常与客户端实现或构造异常有关 |
| 2 | ServFail,服务端失败 | 权威或上游故障,重点查 DNS 服务端 |
| 3 | NXDOMAIN,域名不存在 | 核对域名拼写与记录配置 |
| 4 | NotImp,未实现 | 服务端不支持该查询类型,检查查询类型 |
| 5 | Refused,被拒绝 | 策略限制或非授权查询来源 |
典型使用场景
- 核对域名解析结果:按域名片段筛出相关查询与响应
- 确认失败原因:用响应码区分域名不存在与服务端故障
- 定位解析慢:筛耗时超过阈值的查询,看集中在哪个域名
- 识别重试行为:同一域名连续多次查询说明客户端在重试
- 对比不同客户端:按源地址统计谁的解析失败最多
常用示例
常用示例
dns.qry.name contains "example.com" # 该域名的全部查询
dns.flags.rcode == 3 # 域名不存在
dns.flags.rcode == 2 # 服务端失败
dns.time > 0.5 # 响应超过半秒
dns.flags.response == 0 # 只看请求
dns.qry.type == 28 # 只看 AAAA 查询
dns.qry.name contains "example.com" && dns.flags.rcode != 0 # 该域名的失败响应查询名在显示时通常不带结尾的点,写过滤条件时不要加后缀,否则会匹配不到。用 contains 做片段匹配比写完整域名更不容易出错。
客户端对同一域名连续发多次查询属于常见的重试行为。只统计一条会低估问题规模,排查时要把重试一起数进来。
统计与导出
统计与导出
tshark -r a.pcap -Y 'dns.flags.rcode == 3' -T fields -e frame.time_relative -e ip.src -e dns.qry.name | head -20
tshark -r a.pcap -Y 'dns' -T fields -e dns.qry.name | sort | uniq -c | sort -rn | head -20 # 高频查询域名
tshark -r a.pcap -Y 'dns.time > 0.5' -T fields -e dns.qry.name -e dns.time | head判读要点
- 大量 NXDOMAIN 提示域名拼写或记录配置问题,而不是网络故障
- ServFail 集中出现时优先查 DNS 服务端与上游递归状态
- 解析耗时集中在少数域名,通常是那些域名本身的权威服务响应慢
- 同一客户端对多个域名都解析失败,问题可能出在它配置的解析服务器上