通过 iptables+NAT 连接具有相同 IP 的网络:选择传出网络接口

通过 iptables+NAT 连接具有相同 IP 的网络:选择传出网络接口

我想允许位于两个不同网络上的两台主机之间建立连接。每个网络都是单独管理的,因此它们可能有冲突的 IP。我的理解是 NAT 是实现此目的的典型方法,因此据我所知,我应该有一台具有两个接口的机器,每个网络一个,如下所示:

Network A                                      Network B
+---------------+   1.1.1.0            2.2.2.0 +---------------+
|               |    eth0 +----------+ eth1    |               |
| 1.1.1.1       |---------|   NAT    |---------|   2.2.2.2     |
+---------------+         +----------+         +---------------+

因此,NAT 机器的 eth0 连接到网络 A,eth1 连接到网络 B。假设 NAT 机器在网络 A 上的 IP 为 1.1.1.0,在网络 B 上的 IP 为 2.2.2.0。现在,1.1.1.1 想要通过将 1.1.1.0:1111 重定向到网络 B 的 2.2.2.2:8080 与 2.2.2.2:8080 进行通信。

我相信我可以使用 iptables 执行以下操作:

iptables -t NAT -A PREROUTING -i eth0 -d 1.1.1.0 --dport 1111 -j DNAT --to 2.2.2.2:8080
iptables -t NAT -A POSTROUTING -o eth1 -d 2.2.2.2 --dport 8080 -j SNAT --to-source 2.2.2.0

到目前为止,一切都很好。

但是,如果两个网络上的 IP 相同(由于网络是独立的,因此可能会发生这种情况),会发生什么情况? 上面的内容变为:

Network A                                      Network B
+---------------+   1.1.1.0            1.1.1.0 +---------------+
|               |    eth0 +----------+ eth1    |               |
| 1.1.1.1       |---------|   NAT    |---------|   1.1.1.1     |
+---------------+         +----------+         +---------------+

iptables -t NAT -A PREROUTING -i eth0 -d 1.1.1.0 --dport 1111 -j DNAT --to 1.1.1.1:8080
iptables -t NAT -A POSTROUTING -o eth1 -d 1.1.1.1 --dport 8080 -j SNAT --to-source 1.1.1.0

如果我正确理解了这些链,那么当发往 1.1.1.0:1111 的数据包到达 eth0 时,其目标 IP 将更改为 1.1.1.1。此时,必须路由数据包,但由于 1.1.1.1 存在于两个网络上,NAT 机器如何知道将数据包路由到哪个网络?我可以强制它通过 eth1 路由此类数据包吗?我该如何设置路由表来做到这一点?

我认为路由逻辑可能保证永远不会将数据包路由回其传入接口,但如果我想使用同一台 NAT 机器将网络 A 连接到网络 B 和 C(即接口):在这种情况下,传入接口将是 eth0,而传出接口可以是 eth1 或 eth2:我如何选择我想要使用的那个?

答案1

当 NAT 两侧的 IP 配置重叠时,您的第二个配置将不起作用。即使 NAT 之间存在中间网络,情况也是如此 - 例如,两个通过 Internet 连接的 NAT 网络托管重叠的 IP 方案(如 192.168.1.0/24)。

相关内容