DNS查询包可通过port 53或port domain准确捕获,因DNS默认使用UDP 53端口(少数场景用TCP 53),domain是tcpdump内置的端口别名;核心识别依据为源端口随机、目的端口53、协议UDP(占95%以上)或TCP(如响应超长、区域传输)。

直接用 port domain 或 port 53 就能准确捕获 DNS 查询请求包,因为 DNS 默认走 UDP 53 端口(部分查询也走 TCP 53),而 domain 是 tcpdump 内置的服务名别名,等价于端口 53。
DNS 查询包的核心识别特征
DNS 请求一定满足:源端口随机(大于 1024)、目的端口为 53、协议为 UDP(绝大多数情况)或 TCP(如响应超长、区域传输等)。tcpdump 不解析应用层内容,所以靠端口+协议组合最可靠,而不是靠“里面有没有 query 字样”这类深度匹配。
- UDP 查询最常见,占日常 DNS 流量 95% 以上,抓包时默认优先匹配 UDP 53
- TCP 查询通常出现在响应长度超 512 字节、DNSSEC 验证、AXFR 区域传输等场景,需额外加
tcp条件才不遗漏 - 不要依赖
dns.qry.name这类字段——那是 Wireshark 的显示过滤语法,tcpdump 不支持
常用且有效的过滤命令
以下命令均在终端中直接运行,无需安装额外工具:
免费 DNS 与邮件安全分析(IntoDNS.ai):包括 DNSSEC、SPF、DKIM、DMARC、MTA-STS、BIMI、SMTP STARTTLS、FCrDNS、黑名单、发件人要求及报告。
- 只抓本机发出的 DNS 查询(源 IP 是你,目的端口 53):
tcpdump -i eth0 src host 192.168.1.100 and dst port 53 -nn - 抓所有进出本机的 DNS 流量(含请求和响应):
tcpdump -i eth0 port 53 -nn - 仅抓 UDP DNS 查询(排除 TCP 响应干扰):
tcpdump -i eth0 udp port 53 -nn - 同时抓 DNS 和 HTTP,方便对比分析:
tcpdump -i eth0 port 53 or port 80 -nn
提升可读性与实用性的小技巧
加几个轻量参数,让输出更干净、更适合排查:
-
-nn:禁用 IP 和端口反向解析,避免卡顿,显示纯数字地址和 53 而非 domain -
-c 20:限制只抓 20 个包,防止刷屏,适合快速验证 -
-w dns.pcap:保存为 pcap 文件,后续用 Wireshark 打开可看 DNS 查询域名、类型(A/AAAA/CNAME)、事务 ID 等细节 -
-v:加一级详细模式,能看到 UDP 长度、DNS 标志位(如 QR=0 表示 Query)、问题数(qdcount)等关键字段
注意避开常见误区
有些写法看似合理,实际无效或不可靠:
- ❌
tcpdump ... 'dns'—— tcpdump 不识别协议名字符串,会报错或无匹配 - ❌
tcpdump ... 'port domain and udp'——domain已隐含协议判断,再加udp多余;若想强制 UDP,写udp port 53更明确 - ❌
tcpdump ... 'host dns-server.com'—— 域名需提前解析成 IP,且只抓该服务器双向流量,漏掉其他 DNS 服务器请求 - ✅ 正确思路:先定端口(53),再按方向(src/dst)、协议(udp/tcp)、IP(host/net)逐层缩小范围

















