tcpdump 过滤表达式
抓包的价值主要在于过滤:用 BPF 表达式把无关流量挡在抓取阶段之外,既减轻磁盘与 CPU 压力,也让后续分析变得直接。表达式可以由地址、端口、方向、协议和 TCP 标志位组合而成。需要注意的是,表达式写错通常不会报错,只会安静地抓到不符合预期的结果。
基本信息
| 基础条件 | host、net、port、portrange |
|---|---|
| 方向限定 | src、dst,可与地址或端口组合 |
| 标志位匹配 | tcp[tcpflags] 与 tcp-syn、tcp-ack 组合 |
| 完整报文 | -s 0 抓到全长,便于后续分析 |
| 落盘与限流 | -w 写文件,-c 限制包数,-i 指定接口 |
典型使用场景
- 定位单个服务的交互异常,按主机与端口精确过滤
- 抓 SYN 包分析连接建立失败与重传
- 按方向抓取只关心入向或出向的流量
- 长时间留证:写文件并在事后用分析工具复查
- 验证过滤表达式:先用少量包确认再放量抓取
常用表达式
常用表达式
tcpdump -i eth0 -nn -c 100 'host 203.0.113.10 and port 8080'
tcpdump -i eth0 -nn 'tcp[tcpflags] & (tcp-syn|tcp-ack) == tcp-syn' # 只看 SYN
tcpdump -i eth0 -nn 'src 10.0.0.5 and dst port 443' # 限定方向与端口
tcpdump -i eth0 -s 0 -w /tmp/app.pcap 'port 443' # 抓全长并落盘
# 先用 -c 10 验证表达式,再放大抓取范围常用表达式速查
| 表达式 | 含义 | 典型用途 |
|---|---|---|
| host A | 与 A 双向通信的报文 | 单机问题定位 |
| net 10.0.0.0/8 | 整个网段内流量 | 网段级排查 |
| port 8080 | 源或目的端口为 8080 | 服务交互分析 |
| src host A and dst port B | 指定方向的精确组合 | 排除反向噪声 |
| tcp[tcpflags] & tcp-rst != 0 | 带 RST 标志的包 | 连接被重置的排查 |
使用注意
- 表达式先用少量包验证,避免抓到一堆无关数据
- 高流量接口上必须加过滤条件,无过滤抓包会产生磁盘与 CPU 压力
- 抓包需要相应权限,生产环境应事先获得授权
- 落盘文件体积按流量估算,避免写满磁盘
落盘前先估算体积:一个满速万兆接口的完整抓包文件增长极快,务必用过滤条件与 -c 限制范围,并把文件写到有足够空间的分区。
主机开启了 offload 时,抓到的报文形态可能与线路上实际传输的不同,需要在分析结论里注明抓包时的环境设置。