如何从静态 NAT NETMAP 中排除多个目的地?

如何从静态 NAT NETMAP 中排除多个目的地?

我在 iptables 中有一个静态 1:1 NAT 设置,它排除了较大的子网(以便 NETMAP 主机仍然可以访问非静态 NAT 的其他本地主机),如下所示:

*nat
-A PREROUTING --destination 128.128.196.32/27 -j NETMAP --to 10.10.20.32/27
-A POSTROUTING --source 10.10.20.32/27 ! -d 10.0.0.0/8 -j NETMAP --to 128.128.196.32/27

我还想排除面向公众的 IP 地址,以便静态 NAT 主机仍然可以访问机器上另一个静态 NAT 主机的公共 IP 地址。但似乎不支持多个否定目的地。这会引发错误:

*nat
-A PREROUTING --destination 128.128.196.32/27 -j NETMAP --to 10.10.20.32/27
-A POSTROUTING --source 10.10.20.32/27 ! -d 10.0.0.0/8 ! -d 128.128.196.0/24 -j NETMAP --to 128.128.196.32/27

如何设置 iptables 以允许静态 NAT NETMAPed 主机访问 iptables 机器上的其他公共地址?

答案1

您需要使用附加链,并在 NETMAP 规则之前返回。

*nat
-N NETMAP_src101020
-A NETMAP_src101020 -d 10.0.0.0/8 -j RETURN
-A NETMAP_src101020 -d 128.128.196.0/24 -j RETURN
-A NETMAP_src101020 -j NETMAP --to 128.128.196.32/27
-A PREROUTING --source 10.10.20.32/27 -j NETMAP_src101020
-A PREROUTING --destination 128.128.196.32/27 -j NETMAP --to 10.10.20.32/27

因此,来自 10.10.20.32/27 的任何数据包都会被发送到 NETMAP_src101020 链中。如果数据包的目的地是 10.0.0.0/8,那么我们从该链返回;如果数据包的目的地是 128.128.196.0/24,情况也是如此。只有这样,它才会到达实际的 NETMAP 规则。

希望这足够有意义;我认为通过展示来解释比一些冗长的解释更容易。

相关内容