从手册中我不清楚这些命令的功能是否相同:
meta skuid == "root" counter accept
skuid 0 counter accept
还
ct state == { established, related } counter accept
ct state established,related counter accept
我关于语法的问题是:
- 我可以跳过单词
meta
(似乎在使用 item 时必须跳过它log flags
)? - 我可以在任何匹配某些内容的命令中添加 == 符号(为了可读性)吗?
- 我可以将列表(项目集)写为
item1,item2
或不写{ item1, item2 }
,或者仅用于ct
命令吗?
要验证两个规则是否相同,甚至超出了显示相同的范围(在涉及多个协议层的极少数情况下,规则可以显示相同的内容,功能相同,但在字节码级别不完全相同,这几乎是一个再现性错误),请使用选项
--debug=netlink
还将显示发送到内核的字节码。如果字节码相同,则规则相同。这是一个交互式示例(使用 nftables 1.0.9。结果可能会根据版本略有变化):
可以看出,前两个规则是相同的。Indeed
"root"
像往常一样由用户空间解析为 uid 0,并且meta
关键字是可选的(至少对于这里的版本)。最后两条规则即使在功能上相同,也并不相同。On case 使用一组匿名的两个值。但这两个值应该以按位方式组合(即:所有可能的符号都有不同的 2 指数作为值),这就是最后一条规则的作用,而不是扮演
,
不同的角色。乍一看,我认为第二条ct
规则比第一条规则更优化:不需要涉及集合查找。仍然使用第一种情况:当使用(一个判决映射而不是一个简单的集合)根据单个规则中的conntrack
vmap
状态调用不同的判决时。无论您选择什么,对于给定的nftables版本,它将始终以一种方式显示:
这可能应该是使用的内容,或者最终可能会被使用,只是因为当手动而不是通过工具处理时,转储规则集、编辑它并重新加载它通常是实用的。
中的情况
ct
根本无法概括:只有在涉及两个值的幂时才可以完成第二个变体(如果无论如何实现了特定语法支持),以便它们可以按位运算组合:一个明显的例子是将 TCP 标志与nftables一起使用:
所以就像
ct
:最后两条规则(注意使用 进行
|
按位 OR 运算而不是,
内置语法)完全相同。但第一条规则使用匿名集,就像前面的情况一样。在此示例中的所有情况下,多个 TCP 标志中的一个匹配就足以匹配:功能等效。如果需要同时匹配两个标志,则只有第二种情况可用。通常,下面的规则需要同时存在两个标志,不能使用匿名集来实现:
注意:以这种方式组合标志是没有意义的,
ct
因为与 TCP 标志相反,一次只应该存在一个标志(给定的数据包不能同时具有多个conntrack状态)。