![动态转发/重定向流量至原始目的地,仅更改端口](https://linux22.com/image/727227/%E5%8A%A8%E6%80%81%E8%BD%AC%E5%8F%91%2F%E9%87%8D%E5%AE%9A%E5%90%91%E6%B5%81%E9%87%8F%E8%87%B3%E5%8E%9F%E5%A7%8B%E7%9B%AE%E7%9A%84%E5%9C%B0%EF%BC%8C%E4%BB%85%E6%9B%B4%E6%94%B9%E7%AB%AF%E5%8F%A3.png)
我拥有的:
我有 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
- 源 IP 10.0.0.10 应重写为 192.168.0.2 (gwBC)(如果数据包目标 IP 在网络内:192.168.1.1/24)
- 目标端口应设置为 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:解决方案简化。无需额外的主机路由。