是否需要nat表INPUT链?

J C*_*ins 5 firewall iptables

iptables手册页建议使用以下标准表和链:

                raw     mangle  nat     filter
PREROUTING       X       X       X       
INPUT                    X       X       X
FORWARD                  X               X
OUTPUT           X       X       X       X
POSTROUTING              X       X
Run Code Online (Sandbox Code Playgroud)

但iptables 维基百科页面中的图表并未表明使用了 nat INPUT 链。我知道该图是一种简化,只是因为他们故意省略了安全表。当我尝试自学防火墙时,这可能是一个迂腐的问题,但答案可能很有趣。 在此输入图像描述

A.B*_*A.B 3

更新:修复nat/INPUT顺序。

原理图最初不包括nat/INPUT,但我错误地写道 int 在filter/INPUT之前,并且该原理图后来(错误地)更新了mangle/INPUTfilter/INPUT之间的这条链,结果证明这是错误的。

nat/INPUT挂钩在filter/INPUT之后。

由于nat类型很特殊并且与conntrack链接,因此nftables的优先级甚至不依赖于钩子优先级,对于nat来说,仅影响同一nat钩子内多个链之间的优先级。使用nftables而不是iptables不能通过将优先级更改为低于 filter/INPUT 的 0 或 mangle/INPUT 的 -150 的值来改变这一点:它总是准确地挂钩在 100 处。(与 nat/PREROUTING 的行为相同:它总是准确地挂钩即使链优先级为 -199,PREROUTING 也为 -100)。所有这些都可以使用iptables-j TRACEnftables功能进行测试meta nftrace set 1,并查看遍历链的结果顺序。在内核 5.13.x 上进行的测试,有关此的特定行为将来可能会发生变化。iptables甚至无法更改这些优先级,无论如何也别无选择。

正如@Andrew Bate所写,当前可以找到给出正确顺序的正确原理图:

示意图

也就是说,关于这个问题...


nat/PREROUTING将在初始路由决策之前应用,对于所有情况(路由或本地端点流量),nat/INPUT 将在初始路由决策之后发生,当流量被视为本地时。

它的实现方式与路由和连接跟踪有关,在路由之前,使用nat/PREROUTING,您可以更改会影响路由的内容:目的地 ( -j DNAT),但不能更改起点。路由后,使用nat/INPUT,情况正好相反:您无法更改目的地,但可以更改起点 ( -j SNAT)。

您与nat/OUTPUT(原理图上)和nat/POSTROUTING具有一定的倒对称性:nat/OUTPUT仅适用于本地发起的流量,并且可以改变路由决策,就像nat/PREROUTING一样,因此可以改变目的地(使用-j DNAT) ,第二个是针对所有流量,无论是路由的还是本地发起的,在任何路由决策已经完成之后(并且可以使用 更改nat/INPUT等源-j SNAT)。

要回答这个问题,nat/INPUT在需要之前并不存在。它是专门为处理新出现的情况而创建的,避免需要命名空间,而是使用conntrack 区域它出现在2010年。此链接包含激发其创建动机的使用示例,但很难掌握,因为它使用 conntrack 区域(允许通过添加将完全相同的流(相同的 5 元组协议、saddr、sport、daddr、dport)分离到不同的 conntrack 条目中例如,对于特殊策略路由流量,一个从eth0到达,前往eth2,另一个从eth1到达,前往eth3,或者如第一个链接中那样,环回流量并单独跟踪/nat。