这是我的第一个问题,所以我希望我能正确地组织它。
因为这是朋友的案例,所以我很感激能够指导我进行正确的设置,因为我无法访问该环境。
简而言之 - 服务器 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
我会尝试做什么(它应该可行但我还没有测试过):
- 在新服务器上获取第二个可用 IP。使用另一个网络命名空间对其进行配置(您可以使用 Docker 之类的东西)。
- 在两个服务之间创建一个隧道(使用 GRE 可能是最简单的,但您可以做任何事情,包括 IPSEC、OpenVPN 等)。
- 对于您创建的新网络命名空间,使用隧道作为默认路由。
- 在源/旧机器上设置 TPROXY 并将 NAT 到第二个 IP。
现在,一切都有点棘手,因为它也是 UDP。您需要对连接跟踪进行大量处理。
可能的解决方案 2
您可以做的另一件事更简单:编写自定义隧道应用程序,利用此 UDP。它应该执行以下操作:
- 应用程序的源部分将在旧服务器上监听 UDP。
- 应用程序的目标部分将在新服务器上监听 TCP。
- 应用程序的源部分通过其与目标服务器的 TCP 连接发送每个 UDP 数据包(包括 IP 标头)。
- 应用程序的目标部分在接收 TCP 流上的数据时,会重建 UDP 数据包(包括 IP 标头),并将其发送到本地主机上的 UDP 端口。IP 欺骗在本地主机上应该可以正常工作。
当然,这会导致 UDP 数据包出现一些延迟,但它可以完成工作。