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



嗯,我不知道该怎么问这个问题,但是我知道你可以使用关键字flags来指定你想要过滤的标志。

根据包过滤器的文档:

若要让PF在规则求值期间检查TCP标志,则Flags关键字的语法如下:

标记检查/面具
标记任何

掩码部分告诉PF只检查指定标志和检查部分指定必须是哪个标志在标头中设置"on",以便匹配发生。使用any关键字允许在header中设置的任何标志组合

从任意端口到任意端口传输fxp0 proto tcp ssh标志S/SA
从任意端口传入fxp0 proto TCP

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

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

我不明白的是为什么带有标志S和A的数据包不能通过规则S/SA,如果标志S在数据包头中是"on"。也许文档是模棱两可的?对不起,如果这是一个愚蠢的问题或英语误解。

我想象它只能通过,如果它必须有只有标志S。在set算术中应该是这样的:

标志(s)必须为'on' -> 标志(s)属于被屏蔽子集 [pf doc]
只有标头中的标志(s)必须为"on" -> 标志(s)等于掩码子集[我从给出的示例中理解的]

提前感谢!

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

From flags section in conf(5)

flags (A)/(B) | any

此规则仅适用于设置了标志(A)的TCP报文

If (B):= SA and (A):= S ->

本规则只适用于在set SA中设置了标志S的TCP报文。

这意味着它没有A集合。转述一下:

此规则仅适用于恰好有标志(A)设置在set (B)之外的TCP数据包

或者如手册页稍后说明的:

旗帜S/SA)

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

在SYN和ACK之外,可以设置准确的SYN

最新更新