TCP 扫描中的“有效响应”过滤器解析
在实现 TCP 半连接扫描(SYN 扫描)时,我们常常希望只抓取“有用的响应”,也就是目标端口开放或关闭的标志包,而忽略其他无关数据。
1️⃣ 核心过滤条件
tcp[13] & 0x12 != 0 or tcp[13] & 0x04 != 0
这句 BPF(Berkeley Packet Filter)表达式的作用是只抓“有效响应”的 TCP 包。我们来拆解一下。
2️⃣ tcp[13] 是什么?
TCP 头部从第 0 字节开始计数,第 13 字节就是 控制位(flags),用 8 个二进制位表示每种标志:
| 比特位 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | 
|---|---|---|---|---|---|---|---|---|
| 含义 | - | - | U | A | P | R | S | F | 
重点关注三种标志:
- S(比特位 1):SYN,表示连接请求/响应
- A(比特位 4):ACK,表示确认
- R(比特位 2):RST,表示重置连接(端口关闭时返回)
3️⃣ 过滤逻辑解析
3.1 SYN-ACK 包(端口开放)
tcp[13] & 0x12 != 0
- 0x12十六进制 → 二进制- 00010010
- S 位(1)和 A 位(4)为 1 → 对应 SYN-ACK
- &按位与运算 → tcp[13] 中这两个位有一个为 1,结果就不为 0
所以这个条件 只匹配端口开放时返回的 SYN-ACK 包。
3.2 RST 包(端口关闭)
tcp[13] & 0x04 != 0
- 0x04十六进制 → 二进制- 00000100
- R 位(2)为 1 → 对应 RST
- &按位与运算 → tcp[13] 中 R 位为 1,结果不为 0
所以这个条件 只匹配端口关闭时返回的 RST 包。
4️⃣ 总结
整个过滤器的意思:
- 只抓有用响应:SYN-ACK(开放)或 RST(关闭)
- 过滤掉无关数据:其他协议、其他 IP 或无关 TCP 包
- 提升效率:扫描器只处理目标端口返回的关键包,节省时间和资源
