动态转发/重定向流量至原始目的地,仅更改端口

动态转发/重定向流量至原始目的地,仅更改端口

我拥有的:

我有 2 个基于 Linux 的网关/路由器,连接 3 个网络:

NET-A <=> gwAB <=> NET-B <=> gwBC <=> NET-C

由于路由方面的特定限制,无法使用来自 NET-A 主机的源 IP 地址通过第 3 层 IP/路由访问 NET-C。(因为 NET-C 中的主机是多宿主的,并且正常路由不通过 gwBC

我正在尝试做的事情:

为了通过 gwAB 和 gwBC 从 NET-A 访问 NET-C 中的主机,我尝试执行源 NAT 并结合在 gwBC 上进行端口转发。更具体地说,我尝试通过 gwBC 在特定非标准端口(例如 10022)上对 NET-C 中的任意主机执行 ssh,然后将其转发到端口 22,并使用原始(NET-C)目标地址(基于目标端口 10022)

例子:
假设有以下子网:
NET-A = 10.0.0.1/24
NET-B = 192.168.0.1/24
NET-C = 192.168.1.1/24
... 和主机:
NET-A 中的主机:10.0.0.1 (gwAB) 10.0.0.10(源)
NET-B 中的主机:192.168.0.1 (gwAB) 192.168.0.2 (gwBC)NET-C 中的主机:192.168.1.1 (gwBC) 192.168.1.12(目标)
... 和路由:
gwAB:192.168.1.0/24 via gwBC(192.168.0.2)
gwBC:10.0.0.1/24 via gwAB(192.168.0.1)
目的地:192.168.0.1/24 通过 gwBC,10.0.0.1/24 通过 gwXY

ssh 从 10.0.0.10 到 192.168.1.12:10022

  1. 源 IP 10.0.0.10 应重写为 192.168.0.2 (gwBC)(如果数据包目标 IP 在网络内:192.168.1.1/24)
  2. 目标端口应设置为 22(如果数据包目标 IP 在网络内:192.168.1.1/24)

总结一下,为了产生到/从目标主机 192.168.0.12 的所需路由,应该发生以下 NAT
|SrcIP--:Port|-----DstIP----:Port---| => |--SrcIP---:Port|--DstIP-----:Port|
|10.0.0.10:x |192.168.0.12:10222 | => |192.168.0.2:x |192.168.0.12:22 |

问题:
是否可以使用 iptables 执行此操作(以及如何执行此操作)?我已经尝试使用扩展 REDIRECT 来更改端口。但我发现它只会将流量重定向到机器本身。我也尝试了扩展 DNAT。但我发现只能指定一个新的目标 IP 地址/端口。这不是我想要的,因为我只想更改端口而不是目标。

编辑 1 (17/09/18 22:30 MEZ):根据 Arlion 的回复,对整个帖子进行了重大编辑

答案1

请使用您的默认网关更新您的帖子,或将您当前的路由表的副本翻译并清理到您的帖子中。我会像您指定了另一个默认网关一样写这篇文章。

启用端口转发:

echo 1 > /proc/sys/net/ipv4/ip_forward

为流量去往的地方编写静态路由:

在这一点上我无法帮助你,因为你的帖子在这方面有点不清楚。

NET-A 中的主机:10.0.0.1 (gw) 10.0.0.10 (源) 听起来像

ip route add 10.0.0.10/32 via 10.0.0.1 dev NET-A
iptables -t nat -A POSTROUTING -o NET-A -j MASQUERADE

NET-B 中的主机:10.0.0.2、192.168.0.1(gw)

I think this is a mistake due to a routing conflict here. 
This assumes that the same subnet 10.0.0.2 and 10.0.0.1 lives in two separate locations. 
This would be a fatal flaw in network topology. 
If we wanted to work around this, this would be
ip route add 10.0.0.2/32 via 192.168.0.1 dev NET-B
iptables -t nat -A POSTROUTING -o NET-B -j MASQUERADE

NET-C 中的主机:192.168.0.2、192.168.1.1(网关)192.168.1.12(目标)

 ip route add 192.168.0.2/32 via 192.168.1.12 dev NET-C
 ip route add 192.168.1.1/32 via 192.168.1.12 dev NET-C
 iptables -t nat -A POSTROUTING -o NET-C -j MASQUERADE

伪装 NAT 转发接收所有传入流量,并用其自己的 IP 替换 TCP 标头,然后将数据包像其自身一样转发。

至于最后一部分:通过 NET-A 端口 10022 进入的所有内容都将被端口转发到 192.168.1.2

iptables -A PREROUTING -t nat -i NET-A -p tcp --dport 10022 -j DNAT --to 192.168.1.2:22

答案2

我通过添加 iptables 跳转目标 SNAT 解决了该问题。

按照示例,在 gwBC 上创建了以下 NAT 规则(最后我只使用端口 22,这显然对用户更方便):
iptables -t nat -A POSTROUTING -d 192.168.1.0/24 -p tcp --dport 22 -j SNAT --to-source 192.168.1.1

解释:源地址由 gwBC(NET-C 接口)转换为所有目标:192.168.1.0/24:192.168.1.1。使用此源地址可以应用标准路由。

编辑 1:解决方案简化。无需额外的主机路由。

相关内容