iptables NAT 规则的隐式逆向

iptables NAT 规则的隐式逆向

iptables 是否隐式自动为每个显式添加的 NAT 规则添加反向/反向规则?

通常,假设采用 DROP 策略,对于过滤器表中的每个 INPUT 规则,都有一个相应的 OUTPUT 规则,该规则接受相关或已建立的流量(反之亦然)。例如,要使入站 SSH 能够通过 iptables 防火墙,需要有一条 INPUT 规则来允许建立传入连接:

iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

但也会有相应的 OUTPUT 规则允许返回流量:

iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

虽然这种显式反向流量规则在过滤表中是必要的,但对于 NAT 表来说似乎并非如此。

请考虑以下各种非官方参考文献的摘录:

  1. 数字海洋:深入探讨 Iptables 和 Netfilter 架构

某些事件将导致处理期间跳过表的链。例如,只有连接中的第一个数据包才会根据 NAT 规则进行评估。对第一个数据包所做的任何 nat 决策都将应用于连接中的所有后续数据包,无需额外评估。对 NAT 连接的响应将自动应用反向 NAT 规则以正确路由。

  1. 超级用户:NAT 前向链规则的内部工作原理

但netfilter(即作为iptables“引擎”的数据包过滤/修改框架)足够智能。每当收到传入的 [NAT] 数据包时,它都会与 netfilter 的 conntrack 表进行匹配。如果数据包是对现有传出连接的回复(ACK 标志设置、匹配 IP:端口、匹配 TCP 序列号等),netfilter 会自动执行 DNAT。不需要额外的规则。

  1. Karl Rupp:NAT 教程

幸运的是,netfilter 框架会自动向每个规则添加其逆规则,因此我们只需设置一个显式规则。通常,对这两个规则之一的决定是通过采用不确定性较低的那个来做出的。例如,规则“替换来自本地子网的所有数据包的发送者地址”比“如果客户端已向服务器发送了某些内容,则用某些内容替换服务器响应中的接收者”要容易得多。根据经验,首先执行的规则是在内核中明确设置的规则。

我读过官方 netfilter 文档但我还没有找到任何地方提到这种行为。是否有官方参考资料证实上述说法?

答案1

iptables 是否隐式自动为每个显式添加的 NAT 规则添加反向/反向规则?

不完全是

您的前两句话是正确的,第三句话是不了解系统如何工作的人的混乱胡言乱语。

iptables nat(与 iptables 过滤不同)适用于连接。连接的第一个数据包通过 nat 表并根据它进行转换。属于同一连接的后续数据包不会通过 nat 表,它们只是根据转换第一个数据包时建立的规则进行转换。

iptables 手册页https://linux.die.net/man/8/iptables文档中指出,nat 表被查询为“连接的第一个数据包”,并且 DNAT 和 SNAT 目标的手册页部分说“(并且此连接中的所有未来数据包也将被破坏)”。

不幸的是,我还没有看到任何比这更深入的官方文档。我对 iptables 的首选参考是 freezetux iptables 教程,但我认为它不是官方的。

答案2

问题已经得到解答,但您确实要求参考“官方”文档,这就是我发现的(我自己正在寻找答案)。

来自官方文档(2.1.什么是网络地址转换?)

如果这些链路之一要执行 NAT,那么它们会在数据包通过时更改数据包的源或目的地。正如您可以想象的那样,这不是系统设计的工作方式,因此 NAT 总是很糟糕。通常,执行 NAT 的链路会记住它如何损坏数据包,并且当回复数据包通过其他方式时,它将对该回复数据包进行反向损坏,因此一切正常。

相关内容