抓取分析 DNS 查询流量需三步:精准抓包(tcpdump -i eth0 -n udp port 53)、快速验证(nslookup/dig 触发可控查询)、深入分析(Wireshark 看时延、QTYPE、响应码、重传)。

抓取并分析 DNS 查询流量,核心是捕获 UDP 53 端口的报文(绝大多数 DNS 查询走 UDP),再结合协议结构和时序判断解析是否正常、延迟在哪、有没有重试或失败。整个过程分三步:精准抓包 → 快速验证 → 深入分析。
用 tcpdump 抓 DNS 流量要加关键参数
DNS 默认使用 UDP 协议、端口 53,所以过滤器必须明确指定。不加限制会混入大量无关流量,难以定位:
-
基础命令:`sudo tcpdump -i eth0 -n udp port 53 -w dns.pcap`
其中-i eth0指定真实对外网卡(别用any或lo);-n禁用 DNS 反解,避免卡顿;-w直接保存为 pcap 文件,方便后续分析。 -
边抓边看:去掉
-w,加-A可实时打印 ASCII 内容:sudo tcpdump -i eth0 -n -A udp port 53,能看到域名查询名(如google.com)、查询类型(A、AAAA)、响应码(NOERROR或SERVFAIL)。 -
只抓响应包:若想专注看 DNS 服务器是否返回了结果,可用
udp port 53 and udp[10] & 0x80 != 0过滤响应(第 10 字节最高位为 1 表示是响应包)。
用 nslookup 或 dig 触发可控查询
手动发起 DNS 请求,能让抓包更干净、可复现:
-
nslookup baidu.com 114.114.114.114—— 指定上游 DNS 服务器,排除本机缓存干扰; -
dig @8.8.8.8 example.com A +short—— 更简洁,+short 只显示答案,适合脚本化触发; - 执行前先清空本地缓存(如有 systemd-resolved):
sudo systemd-resolve --flush-caches,确保抓到的是真实递归查询。
在 Wireshark 或命令行里看关键指标
打开 dns.pcap 后,重点不是“有没有包”,而是看“时间、方向、内容、状态”四个维度:
- 时延分析:右键请求包 → Follow → UDP Stream,Wireshark 自动标出请求与响应之间的时间差;若超 1s,说明上游 DNS 响应慢或网络丢包;
-
查询类型匹配:检查 DNS Query 的
QTYPE(如 1=A,28=AAAA)是否与业务实际需求一致;常见问题如客户端只发 AAAA 查询但网络不支持 IPv6,导致超时回退; -
响应码含义:
NOERROR表示查到了(哪怕没记录);NXDOMAIN是域名不存在;SERVFAIL是上游服务器出错,需进一步查该 DNS 服务本身; - 重传识别:同一 ID、相同查询内容的 UDP 包出现多次(间隔约 1s),说明客户端未收到响应,可能被防火墙拦截、UDP 丢包或目标 DNS 不可达。
快速排查典型 DNS 慢场景
不用逐包翻,先看宏观特征:
- 能发不能收:有请求包、无响应包 → 检查防火墙是否放行 UDP 53 出向,或目标 DNS 是否宕机;
-
请求发错地址:抓到发往
127.0.0.1或192.168.x.x的 DNS 请求 → 查/etc/resolv.conf或容器内配置,确认上游 DNS 设置是否正确; - 大量 SERVFAIL 或 REFUSED:可能是 DNS 服务器配置错误、ACL 限制了来源 IP,或使用了不支持的 EDNS 选项;
-
混合 TCP/UDP:响应体 > 512 字节时自动升 TCP(如含大量 DNSSEC 记录),若 TCP 握手失败,也会导致解析卡住——此时需同时抓
tcp port 53。


















