HAProxy 在 TCP 模式下不通过 SSL 流量(未知协议)

out*_*dge 5 ssl https openssl haproxy

我有一个 HAProxy LB 解决方案设置并且工作正常。端口 80 上的所有 HTTP 流量都成功通过。

我现在正在尝试让 SSL 流量正常工作(在 TCP 模式下,现在只在一台服务器上)但是我在通过 openssl 测试时不断收到以下错误:

26396:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:s23_clnt.c:588:
Run Code Online (Sandbox Code Playgroud)

但是,当我在 Web 服务器 IP 地址和主机名上尝试相同的测试 (openssl s_client -connect) 时,一切似乎都正常。我可以在本地设置主机记录并确认浏览器成功地为域获取 SSL 证书。

我想这让我得出结论,我的 HAProxy 设置存在问题,因此非常感谢这里的一些建议。

frontend https-c-in
    bind 178.79.xxx.xxx:443
    mode tcp
    default_backend c-https

backend c-https
    balance source
    option ssl-hello-chk
    option httpclose
    server  c-web-01 192.168.xxx.xxx:443 check inter 2000 rise 2 fall 5
Run Code Online (Sandbox Code Playgroud)

out*_*dge 20

我已经解决了!

您必须在前端和后端都有“模式 tcp”呃

frontend https-c-in
   bind 178.79.xxx.xxx:443
   mode tcp
   default_backend c-https

backend c-https
   balance source
   mode tcp
   option ssl-hello-chk
   server  c-web-01 192.168.xxx.xxx:443 check inter 2000 rise 2 fall 5
Run Code Online (Sandbox Code Playgroud)

  • “mode tcp”是默认设置。如果您需要在两个部分都指定它,那么这意味着您有一个“默认值”部分,上面设置了“模式 http”和可能的其他设置。我强烈建议您不要在这样的默认部分之后放置一些 TCP 部分。更好地为 TCP 设置定义一个新的默认部分,以便重置那些专用于 HTTP 的设置。 (6认同)
  • 以“defaults”开头的新块将开始一个新的默认部分,允许您覆盖前一个部分。当您通过相同的 haproxy 设置对多个 HTTP、HTTPS 和 FTP 进行负载平衡时,这非常方便。我习惯于放置一个大的 3 行注释,以使其非常明显,并为其命名。 (2认同)