可以通过原始客户端 IP 的开源(第 4 层)负载均衡器吗?

可以通过原始客户端 IP 的开源(第 4 层)负载均衡器吗?

我正在设置一个对所有请求都使用 SSL 的 Web 应用程序。它需要有扩展空间,并且还具有高可用性。似乎处理此问题的“推荐”方法是设置一对第 4 层负载平衡器以实现 HA,这些负载平衡器会传递到一组服务器进行 SSL 解密,然后传递到一组第 7 层负载平衡器,最后传递到 Web 服务器。(参见:http://1wt.eu/articles/2006_lb/index_09.html

我以前使用过 HAProxy,所以我尝试了这样的设置。基本上我有HAProxy in TCP mode => STunnel => HAProxy in HTTP mode => Apache。当我这样做时,apache 可用的客户端 IP 是第二个 HAProxy 服务器的 IP。我可以通过让 STunnel 添加 X-Forwarded-For 标头来稍微改善这一点,但这只给了我第一个 HAProxy 服务器的 IP 地址。我无法找到让 Apache 知道原始客户端 IP 地址的方法。

根据我读过的文档,我认为 HAProxy 无法在 tcp 模式下传递原始客户端的 IP 地址。这样对吗?如果是这样,是否有任何开源软件负载均衡器可以做到这一点?如果没有,是否有任何商业/硬件负载均衡器可以做到这一点?

我想我还应该注意,严格来说,这个负载均衡器不需要是第 4 层负载均衡器。我只需要能够将 SSL 流量传递到 STunnel(或我最终用于 SSL 解密的任何东西)。


顺便提一下,我尝试在没有第 4 层负载均衡器的情况下进行设置(即 STunnel 是链的第一部分)。这解决了客户端 IP 问题。但是,正如上文所预测的那样,STunnel 是瓶颈。它开始以每秒 500 到 600 个请求的速度丢失请求。当然,这不能通过仅添加更多盒子来扩展(同时保持 HA)。根据我给出的要求,这个应用程序应该能够处理每秒1000-5000个请求的峰值流量。

答案1

我强烈建议研究一下 LVS。http://www.linuxvirtualserver.org/

它不仅能够执行正常的 NAT 路由,还能执行 IP 隧道和直接路由,直接发送回客户端。

答案2

你看过吗:http://httpd.apache.org/docs/2.3/mod/mod_remoteip.html它将根据 X-Forwarded-for 标头重写 IP。

答案3

F5 的 BigIP 是一款效果很好的商业解决方案。X-Forwarded-For 是作为 http 配置文件选项实现的。不过它并不便宜。

Apache TrafficServer 可以设置为插入 X-Forwarded-For 标头,而且不收取任何费用。我从未使用过它,但它确实有一个配置变量:proxy.config.http.append_xforwards_header

相关内容