负载平衡和 HTTPS 策略

负载平衡和 HTTPS 策略

我面临以下问题:由于当前的负载平衡策略基于客户端 IP,因此服务器饱和。一些公司客户从大型代理后面访问我们的服务器,因此所有客户端在我们的负载平衡器上都显示相同的 IP。我认为我们正在使用一些硬件负载平衡设备(如有必要,可以进一步调查)。我们需要保持会话亲和性(站点是在 ASP 中构建的),因此所有具有相同 IP 的请求都会路由到同一个节点。

由于所有通信都通过 HTTPS 进行,因此没有请求数据(如会话 ID)可供平衡器用作客户端鉴别器。有没有办法使用 IP 以外的其他数据来区分客户端,并路由来自同一 IP 到不同节点的客户端?

注意:我需要维护平衡器和节点之间的流量安全(加密)。

答案1

如果您目前已安装负载均衡器,最简单的方法是解密负载均衡器上的数据并查看 cookie。此时,您可以将请求以未加密的形式发送到后端服务器,也可以重新加密并发送。

我知道的大多数设置都认为负载均衡器和后端服务器之间的网络连接是安全的,并且由于多种原因,不会费心重新加密流量。其中一个原因是基于硬件的负载均衡器也充当SSL 加速器这是 HTTPS 流量终止于他们的原因之一。另一个原因是它允许流量检查是否受到攻击

答案2

有三种常见的方法可以实现这一点:

首先,您可以更改负载平衡器转发逻辑(要么跟踪到每个主机的连接数并尝试均匀分配负载,要么执行简单的循环等)。我提到的任何一种选择都会消除当前设置的确定性(来自 IP X 的客户端不再转到服务器 Y),这也会消除(或减少)您的问题。

请注意,您需要实现“粘性会话”或其等效功能,以便一旦客户端被随机分配到后端服务器,只要他们的连接处于活动状态,他们就会一直转到同一个服务器。

其次,您可以解密信息,从中读取一些服务器标识符,然后将其传递出去(重新加密或通过后端网络以明文形式传递)。请注意,除非您的负载平衡硬件是 SSL 加速的(例如带有 SSL 模块的 Cisco 内容交换机),否则这在大规模上并不实用,因为您通过的设备必须执行全部SSL 工作。

根据原始问题中的说明,#2 可能不是一个选项,因为流量需要保持端到端加密(听起来在负载均衡器上解密会违反政策?)

我不推荐的第三种方法:为目标服务器设置水平分割或循环 DNS(直接指向后端服务器或指向负载均衡器上静态绑定到后端、具有不同平衡池等的单独 IP)——这在较小的操作中很常见,如“贫民区负载平衡”,但在您的情况下(您已经拥有负载平衡设备),与其他解决方案相比,它增加了不必要的复杂性。

答案3

实现所需目的的唯一方法是在负载均衡器上或之前终止 SSL,然后根据会话 ID 进行负载均衡。在一个软件中完成这两个步骤的开源解决方案包括 nginx、haproxy、varnish 等。

一些硬件负载平衡器过去基于 SSL 会话 ID 进行平衡,但浏览器现在重新协商 SSL 会话,因此不再可靠地工作。

答案4

我不知道您的问题是否已解决。无论如何,一个好的解决方案是使用基于 SSL ID 的会话亲和性。

在这种情况下,您的设备会记住内存表中的 SSL ID,以将具有相同 SSL ID 的用户请求路由到同一个服务器节点。

因此,您必须进一步调查您的负载平衡设备是否符合要求。

相关内容