tcpdump支持用greater和less按整个数据包长度(含链路层头部)筛选,如“tcpdump -i eth0 less 64”抓≤64字节包;若需精确匹配ip层长度,则用“ip[2:2] > 1400”等原始表达式。

tcpdump 支持直接按数据包长度做条件筛选,核心是用 greater 和 less 两个关键字,它们作用于整个捕获的数据包(含链路层头部,如以太网头14字节),操作简单、无需解析协议字段。
按总长度抓取小包或大包
这是最常用也最直观的方式。tcpdump 把每个收到的原始帧长度作为判断依据:
- 抓取所有 ≤ 64 字节的包(常见于 ARP 请求、ICMP echo request 等轻量交互):
tcpdump -i eth0 less 64 - 抓取所有 ≥ 1500 字节的包(可能含大文件传输、视频流或分片 IP 包):
tcpdump -i eth0 greater 1500 - 组合使用可限定区间,比如只看中等大小流量(64–1500 字节,接近标准以太网 MTU 范围):
tcpdump -i eth0 greater 64 and less 1500
按 IP 层长度精准过滤
如果需要严格匹配 IP 包本身长度(即 IP 头 + 上层数据,不含以太网头),就得用原始表达式读取 IP 头部字段。IP 总长度字段位于 IP 头第 2–3 字节(偏移 2,占 2 字节):
- 抓取 IP 总长恰好为 60 字节的包(最小 IP+ICMP 头):
tcpdump -i eth0 'ip[2:2] == 60' - 抓取 IP 总长 > 1400 字节的包(排除小控制报文,聚焦大数据载荷):
tcpdump -i eth0 'ip[2:2] > 1400' - 注意:该写法要求报文是 IPv4 且未被截断;若用
-s截短快照(如-s 96),可能导致 IP 头不完整,表达式失效。
结合协议与长度联合筛选
单独按长度容易混入干扰包,加协议条件能快速定位目标流量:
- 只抓大于 1000 字节的 TCP 数据段(排除握手小包,聚焦传输主体):
tcpdump -i eth0 'tcp and greater 1000' - 抓小于 100 字节的 DNS 查询(通常 UDP+简短域名):
tcpdump -i eth0 'udp port 53 and less 100' - 排除常见小包后观察异常长 UDP 包(可能为攻击载荷或误配置):
tcpdump -i eth0 'udp and greater 1472 and not port 53'(1472 = 1500 − 20(IP) − 8(UDP))
实际使用中的关键细节
几个容易出错但影响结果的关键点:
- less/greater 是帧长,不是 payload 长:它包含以太网头(14 字节)、VLAN 标签(+4 字节)、IP 头(通常 20)、TCP/UDP 头(通常 20/8)等。想匹配应用层内容长度,需配合 Wireshark 或后续脚本解析。
-
别和
-s参数混淆:-s 0表示全量抓包(不截断),-s 96表示每包最多抓前 96 字节——这影响能否看到完整 IP 头,但不改变greater/less的判断基准。 - 过滤发生在内核态,效率高:这些条件由 BPF(Berkeley Packet Filter)引擎在抓包时实时执行,不会把无用包送入用户空间,大幅降低 CPU 和内存压力。











