如何通过改变目标端口来进行 SNAT?

如何通过改变目标端口来进行 SNAT?

我有一台 Linux 主机用作源 NAT (SNAT)。它在 IP 为 192.168.2.1 的内部接口上接收来自内部网络的默认路由的所有数据包。SNAT 主机有多个出站 IP 地址(例如 3.3.3.3、3.3.3.4、3.3.3.5,...)。

我想配置 iptables(或 Linux 上其他一些工具 - 不一定是 iptables - 但我认为这是正确的工具),使得数据包到达内部私有 IP 的端口决定发送请求的 IP,并且出站端口保持不变(例如端口 80)。

例如,以下映射可能是原型(所有这些都将在 192.168.2.1 上接收,但目标 IP 是映射中首先列出的 IP ...-> 表示 SNAT 设备):

  • (源) 192.168.xy:z (目标) 10.10.10.10:8001 -> (源) 3.3.3.3:r (目标) 10.10.10.10:80
  • (源) 192.168.xy:z (目标) 11.11.11.11:8002 -> (源) 3.3.3.4:r (目标) 11.11.11.11:80
  • (源) 192.168.xy:z (目标) 12.12.12.12:8003 -> (源) 3.3.3.5:r (目标) 12.12.12.12:80
  • (源) 192.168.xy:z (目标) 13.13.13.13:8004 -> (源) 4.4.4.3:r (目标) 13.13.13.13:80

(192.168.xy 可以是私有网络上的任何主机。端口 z 和 r 几乎肯定是临时端口,并且对于每个会话显然是不同的,但 SNAT 显然需要管理该状态以将响应返回给正确的请求者)

以下是一个具体的例子:

数据包可能源自私有网络的接口(例如 192.168.2.5)。因此,源 IP 将是“192.168.2.5”。目标 IP 可能是“10.10.10.10”,目标端口可能是“8001”。路由表告诉本地 IP 路由器将所有发往“0.0.0.0/0”的数据包发送到 192.168.2.1,并且没有更具体的路由表条目。因此,数据包到达 192.168.2.1(SNAT),其目标 IP 为 10.10.10.10,目标端口为 8001。如果发生这种情况,我希望 NAT 将数据包发送到 3.3.3.3:r,目标为 10.10.10.10:80(3.3.3.3 显然必须在映射中定义,并且应基于原始目标端口 8001)。

我认为,如果不需要更改目标端口,这对于 iptables 来说会相对简单 - 但这个问题让我很困惑。

我怎样才能实现这个目标?

相关内容