为什么在 POSTROUTING 链中发生 SNAT,而在 PREROUTING 链中发生 DNAT?

为什么在 POSTROUTING 链中发生 SNAT,而在 PREROUTING 链中发生 DNAT?

为什么SNAT(修改源IP和/或端口)发生在nat表链中POSTROUTING,即在路由之后?为什么DNAT(修改目标 IP 蚂蚁/或端口)会发生在PREROUTING链中?我猜后者是因为PC上可能有多个NIC具有不同的专用网络,并且如果目标IP地址仍然是公共可路由地址,PC不知道如何路由数据包?但是,因为SNAT我看不出这不能发生的原因PREROUTING

答案1

我很确定来自本地计算机的任何内容都不会通过表PREROUTING,如图所示在这个很棒的 ASCII 数字中

答案2

通常,SNAT 的主要标准是“流出给定接口的流量”(即-o eth0)。数据包将通过哪个接口发出由路由决定,因此要应用该标准,您需要在POSTROUTING上下文中运行它。

DNAT 会重写数据包的目标地址,这意味着它会影响数据包的目的地,例如,看似发往网关的数据包最终可能会被重写,转而发往网络上的计算机。由于您希望路由在做出决定时能够考虑重写的目的地,以便数据包真正到达所需的位置,因此 DNAT 应该在上下文中运行PREROUTING

答案3

正如链名称所示,PREROUTING它首先在收到数据包时完成,因此根据数据包的去向(目的地)进行路由。应用所有其他路由规则后,POSTROUTING链将根据它的来源(源)确定它的去向。

例如,在我的服务器上,要转发(NATed)的传入端口都在链中定义PREROUTINGDNAT,并且来自 NATed 接口的所有数据包都通过链POSTROUTING作为SNAT,因此(在本例中),转到通过过滤器FORWARD链。

答案4

在 Linux 中进行任何数据包操作时,从链的角度来看,通常的路径是 PREROUTING 作为第一个链,而 POSTROUTING 是数据包路径中的最后一个链。路由器通常有许多配置,甚至包括一些转换,例如针对特定流的 IPsec VPN 隧道选择。通常,SNAT 的目的是发送具有公共网络中连接的主机可以到达的地址的数据包。当数据包即将离开路由器时,即在 OUTPUT 之前的 POSTROUTING 级别对数据包进行此类更改,以避免 IP 地址的任何混合。类似地,在相反方向,路由器期望的第一件事是查看实际流,以便在数据包穿过堆栈时应用根据配置做出的所有决策。只有我们在最早的阶段(即 PREROUTING)进行 DNAT,才能实现这一目标。

相关内容