何时以及如何在 nftables 中使用链优先级

何时以及如何在 nftables 中使用链优先级

在 nftables 中配置一条链时,必须提供一个priority值。网上的例子几乎都把a设置piority为0;有时,值 100 会与某些挂钩 ( output, postrouting) 一起使用。

nftables 维基不得不说:

优先级可用于对链进行排序或将它们放在某些 Netfilter 内部操作之前或之后。例如,优先级为 -300 的预路由钩子上的链将放置在连接跟踪操作之前。

作为参考,以下是 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

答案1

更新:(iptables-nft而不是iptables-legacy)正在使用nftables内核 API 以及可重用的兼容层扩展表内核模块(那些在iptables-extensions)当没有本地人时nftables可用翻译。它应该被视为nftables在大多数方面,除了这个问题之外,它像旧版本一样具有固定的优先级,所以nftables' 优先事项在这里仍然很重要。


iptables(遗留)和nftables两者都依赖于相同的 netfilter 基础设施,并在不同的地方使用钩子。那里有解释:网络过滤器挂钩,或者有这个systemtap 联机帮助页,它记录了一些钩子处理:

PRIORITY 是一个整数优先级,给出相对于在同一数据包上触发的任何其他 netfilter 挂钩函数应触发探测点的顺序。钩子函数按照从最小优先级编号到最大优先级编号的顺序对每个数据包执行。 [...]

或者还有这个关于 netfilter 的博客:如何使用 Netfilter 过滤网络数据包 - 第 1 部分 Netfilter Hooks (博客消失了,使用回溯机链接代替。)

所有这些共同表明各种模块/功能可以在每个五个可能的钩子(对于 IPv4 情况),并且在每个钩子中,将按照该钩子的注册优先级顺序调用它们。

这些钩子不仅用于iptables或者nftables。还有各种其他用户,例如上面的 systemtap,甚至 netfilter 自己的子模块。例如,对于 IPv4,当使用 NAT 与 iptables 或 nftables 时,nf_conntrack_ipv4在不同优先级的 4 个钩子中注册,总共 6 次。该模块将依次拉取和nf_defrag_ipv4处的寄存器。NF_INET_PRE_ROUTING/NF_IP_PRI_CONNTRACK_DEFRAGNF_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似乎没有提供这样的功能)选择)。


现在关于之间的相互作用nftablesiptables:两者都可以一起使用,但旧内核中的 NAT 除外,它们都竞争 netfilter 的 nat 资源:只有一个应该注册 nat,除非使用 >= 4.18 的内核,如 wiki 中所述。这例子nftables设置与 iptables 具有相同的优先级有细微差别。

如果两者都iptablesnftables一起使用,一个应该在另一个之前使用,因为需要相互作用和效果顺序,只是稍微降低或增加nftables' 相应地优先,因为iptables' 无法更改。

例如在大多数情况下iptables设置,可以使用nftables具有特定的匹配功能,不适用于iptables标记一个数据包,然后处理这个标记iptables,因为它支持特定目标(例如花哨的iptables LED 目标使 LED 闪烁)不可用nftables。只需注册一个稍低的优先级值即可nftables挂钩以确保它之前已完成。对于通常的输入过滤规则,例如,这将-5代替0.再说一次,这个值不应该低于,-149否则它会在之前执行iptables' INPUT mangle 链这可能不是我们想要的。这是在输入情况下唯一重要的其他低值。例如,没有NF_IP_PRI_CONNTRACK需要考虑的阈值,因为连线未在此优先级中注册某些内容NF_INET_LOCAL_INSELinux 也没有在这个钩子中注册一些东西如果与之相关的某件事确实很重要,那么-225这里没有特殊意义。

相关内容