高级过滤解决什么
把 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 轮转控制磁盘占用,同时盯住抓包目录容量。高流量接口上无限制抓包会写满磁盘。