登录
推荐 文章 Go 技术 课程 下载 专题 AI
首页 >  文章 >  软件教程

Wireshark 如何用显示过滤器追踪一次 DNS 查询

来源:17golang原创

时间:2026-10-09 18:03:07 190浏览 收藏

用 Wireshark 追踪一次 DNS 查询,最稳妥的办法是先用 dns.qry.name 留下目标域名的查询和响应,再选中查询帧查看 Response In,或读取事务 ID 后用 dns.id 把同一对报文固定下来。最后核对响应码、应答记录与 dns.time,就能判断这次解析是否成功、返回了什么以及耗时多久。

下面用一个已经保存为 dns-demo.pcapng 的抓包文件演示完整操作。示例目标域名是 example.com。显示过滤器只会隐藏不匹配的数据包,不会删除原文件里的其他流量,因此可以放心逐步缩小范围。

官方网站:https://www.wireshark.org/

开始前准备:确认抓包里有可解析的 DNS

本教程适合传统明文 DNS 报文,例如 UDP 或 TCP 上可被 Wireshark 识别为 DNS 的流量。准备文件时注意三点:

  • 优先保留 .pcapng 原始抓包,分析前复制一份工作副本;
  • 记住要查的完整域名,例如 example.com,不要先猜某个 DNS 服务器地址;
  • 如果客户端使用 DNS over HTTPS 或 DNS over TLS,未解密时通常看不到普通 dns.qry.name 字段,这种情况不能按本文方法直接筛选域名。

这里使用“导入抓包—显示过滤—核对详情—导出精简文件”的路线。它比直接在大文件中滚动列表更适合复盘,也便于把最小证据包交给同事。

步骤一:打开准备好的抓包文件

  1. 启动 Wireshark,在菜单栏选择 File → Open。
  2. 在 Open Capture File 对话框中选择 dns-demo.pcapng。
  3. 点击 Open,等待数据包列表完成载入。
原创网络分析软件界面中通过 File 和 Open 打开 dns-demo.pcapng 抓包文件的操作状态
图1:通过 File → Open 载入 pcapng 的原创操作示意图,不是 Wireshark 真实截图。

确认成功:主窗口中出现数据包列表,底部状态栏能看到抓包内的数据包数量。如果列表为空,先确认文件没有损坏,并检查是否打开了错误文件。

步骤二:先按域名留下查询和响应

窗口顶部的显示过滤器输入框用于筛选当前列表。输入下面的表达式:

dns.qry.name == "example.com"

输入时 Wireshark 会检查语法。过滤器背景变成有效状态后,按 Enter/Return,或者点击右侧 Apply。由于 DNS 响应通常也包含原查询问题区,这个条件一般会同时留下查询和对应响应。

原创网络分析软件界面中应用 dns.qry.name 等于 example.com 显示过滤器并保留 DNS 查询响应的状态
图2:按 dns.qry.name 过滤目标域名后的原创界面示意图,绿色输入状态表示表达式语法有效。

确认成功:数据包列表的 Protocol 列主要显示 DNS,Info 列中能看到一条查询和一条响应,底部显示的数据包数量明显减少。

如果目标域名出现很多次,可以先只看查询:

dns.qry.name == "example.com" && dns.flags.response == 0

其中 dns.flags.response 是布尔字段,0 表示查询,1 表示响应。这个条件适合先挑出你关心的那一次查询,但下一步配对响应时要改用事务 ID,不能一直保留“仅查询”条件。

步骤三:用事务 ID 配对查询与响应

  1. 在列表中选中目标查询帧。
  2. 展开中间的 Domain Name System 详情。
  3. 找到 Transaction ID,示例假设为 0x4a21。
  4. 同时查看查询详情中的 Response In。该字段指向匹配响应所在的帧号。
  5. 把显示过滤器改为 dns.id == 0x4a21 并应用。

同一个 DNS 事务的查询与响应使用相同事务 ID,因此这个过滤器通常会留下成对的两帧。若列表中还有更多帧,可能是重传、相同 ID 在不同会话中复用,或者抓包跨越了较长时间;此时再结合客户端/服务器 IP、UDP/TCP 会话与帧关联字段判断。

原创网络分析软件界面中使用 dns.id 配对 DNS 查询响应并查看 Request In、Response In 和 Time 字段
图3:用 dns.id 与关联字段配对 DNS 查询和响应的原创结果示意图,不是实际抓包截图。

确认成功:列表中保留同一事务的查询与响应;查询详情能看到 Response In,响应详情能看到 Request In,两者分别指向对方的帧号。选中响应后,还可以看到 dns.time,它表示该响应与关联请求之间的时间差。

步骤四:核对响应码、查询类型和应答记录

选中响应帧,在 Domain Name System (response) 中依次检查:

  • Transaction ID:必须与查询帧一致;
  • Response code:No error 表示协议层返回成功,NXDomain 表示域名不存在;
  • Queries:核对 Name 与 Type,例如 A、AAAA、CNAME;
  • Answers:查看地址、别名、TTL 等实际应答;
  • Request In / Response In:确认 Wireshark 已建立查询与响应关联;
  • Time:观察这次 DNS 往返在抓包中的响应时间。

如果只想看 A 记录查询,可以把过滤器收窄为:

dns.qry.name == "example.com" && dns.qry.type == 1

如果重点是错误响应,可使用:

dns.qry.name == "example.com" && dns.flags.response == 1 && dns.flags.rcode != 0

确认成功:查询名和类型符合预期,响应码可以解释结果,Answers 中包含目标记录;若无 Answers,也应能从响应码、权威区或附加区判断原因。不要把“收到了响应”直接等同于“解析成功”。

步骤五:只导出当前显示的两帧

为了保留最小证据包,先确认过滤器仍是精确事务条件,例如 dns.id == 0x4a21,并检查列表只显示准备导出的帧。然后:

  1. 选择 File → Export Specified Packets。
  2. 在 Packet Range 中选择 Displayed,不要选 Captured。
  3. 范围保持 All packets,含义是“所有当前显示的数据包”。
  4. 输入文件名 dns-example-only.pcapng,选择 pcapng 格式。
  5. 点击 Save。
原创网络分析软件导出对话框中选择 Displayed 和 All packets 保存两条 DNS 数据包
图4:导出当前显示 DNS 数据包的原创操作示意图,Displayed 只保存匹配当前显示过滤器的帧。

确认成功:导出对话框显示的数据包数量与当前列表一致,新文件可以重新打开,并且只包含目标查询、响应及必要的关联帧。官方说明中,Packet Range 默认选择 Displayed;操作时仍建议主动看一眼,避免误导出整份抓包。

常见问题排查

输入 dns.qry.name 后一条都没有

先只输入 dns,确认抓包中是否存在能被解析为 DNS 的报文。如果 dns 也没有结果,可能抓包时间不对、抓包点不对,或者客户端使用了加密 DNS。若有 DNS 但域名条件为空,展开一帧查看实际查询名,注意完整域名、末尾点、大小写和 CNAME 链。

只有查询,没有响应

检查查询详情里是否出现 dns.response_missing 或是否存在 dns.retransmission。也可能是抓包在响应到达前停止、只抓到单向流量、响应走了另一接口,或者端口/协议没有被正确识别。

同一个 dns.id 出现不止两帧

事务 ID 只有 16 位,长时间抓包中可能重复。将它与目标域名、IP 地址和传输会话一起限定。例如先保留 dns.id == 0x4a21,再对照 Source、Destination 和时间,不要仅凭 ID 跨会话配对。

显示过滤器和捕获过滤器有什么区别

显示过滤器作用于已经抓到的数据,只改变当前看到哪些帧;捕获过滤器在抓包时决定哪些帧会被写入文件,语法也不同。本文所有 dns.* 表达式都是显示过滤器,应该输入主窗口顶部的 Display Filter 工具栏。

操作速查

目的显示过滤器结果判断
显示全部 DNSdns确认抓包里存在可解析的 DNS
锁定目标域名dns.qry.name == "example.com"通常同时保留查询和响应
只看目标查询dns.qry.name == "example.com" && dns.flags.response == 0用于挑选具体查询帧
配对同一事务dns.id == 0x4a21结合 Request In 与 Response In 核对
查错误响应dns.flags.response == 1 && dns.flags.rcode != 0查看非成功响应码

完整路线可以压缩成一句话:先用域名找到目标查询,再用事务 ID 配对响应,最后用关联字段、响应码、Answers 和响应时间完成核对。需要分享时,只导出 Displayed 数据包,就能得到体积小、上下文明确的 DNS 证据文件。

声明:本文转载于:17golang原创 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>