如何使用数据包过滤器根据标志过滤 TCP 数据包

如何使用数据包过滤器根据标志过滤 TCP 数据包

嗯,我不知道该如何提出这个问题,但我知道您可以使用关键字标志来指定您想要过滤的标志。

根据数据包过滤器的文档:

为了让 PF 在评估规则时检查 TCP 标志,请使用 flags 关键字,语法如下:

标志检查/屏蔽标志任何

mask 部分告诉 PF 只检查指定的标志,而 check 部分指定了在 header 中哪些标志必须为“on”才能匹配。使用 any 关键字允许在 header 中设置任意标志组合。

在 fxp0 proto tcp 上从任意端口向任意端口传递 ssh 标志 S/SA 在 fxp0 proto tcp 上从任意端口向任意端口传递 ssh

由于默认设置了 S/SA 标志,因此上述规则是等效的,这些规则中的每一个都通过设置了 SYN 标志的 TCP 流量,同时仅查看 SYN 和 ACK 标志。带有 SYN 和 ECE 标志的数据包将匹配上述规则,而带有 SYN 和 ACK 或仅带有 ACK 的数据包则不会。

因此,我理解了这个例子,以及为什么带有标志 S 和 E 的数据包可以通过(因为由于掩码 SA,E 标志没有被考虑)以及为什么只有 Ack 标志的数据包不能通过防火墙。

我不明白的是,如果数据包头中的标志 S 为“开”,那么带有标志 S 和 A 的数据包为什么不能通过规则 S/SA。也许文档含糊不清?如果这是一个愚蠢的问题或英语理解有误,请见谅。

我想它只有当必须具有标志 S 时才能通过。在集合算术中将是这样的:

标题中的标志必须为“on”->标志与屏蔽子集有关 [pf doc] 标题中的标志必须为“on”->标志与屏蔽子集相等 [我从给出的例子中理解到的]

提前致谢!

答案1

这意味着您正在查看两个标志S,但当且仅当“开”和“关”A时,您才匹配。SA

flags S/SA

 ---------------
| S | A | Match |
 ---|---|-------
| 0 | 0 | No    |
| 0 | 1 | No    |
| 1 | 0 | Yes   |
| 1 | 1 | No    |
 ---------------

如果您希望在两个SA标志都为“开”时进行匹配,则可以使用flags SA/SA

flags SA/SA

 ---------------
| S | A | Match |
 ---|---|-------
| 0 | 0 | No    |
| 0 | 1 | No    |
| 1 | 0 | No    |
| 1 | 1 | Yes   |
 ---------------

相关内容