2

好吧,我并不确切知道如何提出这个问题,但我知道您可以使用关键字flags来指定要过滤的标志。

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

为了让 PF 在评估规则期间检查 TCP 标志,flags 关键字与以下语法一起使用:

标志检查/屏蔽
标志任何

掩码部分告诉 PF 只检查指定的标志,而检查部分指定标头中必须“打开”哪些标志才能发生匹配。使用 any 关键字允许在标题中设置任​​何标志组合。

传入 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 和 A 的数据包不能通过规则 S/SA,如果标志 S 在数据包头中为“on”。也许文档是模棱两可的?对不起,如果这是一个愚蠢的问题或英语误解。

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

标头中的标志必须为“开” ->标志属于掩码子集[pf doc]
只有标头中的标志必须为“开” ->标志与被屏蔽的子集[我从给出的例子中理解的]

提前致谢!

4

1 回答 1

2

我不明白的是为什么带有标志 S 和 A 的数据包不能通过规则 S/SA,如果标志 S 在数据包头中为“on”。也许文档是模棱两可的?

来自 pf.conf(5) 中的标志部分

旗帜 (A)/(B) | 任何

此规则仅适用于标志 (A) 设置为集合 (B) 的 TCP 数据包。

如果 (B) := SA 和 (A) := S -> 此规则仅适用于在设置的 SA 中设置了标志 S 的 TCP 数据包。

这意味着它没有 A 集。稍微解释一下:

此规则仅适用于具有完全不同的标志 (A) 设置 (B) 的 TCP 数据包

或者正如手册页稍后澄清的那样:

标志 S/SA

这是有状态连接的默认设置。

在 SYN 和 ACK 之外,可以设置正好 SYN

于 2013-04-19T20:36:37.503 回答