tcpdump可通过BPF过滤表达式精准捕获异常TCP标志位组合,如SYN+FIN、RST无ACK等,并结合端口、方向、保存pcap及分步验证提升分析效率。

直接用 tcpdump 捕获带特定 TCP Flag 的报文,关键在 BPF 过滤表达式里用 tcp[tcpflags] 匹配标志位字段,再结合逻辑运算符精准筛选异常行为(如非法的 FIN+SYN、无 ACK 的 RST 等)。
识别并捕获常见异常 TCP Flag 组合
TCP 头部的 flags 字段占 1 字节(8 位),常用标志位对应二进制位:SYN=0x02,ACK=0x10,FIN=0x01,RST=0x04,PSH=0x08,URG=0x20。tcpdump 不支持直接写 tcp[13] & 0x02 == 0x02 这类原始偏移计算,而是提供更简洁的语法:
-
捕获同时带 SYN 和 FIN 的包(明显违反协议,常用于扫描或攻击探测):
sudo tcpdump -i any 'tcp[tcpflags] & (tcp-syn|tcp-fin) == (tcp-syn|tcp-fin)' -
捕获不带 ACK 却带 RST 的包(可能为异常连接重置):
sudo tcpdump -i any 'tcp[tcpflags] & tcp-rst != 0 and tcp[tcpflags] & tcp-ack == 0' -
捕获只有 SYN 没有 ACK 的初始连接请求(正常三次握手中的第一步):
sudo tcpdump -i any 'tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack == 0' -
捕获纯 ACK 包(无数据、无控制标志)(可用于检测空闲连接保活或异常确认):
sudo tcpdump -i any 'tcp[tcpflags] == tcp-ack'
结合端口与方向缩小分析范围
单独看 flag 容易误报,加端口和流向能定位真实问题场景:
- 只看发往 Web 服务(80/443)的异常 SYN+FIN:
sudo tcpdump -i eth0 'dst port 80 or dst port 443 and tcp[tcpflags] & (tcp-syn|tcp-fin) == (tcp-syn|tcp-fin)' - 监控本机对外发起连接时,出现无 ACK 的 RST(可能被中间设备拦截):
sudo tcpdump -i any 'src host 192.168.1.100 and tcp[tcpflags] & tcp-rst != 0 and tcp[tcpflags] & tcp-ack == 0' - 排除本地回环和已知健康服务(如 SSH、DNS),专注可疑流量:
sudo tcpdump -i any 'not port 22 and not port 53 and not host 127.0.0.1 and tcp[tcpflags] & tcp-urg != 0'(捕获带 URG 的包,较少见)
保存并离线深度分析异常报文
实时终端输出容易遗漏细节,建议先存为 pcap 文件,再用 tcpdump -r 或 Wireshark 分析:
- 静默捕获前 50 个异常 SYN+FIN 包:
sudo tcpdump -i any -c 50 -w synfin_alert.pcap 'tcp[tcpflags] & (tcp-syn|tcp-fin) == (tcp-syn|tcp-fin)' - 查看文件中前 3 个包的 ASCII 载荷(检查是否含恶意字符串):
tcpdump -r synfin_alert.pcap -A -c 3 - 用 Wireshark 打开 pcap,按
tcp.flags.syn == 1 && tcp.flags.fin == 1过滤,右键 Follow → TCP Stream 查看完整交互上下文
快速验证 flag 表达式是否生效
运行命令后若无输出,不一定是没流量,可能是表达式写错。可分步验证:
- 先抓所有 TCP 包确认接口和权限正常:
sudo tcpdump -i any -c 5 tcp - 再加简单 flag 条件,比如只抓 SYN:
sudo tcpdump -i any -c 5 'tcp[tcpflags] & tcp-syn != 0' - 最后组合复杂条件。注意单引号包裹整个表达式,避免 shell 解析空格或括号


















