HAProxy 可以混合执行 SSL 终止和直通吗?

HAProxy 可以混合执行 SSL 终止和直通吗?

我正在分析我们的应用程序中间歇性的负载平衡故障。

之前我们一直使用以下配置的 AWS Elastic Load Balancer:

HTTP 80 -> HTTP 80
HTTPS 443 -> HTTPS 443, presenting the same certificate as the backend IIS servers are

现在我们意识到这是一个有点不切实际的设置(LB 和 IIS 服务器都进行相同的加密……浪费工作),现在它开始给我们带来一些问题。具体来说,我们会间歇性地看到对 ELB 的请求延迟激增,需要整整 60 秒(默认超时),然后向客户端报告错误。我们花了大量时间确认延迟峰值与应用程序中的处理延迟无关。

如上所述,我们现在意识到这种设置很奇怪。例如,更自然的 ELB 配置就可以正常工作:

HTTP 80 -> HTTP 80
TCP 443 -> TCP 443, straight passthrough, all encryption happening on the IIS backend

放眼望去,我们很好奇是否可以重现 HAProxy 上错误配置的间歇性故障。即让 HAProxy 终止 SSL,然后启动与后端服务器的另一个完整 SSL 连接。同样,我们意识到这很愚蠢,但是为了比较 ELB 和 HAProxy 的黑盒而进行调查。

这是我尝试过的简单配置:

frontend https_frontend
  bind *:443 ssl crt /etc/ssl/certs/ourpublicandprivatecert.pem
  mode http
  default_backend web_server
backend web_server
  mode http
  server s1 10.0.1.4:443 check

然后,当浏览 HAProxy 主机时,我们得到:

504 Gateway Time-out

The server didn't respond in time.

我猜 HAProxy 正在为证书不匹配而烦恼,但我无法获取日志来证实这一点。另一种可能性是,由于这是一个非常奇怪的设置(混合 SSL 终止和直通),HAProxy 根本不支持它,而是强迫您走更明智的直通或终止路径。

有人有任何见解吗?

答案1

当然,您有一个内置有 OpenSSL 支持的最新版本 HAProxy。

似乎您需要一些额外的参数才能使用 HTTPS 后端。HAProxy 默认尝试正常的 HTTP 连接,而不管端口号是什么。

ssl参数确保 SSL 连接:

server s1 10.0.1.4:443 ssl check check-ssl

默认情况下,服务器证书不经过验证。如果您希望验证它,则需要在服务器行中添加verify required和。ca-file <cafile>

请在此处查看有关选项的更多信息:http://cbonte.github.io/haproxy-dconv/configuration-1.5.html#5.2

答案2

我认为您的后端配置有错误。请尝试:

frontend https_frontend
  bind *:443 ssl crt /etc/ssl/certs/ourpublicandprivatecert.pem
  mode http
  default_backend web_server
backend web_server
  mode http
  server s1 10.0.1.4:80 check

改变的是端口!另外还​​要确保您的 Web 服务器没有从端口 80 重定向到 443,否则会造成混乱。

使用 haproxy 或 ELB 执行 SSL 终止时获得的一个优势是它可以插入诸如 X-Forwarded-For 之类的标头。

如果您只是使用 tcp 选项传递 SSL,而不是在 ELB 或 HAProxy 上执行 SSL,则无法插入标头,因为流已加密。因此,Web 服务器无法对请求执行智能操作,并且 Web 服务器日志中的所有客户端连接看起来都像是来自 elb 或 haproxy 服务器 IP!

因此,不要将加密委托给后端,而是在 ELB 或 HAProxy 实例上完成所有操作并使用 X-Forwarded-For。

相关内容