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