我对使用 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”表。