Wireshark 如何用显示过滤器追踪一次 DNS 查询
用 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 证据文件。
用 ResponseController 在代理中逐块刷新数据
- 上一篇
- 用 ResponseController 在代理中逐块刷新数据
- 下一篇
- 设置写截止时间后流式响应为何仍然阻塞
-
- 文章 · 软件教程 | 3小时前 | chrome · Chrome DevTools 前端联调 Local Overrides 覆盖网络响应 XHR fetch
- Chrome DevTools 如何覆盖网络响应做前端联调
- 152浏览 收藏
-
- 文章 · 软件教程 | 5小时前 | obsidian · 软件教程 · 笔记元数据 Obsidian属性 Properties view 全局重命名
- Obsidian 如何用属性视图批量整理笔记元数据
- 494浏览 收藏
-
- 文章 · 软件教程 | 7小时前 |
- Figma 如何用变量模式切换浅色与深色主题
- 477浏览 收藏
-
- 文章 · 软件教程 | 10小时前 |
- Postman 如何用变量范围隔离测试与生产环境
- 176浏览 收藏
-
- 文章 · 软件教程 | 12小时前 | jdk · 软件教程 · Java工具链 JetBrains IDE Gradle JVM Gradle Toolchain 自动下载JDK Download JDK
- JetBrains IDE 怎样让 Gradle Toolchain 自动下载缺失 JDK
- 364浏览 收藏
-
- 文章 · 软件教程 | 14小时前 | 开发工具 · 软件教程 · Docker Desktop磁盘占用 容器磁盘空间 docker system df Disk usage limit Docker卷大小
- Docker Desktop 如何查看并限制容器磁盘占用
- 136浏览 收藏
-
- 文章 · 软件教程 | 16小时前 |
- GitHub Desktop 如何比较两个分支并只恢复一个文件
- 341浏览 收藏
-
- 文章 · 软件教程 | 18小时前 | vs code · VS Code 软件设置 扩展管理 扩展自动更新 extensions.autoUpdateDelay
- VS Code 怎样为扩展自动更新设置延迟窗口
- 190浏览 收藏
-
- 文章 · 软件教程 | 20小时前 | vs code · SSH VS Code Dev Containers Remote-SSH 远程容器
- VS Code 如何把远程 Dev Container 会话接入 SSH 项目
- 332浏览 收藏
-
- 文章 · 软件教程 | 21小时前 | 软件教程 · 接口调试 · firefox 网络请求 浏览器开发者工具 HAR Edit and Resend
- 浏览器开发者工具保存并重放网络请求的实用方法
- 222浏览 收藏
-
- 文章 · 软件教程 | 23小时前 | shell · 开发环境 云开发环境 Shell配置 GitHub Codespaces dotfiles install.sh
- GitHub Codespaces 用 dotfiles 初始化个人开发环境
- 109浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- PubMedQA
- 深入了解PubMedQA生物医学问答数据集,涵盖其核心功能、使用方法及在临床决策、药物研发等场景的应用,助力提升NLP模型性能。
- 393次使用
-
- H2O EvalGPT
- H2O EvalGPT是H2O.ai推出的开源LLM评估平台,提供详细的大模型性能排行榜、行业特定基准测试及A/B测试功能,助您快速选择最适合项目的高性能大语言模型。
- 472次使用
-
- LMArena
- LMArena是加州大学伯克利分校推出的AI模型匿名评测平台。通过盲测投票机制,用户可对比不同大模型回答并生成实时排行榜,助力开发者优化模型及用户选择最佳AI工具。
- 478次使用
-
- HELM
- 深入了解斯坦福推出的HELM(Holistic Evaluation of Language Models)大模型评测体系。本文解析其核心功能、安装配置步骤及应用场景,涵盖准确性、公平性、鲁棒性等多维度指标,助力开发者全面优化语言模型性能。
- 421次使用
-
- MMBench
- MMBench是由上海人工智能实验室等机构联合推出的多模态基准测试平台,提供细粒度能力评估、大规模数据集及VLMEvalKit工具。本文详细介绍其核心功能、安装使用方法及应用场景,助力开发者全面评估多模态模型性能。
- 248次使用
-
- golang DNS服务器的简单实现操作
- 2022-12-31 154浏览
-
- Go tls.Config KeyLogWriter 怎么用于受控调试
- 2026-09-27 304浏览
-
- Go DNS 解析结果为什么和系统命令不一致
- 2026-09-07 170浏览
-
- Go net.Resolver PreferGo 改变解析结果时怎么排查
- 2026-09-08 166浏览
-
- Go DNS 查询超时时为什么 context 已取消仍有延迟
- 2026-09-08 229浏览

