rx 和 tx 的不同路线

rx 和 tx 的不同路线

设想:

  • 服务器 A 具有客户端可以连接的知名 IP 地址。服务器 B 没有。

  • 服务器 A 可以轻松检索服务器 B 的 IP 地址。

  • 服务器 A 的网络出站费用极其昂贵。网络入口是免费的。

  • 服务器 B 上的入口和出口都是免费的。

  • 客户端发送 TCP 和 UDP 流量

是否可以让客户端连接到服务器 A,将这些数据包转发到服务器 B,并让服务器 B 直接响应客户端(在往返中不包括服务器 A)?

我很难想象这是如何工作的;似乎需要 3 条信息。客户端地址 服务器 A 地址 服务器 B 地址

服务器 A 收到客户端发来的数据包,向服务器 B 发送数据包,但是服务器 B 如何知道客户端地址和服务器 A 的地址,以便将数据包发回来呢?这假设客户端收到的数据包必须使用客户端地址和服务器 A 的地址。

是否可以使用 DNAT/SNAT 将客户端和服务器 A 地址包含在服务器 B 收到的数据包中来解决这个问题?我假设这需要在服务器 A 和服务器 B 上都添加一些额外的路由规则。

编辑 当我提到“地址”时,我指的是 IP 地址和端口号的组合,我假设它们是到达所需套接字所必需的,因为这里考虑的场景是针对 TCP 或 UDP 流量。

答案1

注意,这是非常普遍来讲(对我来说太笼统了,但由于你的问题很笼统,所以我们开始吧):

  • 客户端有 IP_c
  • 服务器 A 有 IP_a
  • 服务器 B 有 IP_b

它会像这样。笔记:为了简单起见(因此在您将端口要求添加到问题后我不必重写我的答案)我不包含端口,但即使有端口,原理仍然保持不变:

  • 客户端向 IP_a 发送数据包
  • 服务器 A 使用 DNAT 将目标 IP 从 IP_a 更改为 IP_b(源 IP 仍为 IP_c),从而将数据包转发到服务器 B。注意:理论上,转发不一定是服务器 A,而是服务器 A 之前的某个路由器,但这取决于特定的网络设置。

对于返回数据包:

  • 如果没有任何进一步的修改,返回数据包将以 IP_c 作为目的地,以 IP_b 作为源,在这种情况下,客户端将无法识别该数据包,因为它具有不同的源 IP,因此这将不起作用。

  • 为了挽救局面,服务器 B(或返回路径上的另一个路由器,同样取决于特定的网络设置)必须使用 SNAT 将源从 IP_b 更改为 IP_a。

  • 注意(这是实际自定义部分所在,因为常规 NAT 解决方案默认不这样做):必须非常小心地设置,否则将严重阻碍使用 IP_b 与服务器 B 进行直接网络通信。服务器 B(或任何执行 SNAT 的设备)必须知道何时替换源 IP,因为初始数据包被转发,何时保持源 IP 为 IP_b,因为初始数据包直接发送到 IP_b。服务器 A 也是如此。可能还有其他问题需要解决,但这将是主要问题。

回答你的问题:是的,一般来说这是“有效的”您将保留从服务器 A 到服务器 B 的流量。由于从服务器 B 传出的流量成本高昂,因此您建议的解决方案只能解决您的初始问题,在这种情形下,我们可以假设生成的流量大部分将是来自服务器 B 的传出流量,而到服务器 A 的需要转发的流量可以忽略不计。

您实际上需要做的是让客户端直接联系服务器 B,而不通过服务器 C,否则您将无法消除成本。这通常是通过使用域名访问服务器 A 来实现的,然后客户端将询问 DNS 将流量发送到哪个 IP 地址。

关于您的“子问题”:

服务器A从客户端接收数据包,并将数据包发送到服务器B,但服务器B如何知道客户端地址和服务器A的地址以便将数据包发送回来?

路由或 NAT 的工作方式并非如此。通常,只有目标 IP(和/或端口)会发生变化(从 A 变为 B),而返回数据包时源 IP 会变回(从 B 变为 A)。这通常由同一设备完成,因此跟踪不是问题。但您不能使用此解决方案,因为在您的情况下,它不会避免来自服务器 A 的传出流量。因此服务器 A 将仅使用 DNAT...(见上文)

相关内容