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字段,这种情况不能按本文方法直接筛选域名。
这里使用“导入抓包—显示过滤—核对详情—导出精简文件”的路线。它比直接在大文件中滚动列表更适合复盘,也便于把最小证据包交给同事。
步骤一:打开准备好的抓包文件
- 启动 Wireshark,在菜单栏选择 File → Open。
- 在 Open Capture File 对话框中选择
dns-demo.pcapng。 - 点击 Open,等待数据包列表完成载入。

确认成功:主窗口中出现数据包列表,底部状态栏能看到抓包内的数据包数量。如果列表为空,先确认文件没有损坏,并检查是否打开了错误文件。
步骤二:先按域名留下查询和响应
窗口顶部的显示过滤器输入框用于筛选当前列表。输入下面的表达式:
dns.qry.name == "example.com"
输入时 Wireshark 会检查语法。过滤器背景变成有效状态后,按 Enter/Return,或者点击右侧 Apply。由于 DNS 响应通常也包含原查询问题区,这个条件一般会同时留下查询和对应响应。

确认成功:数据包列表的 Protocol 列主要显示 DNS,Info 列中能看到一条查询和一条响应,底部显示的数据包数量明显减少。
如果目标域名出现很多次,可以先只看查询:
dns.qry.name == "example.com" && dns.flags.response == 0
其中 dns.flags.response 是布尔字段,0 表示查询,1 表示响应。这个条件适合先挑出你关心的那一次查询,但下一步配对响应时要改用事务 ID,不能一直保留“仅查询”条件。
步骤三:用事务 ID 配对查询与响应
- 在列表中选中目标查询帧。
- 展开中间的 Domain Name System 详情。
- 找到 Transaction ID,示例假设为
0x4a21。 - 同时查看查询详情中的 Response In。该字段指向匹配响应所在的帧号。
- 把显示过滤器改为
dns.id == 0x4a21并应用。
同一个 DNS 事务的查询与响应使用相同事务 ID,因此这个过滤器通常会留下成对的两帧。若列表中还有更多帧,可能是重传、相同 ID 在不同会话中复用,或者抓包跨越了较长时间;此时再结合客户端/服务器 IP、UDP/TCP 会话与帧关联字段判断。

确认成功:列表中保留同一事务的查询与响应;查询详情能看到 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,并检查列表只显示准备导出的帧。然后:
- 选择 File → Export Specified Packets。
- 在 Packet Range 中选择 Displayed,不要选 Captured。
- 范围保持 All packets,含义是“所有当前显示的数据包”。
- 输入文件名
dns-example-only.pcapng,选择 pcapng 格式。 - 点击 Save。

确认成功:导出对话框显示的数据包数量与当前列表一致,新文件可以重新打开,并且只包含目标查询、响应及必要的关联帧。官方说明中,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 工具栏。
操作速查
| 目的 | 显示过滤器 | 结果判断 |
|---|---|---|
| 显示全部 DNS | dns | 确认抓包里存在可解析的 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 证据文件。
-
154 收藏
-
304 收藏
-
170 收藏
-
166 收藏
-
229 收藏
-
152 收藏
-
494 收藏
-
477 收藏
-
176 收藏
-
文章 · 软件教程 | 12小时前 | jdk · 软件教程 · Java工具链 JetBrains IDE Gradle JVM Gradle Toolchain 自动下载JDK Download JDK364 收藏
-
文章 · 软件教程 | 14小时前 | 开发工具 · 软件教程 · Docker Desktop磁盘占用 容器磁盘空间 docker system df Disk usage limit Docker卷大小136 收藏
-
341 收藏
-
190 收藏
-
332 收藏
-
222 收藏
-
109 收藏
-
321 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 485次学习