macOS自带诊断工具配合Wireshark可清晰还原DNS查询全过程:先用sudo dscacheutil -flushcache && sudo killall -HUP mDNSResponder清缓存,再用nslookup -debug触发可控查询,Wireshark以port 53捕获后通过dns && ip.addr == [DNS服务器IP]筛选,结合Follow UDP Stream对照报文各字段解析完整流程。

macOS 自带的诊断工具配合 Wireshark,能清晰还原 DNS 查询全过程。不需要额外装服务器或改配置,重点是让系统“吐出干净的 DNS 流量”,再用工具精准捕获和解读。
确认当前 DNS 设置并清空缓存
macOS 的 DNS 解析行为受多个层级影响:应用层缓存(如 Safari)、系统级 mDNSResponder 缓存、以及 /etc/resolver/ 或网络设置里的 DNS 服务器。排查前先重置:
- 清除系统 DNS 缓存(不同 macOS 版本命令略有差异):
sudo dscacheutil -flushcache sudo killall -HUP mDNSResponder
- 查看当前生效的 DNS 服务器:
scutil --dns | grep nameserver
这能帮你确认抓包时目标 DNS 服务器地址,后续在 Wireshark 中可过滤
ip.addr == [该IP] && port == 53。
用 nslookup 触发可控 DNS 查询
浏览器访问会触发预连接、HTTP/HTTPS、DoH 等干扰项,建议用 nslookup 发起纯 DNS 查询:
- 基础查询(使用系统默认 DNS):
nslookup example.com
- 指定 DNS 服务器(避开 DoH/加密 DNS 干扰):
nslookup example.com 8.8.8.8
- 开启详细模式,看到协议交互细节:
nslookup -debug example.com 8.8.8.8
它会在终端输出完整的请求/响应节(QUESTION、ANSWER、AUTHORITY、ADDITIONAL),正好对应 Wireshark 里 DNS 报文的四个 section。
Wireshark 抓包与关键过滤技巧
macOS 上 Wireshark 需要管理员权限才能捕获流量:
- 启动时用终端运行(避免权限问题):
sudo /Applications/Wireshark.app/Contents/MacOS/Wireshark
- 选择活跃接口(如
en0有线 /en1Wi-Fi),设置捕获过滤器为:port 53
这比显示过滤器dns更高效——它从源头减少数据包摄入,避免丢包或内存溢出。 - 抓包过程中执行
nslookup命令,停止后立即筛选:- 显示过滤器输入
dns && ip.addr == 8.8.8.8(替换为你用的 DNS 服务器) - 右键某条 DNS 请求 → “Follow → UDP Stream”,可对照查看请求与响应的原始字节映射
- 显示过滤器输入
看懂 DNS 报文核心字段
Wireshark 展开 DNS 协议树后,重点关注:
Header 区域
QR=0表示这是查询;QR=1是响应RD=1说明客户端要求递归查询(常见);RA=1表示服务器支持递归(响应中才有)TC=1提示响应被截断,需换 TCP 重试(此时你会看到后续 TCP 53 端口的连接)Question Section
显示查询域名(如example.com)和类型(A、AAAA、MX等)Answer Section
正常解析成功时,这里会有A记录(IPv4 地址)或CNAME;若为空且RCODE=3,代表NXDOMAINAuthority / Additional Sections
权威服务器信息或 IP 地址(如 NS 记录对应的 A 记录),常用于迭代查询链路追踪
不复杂但容易忽略


















