![如何用iptables实现两次nat](https://linux22.com/image/701447/%E5%A6%82%E4%BD%95%E7%94%A8iptables%E5%AE%9E%E7%8E%B0%E4%B8%A4%E6%AC%A1nat.png)
我想做两次 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.10
ping 目标,数据包将命中2.2.2.10
1.1.1.10
192.168.1.20
由于子网重叠,我无法将路由放入 192.168.1.20
LAN 路由表中,因为它冲突,所以我想 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 也可以起作用。