首页/网络/抓包与流量分析速查/Wireshark 过滤 DNS 查询
Wireshark 技巧75 条

Wireshark 过滤 DNS 查询

dns.qry.name 匹配查询域名,dns.flags.rcode 匹配响应码,dns.time 反映响应耗时;解析异常排查的组合拳。

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 被拒绝

响应码对照

取值含义排查方向
0NoError,正常应答解析正常,继续看耗时与结果内容
1格式错误少见,通常与客户端实现或构造异常有关
2ServFail,服务端失败权威或上游故障,重点查 DNS 服务端
3NXDOMAIN,域名不存在核对域名拼写与记录配置
4NotImp,未实现服务端不支持该查询类型,检查查询类型
5Refused,被拒绝策略限制或非授权查询来源

典型使用场景

  • 核对域名解析结果:按域名片段筛出相关查询与响应
  • 确认失败原因:用响应码区分域名不存在与服务端故障
  • 定位解析慢:筛耗时超过阈值的查询,看集中在哪个域名
  • 识别重试行为:同一域名连续多次查询说明客户端在重试
  • 对比不同客户端:按源地址统计谁的解析失败最多

常用示例

常用示例
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 服务端与上游递归状态
  • 解析耗时集中在少数域名,通常是那些域名本身的权威服务响应慢
  • 同一客户端对多个域名都解析失败,问题可能出在它配置的解析服务器上

易错点

  • 过滤条件里给查询名加了结尾的点,导致永远匹配不到任何报文
  • 只看请求不看响应,无法判断到底是没解析到还是客户端没收到
  • 忽略 DNS 会回退到 TCP 的情况,只过滤 UDP 会漏掉部分查询
  • 把单条失败当结论,未统计同一域名的重试次数,低估了问题范围
  • 在客户端与解析服务器两侧抓包时不区分抓包点,混淆了请求与转发两种流量

数据来源与参考

  • Wireshark 显示过滤器参考(dns.flags.rcode)
  • RFC 1035(DNS RCODE)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌