用tcpdump抓DNS流量应优先通过端口过滤:UDP 53(占95%以上)或TCP 53(响应超长、DNSSEC等),使用port domain或port 53最可靠;需结合-udp、-v、-nn等参数区分请求(QR=0,源端口随机)与响应(QR=1,源端口53),并用-w保存pcap供Wireshark深度解析。

直接用 tcpdump 抓 DNS 流量,关键不是“解析域名”,而是准确捕获、清晰区分请求与响应,并为后续分析打好基础。它本身不翻译域名或记录类型,但能精准反映网络层行为——这才是排查 DNS 问题的第一步。
抓对包:用端口过滤最可靠
DNS 默认走 UDP 53 端口(占日常流量 95% 以上),少数情况用 TCP 53(如响应超长、DNSSEC、区域传输)。tcpdump 不看报文内容,只认端口和协议:
-
tcpdump -i eth0 udp port 53 -nn—— 只抓 UDP DNS 流量,干净无干扰 -
tcpdump -i eth0 port domain -nn——domain是内置别名,等价于port 53,更语义化 -
tcpdump -i eth0 src host 192.168.1.100 and dst port 53 -nn—— 只看本机发出的查询请求 - 避免写
tcpdump ... | grep "google"这类文本过滤,原始二进制里没有明文域名,会漏包
分清方向:看端口 + QR 标志位
DNS 请求和响应都走 53 端口,靠方向和标志位区分:
-
请求(Query):源端口随机(如
42391),目的端口53;输出末尾标QR=0或带+(表示 RD=1,期望递归) -
响应(Response):源端口
53,目的端口是客户端那个随机端口;输出末尾标QR=1,且事务 ID(如57864)与上一行请求一致 - 加
-v参数才能看到QR、rd、ra、ancount等关键字段,例如:57864+ A? google.com. (28)→ 请求57864 1/0/0 A 172.217.164.110 (44)→ 响应(1/0/0表示 1 条回答、0 条权威、0 条附加)
导出文件:交给 Wireshark 深度解析
tcpdump 的强项是捕获,不是应用层解码。想看到具体查的是什么域名、返回了哪些 IP、CNAME 链、TTL、响应码(NOERROR/NXDOMAIN/REFUSED),必须导出 pcap:
-
tcpdump -i eth0 port 53 -nn -w dns.pcap—— 保存原始包 - 用 Wireshark 打开
dns.pcap,点开任意 DNS 包,在 “Domain Name System” 展开区就能看到完整字段:Query Name、Query Type、Answers、Authority、Additional 等 - Wireshark 还支持显示过滤器,比如
dns.qry.name contains "baidu"或dns.flags.rcode == 3(NXDOMAIN),这是tcpdump做不到的
实用小技巧提升效率
几个轻量参数让输出更聚焦、更稳定:
-
-nn:禁用 IP 和端口反向解析,避免卡顿,显示192.168.1.10.54321而非host10.local.54321 -
-c 20:限制抓 20 个包,防止刷屏,适合快速验证 -
-s 512:设置快照长度,确保 DNS 头部和部分负载被完整捕获(默认足够,但显式指定更安心) - 配合
host或dig触发可控查询:dig @114.114.114.114 www.example.com A,再在另一终端运行 tcpdump,可精准对应分析


















