向服务器 x 发出请求 来自服务器 y 的回复

向服务器 x 发出请求 来自服务器 y 的回复

我需要你们的一些建议:我正在处理一个自定义负载均衡器/软件,我们将为此使用 2 个主服务器和大约 8 个从属服务器。简而言之:用户将请求发送到主服务器,主服务器将接收并处理请求,将请求发送到从属服务器,从属服务器应直接将数据发送给“用户”。

用户 -> 主服务器

主服务器 -> 从服务器

从服务器 -> 用户

  • 数据应该直接发送给用户而不是通过主服务器的原因是由于带宽和预算低。

现在我有以下想法:-IPinIP,但这在 Layer7 中是不可能的(到目前为止,我知道有一些昂贵的路由器可以实现这一点)-IP Spoof,使用 C/C++ 我们将使它看起来像是来自主服务器的回复。

但我在想,也许“从服务器 -> 用户”的回复可能来自不同的 IP,而不会导致用户防火墙或防病毒软件出现问题。我不太了解“家用”防火墙/路由器和/或防病毒软件。我猜用户机器不能很好地处理它?

答案1

我认为这取决于自定义负载均衡器(我猜是示意图中所示的主服务器)和从属服务器应用程序的配置方式。在负载均衡器中,通常有两个原则可用于围绕请求/回复路由进行实际设计:

1) 如果您可以告诉主服务器不要使用自己的 IP 地址作为源 IP,而是使用客户端 IP(如根据您的示意图所示,数据包最初到达主服务器时所含的 IP)作为源 IP。从服务器自然会将其回复直接发送给客户端,而不是通过主服务器。这是负载平衡器中相当常见的功能,我们网络人员通常将源重写称为“源 nat”,而不是 IP 欺骗,以区分良性意图,您应该能够利用此功能对这个主题进行一些有趣的 Google 搜索。

2) 另一个设计选项是嵌入类似于 http 中的 X-Forwarded-For 标头或 ajp 中的 remote_addr/remote_host(不记得是哪个)字段的元信息,这些元信息用于将原始客户端 ip 地址作为数据字段的一部分携带,即使它已被 ip 数据包中的中间主机地址替换。如果使用您正在使用的协议可以实现类似的效果,则您的主服务器需要将该元信息注入到所选字段中。需要指示从属服务器上的应用程序将回复发送到该字段中的地址,而不是 ip 数据包中的源地址。这种设计的优点之一是它可以实现出色的日志记录,因为您可以访问参与特定流的所有节点地址。

这是原则上的,在实践中,如果客户端期望从属服务器的回复与请求属于同一会话(等等),您可能会遇到一些麻烦。这完全取决于您尝试传递的协议的期望,以及您的服务周围有哪些基础设施可以为您解决问题 :-)

相关内容