这iptables 手册页建议使用以下标准表和链:
raw mangle nat filter
PREROUTING X X X
INPUT X X X
FORWARD X X
OUTPUT X X X X
POSTROUTING X X
但图表中的iptables 维基百科页面不表示使用了 nat INPUT 链。我知道该图是一种简化,只是因为他们故意省略了安全表。这可能是一个迂腐的问题,因为我正在尝试自学防火墙,但答案可能很有趣。
答案1
更新:修复nat/输入命令。
这示意图不包括nat/输入最初,但我错误地写道 int 是滤波器/输入,并且此原理图后来被(错误地)更新为以下链:曼格尔/输入和滤波器/输入但事实证明这是错误的。
nat/输入钩后滤波器/输入。
作为纳特类型很特殊,并且与连接跟踪,结果还表明nftables的优先级甚至不依赖于钩子优先级,对于纳特仅影响同一链中多个链之间的优先级纳特钩子。使用nftables代替iptables无法通过将优先级更改为低于 filter/INPUT 的 0 或 mangle/INPUT 的 -150 的值来改变这种情况:它总是在 100 处挂起。(nat/PREROUTING 的行为相同:即使赋予链优先级 -199,它也总是在 PREROUTING 的 -100 处挂起)。所有这些都可以使用以下方法进行测试iptables'-j TRACE
或者nftables'meta nftrace set 1
功能并查看遍历链的结果顺序。在内核 5.13.x 上进行测试,有关此内容的具体行为将来可能会发生变化。iptables甚至无法改变这些优先事项,无论如何也没有选择。
作为@安德鲁·贝特写道,可以找到给出正确顺序的正确示意图那里目前是这样的:
话虽如此,关于这个问题……
nat/预路由将在初始路由决策之前应用,例如全部情况(路由或本地端点流量),nat/输入 将在初始路由决策后发生,仅有的如果流量被视为本地流量。
在路由和连接跟踪方面,它在路由之前的实现方式是nat/预路由,您可以更改会影响路线的因素:目的地(-j DNAT
),但不能更改原点。路线规划完成后,使用nat/输入,恰恰相反:你无法改变目的地,但你可以改变出发地(-j SNAT
)。
你有某种倒置对称性NAT/输出(在示意图上)和nat/后路由:NAT/输出仅适用于本地发起的流量,并且可以改变路由决策,例如nat/预路由,因此可以改变目的地(使用-j DNAT
),第二种是针对所有流量,无论是路由的还是本地发起的,在任何路由决策已经完成之后(并且可以像nat/输入和-j SNAT
)。
要回答这个问题,nat/输入直到需要时才存在。它是专门为处理新出现的情况而创建的,避免需要命名空间,而是使用连接跟踪区域反而。它出现于 2010 年。此链接包含使用示例,这些示例激发了它的创建,但它很难理解,因为它使用 conntrack 区域(允许通过在它们上添加区域标记将完全相同的流(相同的 5 元组协议、saddr、sport、daddr、dport)分离到不同的 conntrack 条目中。例如,对于特殊策略路由流量,一个来自eth0即将eth2,另一班来自eth1即将eth3,或者像第一个链接那样环回流量并单独跟踪/nat )。