我仍在阅读 iptables 手册页和其他文档,并挖掘问题及其答案。
这就是出现的问题。当我们设置 NAT 时,我们使用 POSTROUTING 规则,如下所示:
iptables -A POSTROUTING -t nat -j MASQUERADE -o eth0
似乎当数据包到达该链时,内部主机需要初始化与互联网的某些连接,对吧?传入流量将通过相同路径路由而不会到达链条?我的说法正确吗?
答案1
POSTROUTING 链会检查所有离开系统的数据包,甚至是本地生成的数据包(它们省略 PREROUTING 并使用 OUTPUT 代替)。
该规则仅限于通过 传出的流量eth0
。 “传入”是指正在路由的每个流量(如果您将其与 POSTROUTING 相关)。您可能指的是来自 Internet 的流量 ( eth0
)。通常,进入的流量eth0
不会通过 离开系统eth0
。
POSTROUTING 仅影响传出流量(并且仅影响连接的第一个数据包)。如果回复到达,eth0
则它们被识别为 SNAT 连接的一部分,并且它们的目标地址(和端口)会自动转换为其原始值(被目标覆盖的值MASQUERADE
)。
答案2
在 iptables 中,只有连接的第一个数据包会命中 nat 表中的链(这与其他表中的链不同)。与现有连接相关的数据包将根据处理第一个数据包时建立的映射自动转换。
如果到达的传入数据包与现有连接不匹配并且与 NAT 表中的规则不匹配,则将在不进行 NAT 的情况下对其进行处理(这可能涉及转发它、在本地将其传递到协议栈或将其丢弃,具体取决于其他表中的目标 IP 和 iptables 规则)。