标志位过滤是什么
按 TCP 标志位过滤,是定位「连不上、被重置、谁先拆连接」这类问题最直接的手段。标志位是 TCP 首部里的几个比特:SYN 表示建连请求,SYN-ACK 表示同意,RST 表示复位,FIN 表示主动关闭。tcpdump 提供了 tcp-syn、tcp-ack、tcp-fin、tcp-rst 等名称可直接参与位运算,比手工记字节偏移可靠——IP 首部长度可变,硬编码偏移在带选项的报文上会错位。
基本信息
| 适用平台 | Linux、macOS 与 BSD 的命令行抓包工具 |
|---|---|
| 权限 | 需要 root 或原始套接字能力 |
| 表达式形式 | 对标志位字段做位运算,或用内置名称参与比较 |
| 语法提示 | 整条表达式加单引号,避免 shell 解释特殊字符 |
| 配套开关 | -nn 关闭名称解析、-c 限条数、-w 落盘留证 |
典型使用场景
- 确认请求到底有没有发出去:只抓纯 SYN,样本最干净
- 判断对方是否回应:抓 SYN 后再抓 SYN-ACK,看握手停在哪一步
- 定位连接被谁中断:抓复位报文,看是服务端、客户端还是中间设备发出
- 看谁先关闭连接:抓关闭报文,判断连接消耗在哪一侧
- 过滤噪声:只保留控制报文,从海量数据包里快速看清连接过程
标志位过滤
标志位过滤
tcpdump -nn -i eth0 'tcp[tcpflags] & tcp-syn != 0' # 任意含 SYN 的报文
tcpdump -nn -i eth0 'tcp[tcpflags] == tcp-syn' # 纯 SYN:握手第一个包
tcpdump -nn -i eth0 'tcp[tcpflags] & tcp-rst != 0' # 复位报文
tcpdump -nn -i eth0 'tcp[tcpflags] & tcp-fin != 0' # 关闭报文
tcpdump -nn -i eth0 'tcp[tcpflags] & (tcp-syn|tcp-ack) == (tcp-syn|tcp-ack)' # SYN-ACK
tcpdump -nn -i eth0 -c 20 'host <目标IP> and tcp[tcpflags] & tcp-rst != 0' # 限条数,便于判读标志名称与用途
| 名称 | 含义 | 典型用途 |
|---|---|---|
| tcp-syn | 建立连接请求 | 判断请求是否发出、对端是否响应 |
| tcp-ack | 确认 | 与 SYN 组合识别握手第二个包 |
| tcp-fin | 正常关闭 | 看哪一侧先发起关闭 |
| tcp-rst | 复位 | 判断连接被谁强制中断 |
| tcp-push | 推送数据 | 标识数据报文 |
| tcp-urg | 紧急指针 | 极少使用,排查中基本用不到 |
排查「为什么连不上」先抓纯 SYN,看对端是否回 SYN-ACK 或 RST:回 SYN-ACK 说明网络与端口都通,问题在应用;回 RST 说明被主动拒绝;什么都不回则多是被中间设备静默丢弃。
在带 VLAN 标签或隧道封装的接口上,标志位所在的偏移基准与预期不同,直接做位运算匹配可能抓不到目标报文。先用不带标志条件的表达式确认能抓到流量,再逐层加上标志位条件。