好吧,我并不确切知道如何提出这个问题,但我知道您可以使用关键字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]
只有标头中的标志必须为“开” ->标志与被屏蔽的子集[我从给出的例子中理解的]
提前致谢!