在 nftables 中配置链时,必须提供一个priority
值。几乎所有在线示例都将a设置piority
为0;有时,值 100 与某些钩子 ( output
, postrouting
) 一起使用。
nftables wiki不得不说:
优先级可用于对链进行排序或将它们放在某些 Netfilter 内部操作之前或之后。例如,优先级为 -300 的 prerouting 钩子上的链将被放置在连接跟踪操作之前。
作为参考,以下是 iptables 中使用的不同优先级的列表:
- NF_IP_PRI_CONNTRACK_DEFRAG (-400):碎片整理的优先级
- NF_IP_PRI_RAW (-300):在连接跟踪操作之前放置的原始表的传统优先级
- NF_IP_PRI_SELINUX_FIRST (-225):SELinux 操作
- NF_IP_PRI_CONNTRACK (-200):连接跟踪操作
- NF_IP_PRI_MANGLE (-150): 破坏操作
- NF_IP_PRI_NAT_DST (-100):目标 NAT
- NF_IP_PRI_FILTER(0):过滤操作,过滤表
- NF_IP_PRI_SECURITY (50):例如可以设置secmark的安全表位置
- NF_IP_PRI_NAT_SRC (100):源 NAT
- NF_IP_PRI_SELINUX_LAST (225):SELinux 在数据包出口
- NF_IP_PRI_CONNTRACK_HELPER (300):退出时的连接跟踪
这表明priority
控制与内部 Netfilter 操作的交互,但仅提及 iptables 使用的值作为示例。
在哪些情况下是priority
相关的(即必须设置为值≠ 0)?仅适用于具有相同钩子的多个链条?结合 nftables 和 iptables 怎么样?哪些内部 Netfilter 操作与确定正确priority
值相关?
更新:(
iptables-nft
而不是iptables-legacy
)正在使用nftables内核 API 和另外一个兼容层来重用xtables内核模块(在 中描述的那些iptables-extensions
),当没有可用的本机nftables翻译时。在大多数情况下,它应该被视为nftables,除了这个问题,它像旧版本一样具有固定的优先级,因此nftables的优先级在这里仍然很重要。iptables (legacy) 和nftables都依赖于相同的 netfilter 基础设施,并在不同的地方使用钩子。它在那里解释:Netfilter hooks,或者有这个systemtap manpage,它记录了一些钩子处理:
或者这个关于 netfilter 的博客:How to Filter Network Packets using Netfilter–Part 1 Netfilter Hooks (博客消失了,改用Wayback Machine链接。)
所有这些共同表明,各种模块/功能可以在五个可能的钩子中的每一个上注册(对于 IPv4 情况),并且在每个钩子中,它们将按照该钩子的注册优先级顺序被调用。
这些钩子不仅适用于iptables或nftables。还有各种其他用户,例如上面的 systemtap,甚至是 netfilter 自己的子模块。例如,当使用 iptables 或 nftables 使用 NAT 时,使用 IPv4,
nf_conntrack_ipv4
将在 4 个不同优先级的钩子中注册总共 6 次。该模块将依次拉取位于和nf_defrag_ipv4
的寄存器。NF_INET_PRE_ROUTING/NF_IP_PRI_CONNTRACK_DEFRAG
NF_INET_LOCAL_OUT/NF_IP_PRI_CONNTRACK_DEFRAG
所以是的,优先级仅在同一个钩子中相关。但是在同一个钩子中,有几个用户,并且他们已经有他们预定义的优先级(通常但不总是在不同的钩子中重用相同的值),所以要围绕他们正确交互,必须使用兼容的优先级。
例如,如果必须尽早对未碎片整理的数据包执行规则,然后(像往常一样)使用碎片整理的数据包,只需在预路由中注册两个nftables链,一个 <=
-401
(例如-450
),另一个在-399
和之间-201
(例如-300
)。直到最近, iptables可以做的最好的事情是-300
,即它在 conntrack 时看不到碎片数据包,因此使用了早期碎片整理(因为内核 4.15 带有选项raw_before_defrag
,它将注册在-450
,但不能同时做,但iptables-nft
不会出现提供这样的选择)。所以现在关于nftables和iptables之间的交互:两者可以一起使用,除了旧内核中的 NAT,它们都竞争 netfilter 的 nat 资源:只有一个应该注册 nat,除非使用内核 >= 4.18,如维基。示例nftables设置与 iptables 具有相同的优先级,但差异很小。
如果同时使用iptables和nftables并且一个应该在另一个之前使用,因为需要交互和效果顺序,只需相应地稍微降低或提高nftables的优先级,因为iptables不能更改。
例如,在大多数iptables设置中,可以使用具有iptables中不可用的特定匹配功能的nftables来标记数据包,然后在iptables中处理此标记,因为它支持特定目标(例如花哨的iptables LED目标闪烁一个 LED)在nftables中不可用。只需为nftables钩子注册一个稍低的优先级值,以确保它之前完成。对于通常的输入过滤器规则,例如而不是. 再说一次,这个值不应该低于,否则它将在iptables之前执行
-5
0
-149
' INPUT mangle 链,这可能不是预期的。这是在输入情况下唯一重要的其他低值。例如,没有NF_IP_PRI_CONNTRACK
要考虑的阈值,因为conntrack不会在此优先级中注册某些内容,如果与此相关的某些内容确实很重要NF_INET_LOCAL_IN
,SELinux 也不会在此挂钩中注册某些内容,因此-225
这里没有特殊含义。