Linux中tcpdump过滤TCP标志位需用tcp[13]配合掩码,如tcp[13]==2抓SYN、tcp[13]&18==18抓SYN+ACK,结合端口和IP可精确定位流量。

在 Linux 中用 tcpdump 抓取并过滤特定 TCP 标志位,核心是使用 BPF(Berkeley Packet Filter)语法中的 tcp[tcpflags] 表达式。TCP 标志位存在于 TCP 头部的第 13 字节(从 0 开始计数),需通过字节偏移和掩码操作来匹配。
识别常用 TCP 标志位对应值
TCP 标志位在 TCP 头部第 13 字节(即 tcp[13])中,各标志位对应二进制位如下:
- FIN → 0x01
- SYN → 0x02
- RST → 0x04
- PSH → 0x08
- ACK → 0x10
- URG → 0x20
- ECE → 0x40
- CWR → 0x80
实际过滤时,常用组合有:tcp[13] & 0x02 != 0(含 SYN)、tcp[13] == 0x02(仅 SYN)、tcp[13] & 0x12 == 0x12(SYN+ACK 同时置位)等。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
抓取常见 TCP 标志组合的实用命令
以下命令均建议加 -nn -i any(禁用解析、监听所有接口),并用 sudo 执行:
- 只抓 SYN 包(三次握手第一步):
sudo tcpdump -nn 'tcp[13] == 2' - 抓 SYN 或 SYN-ACK(即含 SYN 标志的包):
sudo tcpdump -nn 'tcp[13] & 2 != 0' - 抓纯 ACK 包(无 SYN/RST/FIN/PSH/URG):
sudo tcpdump -nn 'tcp[13] == 16' - 抓 FIN+ACK 组合(主动关闭连接):
sudo tcpdump -nn 'tcp[13] == 17'(0x10 | 0x01 = 17) - 抓 RST 包(异常中断):
sudo tcpdump -nn 'tcp[13] & 4 != 0'
结合端口与方向进一步精确定位
单独看标志位容易混入无关流量,推荐叠加条件:
- 抓目标端口 80 上的所有 SYN 包:
sudo tcpdump -nn 'tcp dst port 80 and tcp[13] == 2' - 抓来自 192.168.1.100 的 RST 包:
sudo tcpdump -nn 'src host 192.168.1.100 and tcp[13] & 4 != 0' - 抓某 IP 对某端口发起的完整三次握手(SYN → SYN-ACK → ACK):
sudo tcpdump -nn 'host 10.0.0.5 and (tcp[13] == 2 or tcp[13] == 18 or tcp[13] == 16)'
(其中 18 = 0x12 = SYN+ACK)
验证与调试小技巧
首次使用建议先加 -v 或 -vv 查看原始标志字段输出,确认匹配逻辑:
- 运行
sudo tcpdump -vv -c 5 'tcp port 22',观察输出中类似Flags [S]、Flags [S.]、Flags [.]的标记,对应 SYN、SYN-ACK、纯 ACK - 用
-X查看 TCP 头部原始字节,定位第 13 字节值,辅助调试表达式是否准确 - 避免遗漏:注意 TCP 标志位是「或」关系,
tcp[13] == 18只匹配严格等于 18 的包;若想捕获「只要含 SYN 和 ACK」,应写tcp[13] & 18 == 18

















