将一个公共IPredirect到另一个公有IP,不同的子网和服务器

这是我的第一个问题,所以我希望我的结构是正确的。

由于这是一个朋友的情况下,我会感谢适当的设置的指导,因为我将无法访问该环境。

简而言之 – 在eth0上有一个公共ip(31.xxx)的服务器A. 它在特定端口上运行服务,侦听udp连接。 公共服务已经被转移到了服务器B,它再次拥有公有IP,但是在完全不同的子网上。 (93.xxx)。

目标是将所有到达服务器A上的旧IP的连接redirect到服务器b上的新IP。 服务器B需要知道报文的原始源IP地址。

我们已经在服务器A上使用了iptables的一些configuration,使用dnat进行prerouting和snat / masquerade进行后台处理,它可以工作,但是服务器B上的服务看到数据包从服务器A上的公共ip进行访问。

我已经读过,应该删除postrouting,而服务器b在返回这样的数据包时应该使用server a作为默认的gw,但是我不认为这是可能的,因为它们在完全不同的networking上。

任何帮助我们如何实现目标是值得赞赏的。

先谢谢你!

潜在的解决scheme1

我会尽力去做(应该可以,但我没有testing过):

  1. 获取新的服务器上可用的第二个IP。 configuration它使用另一个networking命名空间(你可以使用像Docker的东西)。
  2. 在2个服务器之间创build一个隧道(使用GRE可能是最简单的,但你可以做任何事情,包括IPSEC,OpenVPN等)。
  3. 对于您创build的新networking名称空间,请使用隧道作为默认路由。
  4. 在源/旧机器上设置TPROXY,并将NAT设置为第二个IP。

现在,一切都有点棘手,因为它也是UDP。 连接跟踪需要大量的工作。

可能的解决scheme2

你可以做的另一件事,更容易:写一个自定义的隧道应用程序,利用这个UDP。 它应该做这样的事情:

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

当然,这会在UDP数据包上造成一些延迟,但是它会完成这项工作。