嗯,我不知道该如何提出这个问题,但我知道您可以使用关键字标志来指定您想要过滤的标志。
根据数据包过滤器的文档:
为了让 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
时,您才匹配。S
A
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 |
---------------