如何用iptables实现两次nat

如何用iptables实现两次nat

我想做两次 nat。

设计是:

LAN - A 192.168.1.10/24 OpenSwan VPN Public IP 5.5.5.5  <------VPN-----> Public IP 6.6.6.6 Open Swan --- > LAN B 192.168.1.20/24

当我从源 ping 时,192.168.1.10我想将源更改为1.1.1.x/24并将目标更改为2.2.2.10/24

因此 LAN A 中的机器将使用源 nat IP 192.168.1.10ping 目标,数据包将命中2.2.2.101.1.1.10192.168.1.20

由于子网重叠,我无法将路由放入 192.168.1.20LAN 路由表中,因为它冲突,所以我想 ping 一个虚拟 IP 2.2.2.10,当数据包到达 Openswan VPN 盒时,它会将目的地转换为192.168.1.20

那么站点 A OpenSwan 上的 NAT 声明是什么?

(请注意,我无法访问站点 B openswan,因此所有更改都需要在站点 A openswan 上进行)

答案1

是否要求 LAN A 和 LAN B 使用相同的子网,或者可以更改吗?

我也真诚地希望您提供的 1.1.xx 和 2.2.xx IP 纯粹是说明性的 - 在现实世界中,您可能希望使用 RFC1918 地址。

从基本层面上讲,您所描述的是应用源 NAT 和目标 NAT,即 SNAT 和 DNAT。

因此从理论上讲,下面的方法应该可行:

-t nat -A PREROUTING -d 2.2.2.10 -j DNAT --to-destination 192.168.1.20
-t nat -A POSTROUTING -s 192.168.1.10 -j SNAT --to-source 1.1.1.10

不幸的是,如果您无法访问站点 B 的 VPN 服务器,那么这将不起作用。

它之所以行不通,是因为当 LAN A 上的机器尝试访问 1.1.1.10 时,您的 LAN A VPN 服务器需要将其转换回 192.168.1.20。还有一个问题是 LAN B 的 VPN 服务器应该如何处理 1.1.1.10 源 IP - 您需要路由才能将数据包发送回其发起者,而(在我看来)让 LAN A 使用 10.1.1.1/24 似乎要简单得多

正如您所提到的,您无法让您的 LAN A VPN 服务器正确路由到 192.168.1.20,因为您的 LAN A VPN 服务器认为该子网是本地的。

添加特定路线可能帮助(例如 ip r 通过 IP 添加 192.168.1.20/32),但这一切听起来有点脆弱——我原本以为一个更可行的解决方案是分割你的 /24,并在你的 VPN 的两侧分配一个 /25(如果你必须保持两端相同的 LAN IP)。

所以我倾向于认为最好的选择是尝试改变 LAN A。

与 B 不同的 /24 可以起作用,并且隧道两侧的 /25 也可以起作用。

相关内容