缺少转发信息

缺少转发信息

我使用以下配置来平衡 https 连接的负载,使用 haproxy 1.4.8。SSL 卸载由 apache 完成。

listen ssl_to_waf 192.168.101.54:443
    mode tcp
    balance roundrobin
    option ssl-hello-chk
    server wafA 192.168.101.61:444 check

listen ssl_from_waf 192.168.101.61:445
    balance roundrobin
    option forwardfor
    server webA 192.168.101.46:80 check

对于 HTTP 请求,这种方法效果很好,请求可以顺利分发到我的 Apache 服务器。但对于 HTTPS 请求,我丢失了“forwardfor”信息。我需要保存客户端 IP 地址。如何使用 HAproxy 在多个 SSL 服务器之间进行负载平衡,让这些服务器知道客户端的 IP 地址?

答案1

简短的回答是:你不能。

HAProxy 无法理解 SSL,因此在 TCP 模式下平衡这些连接。该forwardfor选项在 TCP 模式下没有任何意义,因为它是一个 HTTP 标头。

我读到的有关 SSL 和 HAProxy 的所有内容都建议使用其他软件在...前面HAProxy 处理 SSL 卸载。有人建议使用 Pound 和 nginx,但有人提出了一个有效的观点:这些服务器本身就是负载平衡代理服务器,既然您可以让其中一个服务器处理负载平衡并完全移除 HAProxy,那为什么要引入额外的复杂性和额外的跳数呢?

答案2

升级到 haproxy 1.5-dev12 并启用 SSL 卸载。这样,即使客户端使用 SSL,后端服务器也会获得 HTTP 连接。由于 haproxy 可以看到 SSL 会话内部,因此它可以添加 forwardfor 标头。

答案3

我永远不会建议在生产环境中使用开发软件。我在同一台机器上使用 nginx 进行 ssl,位于 ha 代理前面。即使在重负载下也能很好地工作。您的 apache 服务器将获得 http 流量。您需要将 x-forwarded-for 标头发送到 apache,然后安装 mod-rpaf 模块,以便 apache 可以看到客户端 ip。您可能还需要设置 apache 环境变量,以便应用程序知道连接是在 ssl 中。

相关内容