tcpdump可通过tcpflags关键字精准捕获FIN包:'tcp[tcpflags] & tcp-fin != 0'捕获所有含FIN的包,'tcp[tcpflags] == tcp-fin'仅捕获纯FIN包,'tcp[tcpflags] & (tcp-fin|tcp-ack) == (tcp-fin|tcp-ack)'精确匹配FIN+ACK组合。

直接用 tcpdump 的 tcp[tcpflags] & tcp-fin != 0 表达式就能精准捕获带 FIN 标志的 TCP 包,无需解析原始字节或硬算数值。
用标准 tcpflags 过滤最可靠
tcpdump 内置了对 TCP 标志位的语义支持,推荐优先使用 tcpflags 关键字,写法清晰且不易出错:
-
tcpdump -i eth0 'tcp[tcpflags] & tcp-fin != 0'—— 捕获所有含 FIN 的包(包括 FIN+ACK、FIN 单独等) -
tcpdump -i eth0 'tcp[tcpflags] == tcp-fin'—— 只捕获纯 FIN 包(不带 ACK、SYN 等其他标志) -
tcpdump -i eth0 'tcp[tcpflags] & (tcp-fin|tcp-ack) == (tcp-fin|tcp-ack)'—— 精确匹配 FIN+ACK 组合
用字节偏移过滤(兼容老版本)
若环境不支持 tcpflags(极少见),可按 TCP 头第 13 字节(0 起始计数)手动判断。FIN 对应二进制值 1,十进制即 1:
-
tcpdump -i eth0 'tcp[13] & 1 != 0'—— 等效于检测 FIN 是否置位 -
tcpdump -i eth0 'tcp[13] == 1'—— 仅匹配纯 FIN(无其他标志) -
tcpdump -i eth0 'tcp[13] == 17'—— 匹配 FIN+ACK(1 + 16)
配合常用选项提升实用性
实际抓包时建议叠加以下参数,避免干扰、加快分析:
- 加
-n禁用 DNS 解析,防止延迟和混淆 - 加
-nn同时禁用端口名解析(如显示22而非ssh) - 加
-c 50限制只抓 50 个包,避免持续运行 - 加
-A以 ASCII 方式显示载荷,方便确认是否为真实连接终止行为
验证 FIN 包的典型输出特征
捕获到的 FIN 包在输出中会明确标出 [F] 或 [F.](表示 FIN+ACK):
注意:[F.] 中的点(.)代表 ACK 标志同时存在,这是四次挥手第二步的常见形态。


















