为什么 SNAT 通过在表中设置一条规则而不是 PREROUTING 链中的规则来工作?

为什么 SNAT 通过在表中设置一条规则而不是 PREROUTING 链中的规则来工作?

我对使用 iptables 的 SNAT 有一些疑问。假设有一台路由器充当 DHCP 服务器,在我的 LAN 中分配私有 IP,并为我的 LAN 中的主机提供 NAT,以便访问公共互联网。

路由器有两个接口,一个是“eth0”,具有动态公共 IP,另一个是“eth1”,具有私有 IP 192.168.0.1,子网为 192.168.0.0/24。假设该路由器上启用了 ipv4 数据包转发。我知道我必须在 NAT 表中设置一条规则,以便将数据包的源 IP 从我的 LAN 中的主机伪装到公共互联网。此规则可能看起来像下面的规则。

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE

我知道为什么我需要这个规则,因为来自我的 LAN 的数据包需要一个公共 IP 来进行互联网路由。

但我不明白为什么我不需要在PREROUTING链中为响应数据包设置另一条规则来修改其目标 IP 地址。

修改这些响应数据包的目的地址是我刚刚设置的MASQUERADE规则的默认行为吗?

还有一个问题是 iptable 如何知道哪些数据包应该被修改?

谢谢。

答案1

iptables NAT 是有状态的。使用“nat”表将自动加载连接跟踪系统,它保存活动连接列表并识别哪个数据包属于哪个连接。conntrack 系统注册独立于 iptables 规则工作的内部钩子,并会自动转换它识别的数据包。

conntrack -L(您可以使用或通过 /proc/self/net/nf_conntrack查看 conntrack 状态表。)

在这个系统中,“nat”表中的规则实际上只匹配最初的属于每个连接的数据包,而不是每个数据包。一旦匹配了初始数据包,相应的 conntrack 条目将被标记为需要 NAT(或不需要),并且其他数据包将自动转换,甚至无需经过“nat”表。

相关内容