首页/系统/Linux 内核与性能调优速查/tcpdump 常用过滤表达式
网络栈调优98 条

tcpdump 常用过滤表达式

抓包的价值在于精准过滤: 按地址、端口、方向与 TCP 标志组合, 把噪声挡在抓取阶段之外。

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 时,抓到的报文形态可能与线路上实际传输的不同,需要在分析结论里注明抓包时的环境设置。

易错点

  • 表达式语法错误时行为与预期不符,未先用少量包验证就直接放量抓取
  • 在高流量接口无过滤抓包,造成磁盘写满与 CPU 压力
  • 抓到本机网卡层报文就当成链路真实情况,忽略 offload 带来的形态差异
  • 抓到的文件没有记录时间窗口与过滤条件,事后无法解读

数据来源与参考

  • man pcap-filter
  • man tcpdump
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌