网络命令82 条

tcpdump 高级过滤

从「抓个包看看」升级到精准定位:按 TCP 标志位、端口段、VLAN、包长过滤,配合轮转落盘抓长时间窗口。

Linux 运维命令速查系统更新于 2026-10-13

高级过滤解决什么

把 tcpdump 从「抓个包看看」升级到精准定位,靠的是 BPF 过滤表达式:按 TCP 标志位只看握手与挥手、按端口区间过滤、按 VLAN 标签与包长筛选,再配合 -c 限量与 -C/-W 轮转落盘覆盖长时间窗口。抓包最核心的价值是回答「包到底到没到、有没有回」,所以在链路两端用同一条件同时抓、对比收发差异,往往比在单点反复抓包更快定位。注意 -w 写出的是二进制 pcap 文件,回读要用 tcpdump -r 或 Wireshark。

基本信息

适用平台Linux(tcpdump 与 libpcap;需要 CAP_NET_RAW 能力或 root)
命令语法tcpdump -ni 接口 '过滤表达式'
常用表达式tcp[tcpflags]、portrange、vlan、greater 与 less、and/or/not、host/src/dst
落盘与轮转-w 写文件 -C 单文件大小(MB) -W 保留文件个数 -G 按时间切分
辅助选项-e 显示链路层头 -A 按 ASCII 显示内容 -s0 抓取完整包 -c 限量

典型使用场景

  • 握手确认:只看 SYN 与 SYN-ACK,判断连接建立到了哪一步
  • 丢包定界:两端同时抓,看请求是否到达对端、响应是否返回
  • 协议分析:抓取特定端口段交互,导出后用专业工具逐包看
  • 异常流量取证:长时间窗口滚动抓包,保留现场供事后分析
  • 二层问题:带 VLAN 标签的流量过滤与链路层头部检查

常用示例

常用示例
tcpdump -ni eth0 'tcp[tcpflags] & (tcp-syn|tcp-fin) != 0'   # 只抓握手与挥手
tcpdump -ni eth0 'portrange 8000-8100'                     # 端口段
tcpdump -ni eth0 -c 20 'vlan 100 and ip'                   # VLAN 内流量
tcpdump -ni eth0 -s0 -w /tmp/cap.pcap -C 100 -W 20 'host 10.0.0.5 and port 443'
tcpdump -ni eth0 -A -s0 'port 80 and greater 500'          # 按 ASCII 看内容
tcpdump -r /tmp/cap.pcap -nn | head -n 20                  # 回读抓包文件
tcpdump -ni eth0 -c 50 'tcp port 443 and host 10.0.0.9'

表达式要点

表达式作用说明
tcp[tcpflags] 位运算按 TCP 标志位过滤只看 SYN、FIN 或 RST,用于握手与异常中断分析
portrange 8000-8100按端口区间过滤比逐个写 port 更简洁,适合微服务端口段
vlan 100过滤指定 VLAN 标签排查带标签流量的二层问题
greater 500 与 less 100按包长过滤排除心跳小包,或只看大响应
host 与 src/dst按地址与方向过滤双向与单向抓取的差别会影响结论
排查「包到没到」时在链路两端同时抓同一条件,对比一端发了什么、另一端收到并回了什么,能直接定位丢包发生在哪一段。
生产机上抓包必须限量限时:用 -c 限制包数,或用 -C/-W 轮转控制磁盘占用,同时盯住抓包目录容量。高流量接口上无限制抓包会写满磁盘。

易错点

  • 用文本工具处理 -w 生成的二进制文件,得到乱码且分析无从下手
  • 忘加 -c 或轮转参数,把磁盘写满引发新的故障
  • 只在单点抓包就下结论,没有端到端对比,无法判断丢包位置
  • 抓包文件含业务明文内容,导出与留存未按数据合规要求处理

数据来源与参考

  • man 8 pcap-filter(tcpdump 官方手册)
  • man 8 tcpdump

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌