如何使用OpenBSD中的包过滤器根据标志过滤TCP包

时间:2013-04-18 16:37:13

标签: networking filtering firewall flags openbsd

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

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

  

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

     

标志检查/掩码
  标记任何

     

面具部分告诉PF只检查   指定的标志和检查部分指定必须是哪个标志   标题中的“on”表示匹配发生。使用any关键字允许   要在标题中设置的任何标志组合。

     

将fxp0 proto tcp从任意端口传入任何端口ssh标志S / SA
  从任何端口ssh传递fxp0 proto tcp

     

由于标志S / SA设置为   默认情况下,上述规则是等效的,每个规则都通过   设置SYN标志的TCP流量,只查看SYN和   ACK标志。具有SYN和ECE标志的数据包将与上述匹配   规则,而具有SYN和ACK或仅ACK的数据包不会。

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

我不明白的是,如果标头S在数据包标题中“打开”,带有标志S和A的数据包无法通过规则S / SA。也许文档含糊不清?对不起,如果这是一个愚蠢的问题或英语被误解。

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

标题必须在标题中“打开” - > 标志与蒙面子集相关 [pf doc]
只有标题必须在标题中“打开” - > 标志是屏蔽子集的唯一 [我从给出的示例中理解]

提前致谢!

1 个答案:

答案 0 :(得分:2)

  

我不明白的是,如果标头S在数据包标题中“打开”,带有标志S和A的数据包无法通过规则S / SA。也许文档含糊不清?

从pf.conf(5)的标志部分

  标志(A)/(B)|任何

     

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

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

这意味着它没有A套。 解释一下:

  

此规则仅适用于具有设置(B)

之外的标志(A)的TCP数据包

或者手册页稍后澄清:

  

标志S / SA

     

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

     

在SYN和ACK之外,可以设置完全SYN