我找不到任何可以解释以下示例构造的语法和评估的文档:
add rule filter output tcp flags & (syn | ack) == syn | ack
add rule filter output tcp flags & (fin | syn) != 0
我确实在这里阅读了@AB 的回答:记录 TCP 标志。
这只解释了这些构造(匹配标志)的目的TCP
,但我想知道语法以及表达式和运算符的评估如何工作。
特别是“按位”运算符的含义以及它们在flags
整个表达式中的评估方式。
我还不清楚operator upfront!= 0
的作用是什么,特别是它的用途。&
我知道它们是 OR、AND 等等,但不明白这在nftables
规则中如何应用。
一些更复杂的例子也可能有帮助。
以这种方式使用按位运算符是提取特定位值的常用方法。因此,对于 TCP 标志,如果您只关心 SYN 和 ACK(
???A??S?
),则可以使用“SYN 或 ACK”对标志进行“与”运算,这将清除所有其他标志(000A00S0
)。然后,如果您只关心是否设置了某个位,则可以将结果与 0 进行比较,或者如果您想要精确匹配,则可以与特定的标志组合进行比较。在第一条规则中,表达式为
tcp flags & (syn | ack) == syn | ack
。按优先级排序:(syn | ack)
计算代表 SYN 或 ACK 的位组合tcp flags & (syn | ack)
计算 TCP 标志和“SYN 或 ACK”的交集:结果仅为SYN 和/或 ACK 标志(如果设置了一个或两个)tcp flags & (syn | ack) == syn | ack
将前一个表达式的结果与syn | ack
总体效果是,如果同时设置了 SYN 和 ACK 标志,则表达式返回 true 。所有其他标志都将被忽略。
另一种看法是:
在第二条规则中,表达式为
tcp flags & (fin | syn) != 0
。再计算一下:(fin | syn)
计算代表 FIN 或 SYN 的位组合tcp flags & (fin | syn)
计算 TCP 标志和“FIN 或 SYN”的交集:结果仅为FIN 和/或 SYN 标志(如果设置了一个或两个的话)(理论上;实际上只能设置一个)tcp flags & (fin | syn) != 0
如果前一个表达式的结果非零,则成功总体效果是,如果设置了 FIN 或 SYN 标志,则表达式返回 true。所有其他标志均被忽略。
另一种看法是: