将一个公网IP重定向到另一个公网IP,不同的子网和服务器

将一个公网IP重定向到另一个公网IP,不同的子网和服务器

这是我的第一个问题,所以我希望我能正确地组织它。

因为这是朋友的案例,所以我很感激能够指导我进行正确的设置,因为我无法访问该环境。

简而言之 - 服务器 A 在 eth0 上有一个公共 IP(31.xxx)。它在特定端口上运行服务,监听 udp 连接。公共服务已移至服务器 B,后者同样有 eth0 和公共 IP,但位于完全不同的子网中。(93.xxx)。

目标是将来自服务器 A 上旧 IP 的所有连接重定向到服务器 b 上的新 IP。服务器 B 需要知道数据包的原始源 IP。

我们已经尝试在服务器 A 上使用 iptables 进行一些配置,使用 dnat 进行预路由,使用 snat/masquerade 进行后路由,并且可以工作,但是服务器 B 上的服务会看到数据包,因为它们来自服务器 A 上的公共 IP。

我读到应该删除后路由,并且服务器 b 在返回此类数据包时应该使用服务器 a 作为默认网关,但我认为这是不可能的,因为它们位于完全不同的网络上。

任何有关我们如何实现目标的帮助都将不胜感激。

先感谢您!

答案1

潜在解决方案 1

我会尝试做什么(它应该可行但我还没有测试过):

  1. 在新服务器上获取第二个可用 IP。使用另一个网络命名空间对其进行配置(您可以使用 Docker 之类的东西)。
  2. 在两个服务之间创建一个隧道(使用 GRE 可能是最简单的,但您可以做任何事情,包括 IPSEC、OpenVPN 等)。
  3. 对于您创建的新网络命名空间,使用隧道作为默认路由。
  4. 在源/旧机器上设置 TPROXY 并将 NAT 到第二个 IP。

现在,一切都有点棘手,因为它也是 UDP。您需要对连接跟踪进行大量处理。

可能的解决方案 2

您可以做的另一件事更简单:编写自定义隧道应用程序,利用此 UDP。它应该执行以下操作:

  1. 应用程序的源部分将在旧服务器上监听 UDP。
  2. 应用程序的目标部分将在新服务器上监听 TCP。
  3. 应用程序的源部分通过其与目标服务器的 TCP 连接发送每个 UDP 数据包(包括 IP 标头)。
  4. 应用程序的目标部分在接收 TCP 流上的数据时,会重建 UDP 数据包(包括 IP 标头),并将其发送到本地主机上的 UDP 端口。IP 欺骗在本地主机上应该可以正常工作。

当然,这会导致 UDP 数据包出现一些延迟,但它可以完成工作。

相关内容