为什么我们需要 nftables 中不同类型的基础链?

为什么我们需要 nftables 中不同类型的基础链?

我知道钩子在 netfilter 中是如何工作的,但我不明白为什么会有这里描述的不同类型的链:基链类型

我有两个问题
:首先,为什么会有不同类型的链?为什么不只使用“过滤器”类型?
其次,为什么“路由”链类型只有一个钩子?它应该是 iptables 中的“mangle”等价物,但根据这个按照系列和链条类型分类的挂钩它只有输出钩子。(为什么?)

谢谢

答案1

链类型是 netfilter 设计的一部分。他们根据人们可能想要使用的规则组织类型制作了不同的类型。这种设计迫使人们根据他们创建的三个函数来区分链。从技术层面上讲,每个链在内核中的操作方式都不同。例如,对于路由类型,它会在链运行后触发路由评估,而对于过滤器或 nat 类型则不是这样。

路线只有一个钩子,因为它只需要一个钩子来实现其功能。如果您所做的修改与路由决策无关,请将其放入过滤器中并将其附加到您需要的任何内容。

为了更好地理解这些概念,我发现内核中的 nftables 代码非常容易理解。以下是内核中链类型定义的链接: https://github.com/torvalds/linux/blob/master/net/netfilter/nft_chain_filter.c#L195 https://github.com/torvalds/linux/blob/master/net/netfilter/nft_chain_nat.c#L88 https://github.com/torvalds/linux/blob/master/net/netfilter/nft_chain_route.c#L134

答案2

将 NAT 规则添加到过滤器类型链将导致错误。

https://wiki.nftables.org/wiki-nftables/index.php/Performing_Network_Address_Translation_(NAT)

我尝试将伪装规则添加到过滤器链中,并确认了上述说法是正确的。链类型限制了可以对规则执行的操作。

相关内容