HAProxy 后端-如何连接到远程服务器?

HAProxy 后端-如何连接到远程服务器?

大家下午好,

我是网络托管方面的新手,仍然感觉自己像在大海中学习游泳。我想要做的是设置 HAproxy 将请求转发到后端的远程服务器。该服务器采用 SSL 并位于 Cloudflare 后面。

我搜索了整个互联网,但直到现在我都找不到一个直接明确的答案来回答我的问题。我已经提取了 haproxy 映像,并将其与外部 haproxy.cfg 文件一起用于容器中。没有人明确说明您是否能够将远离网络(非本地)的服务器用作后端服务器,以及如何使用 SSL 进行此通信。如果你们中有任何人对此有所了解,我将非常感激,如果可以做到以及如何做到。

我目前在服务器中使用 NginxProxyManager 容器,并且正在研究 HAProxy 的负载平衡功能。到目前为止,我已经成功地在本地容器周围进行了轮询,但对于远程服务器,我总是在统计信息中得到“停机维护”的响应。我还在 ha-proxy 容器中的终端中运行了 wget 命令,它可以看到外部世界。如果我从 HAProxy 容器内部 ping Google,它会 ping 它。所有容器都连接到桥接网络和 docker 中用户创建的网络(桥接驱动程序)。这就是我完全困惑的原因。所以,主要问题是:可以做到这一点吗?如果可能的话,以下场景是否可行(?):

  1. 客户端向 HAProxy 发出 https 请求
  2. 使用 roundrobin,我(想)在本地容器和远程服务器之间轮换
  3. 当我进入“远程服务器”环节时,我想从后端发送正确的服务器主机(重写 - 我已经可以这样做了,但对于本地容器)以及这是一个 SSL 请求的信息。
  4. 然后 NginxProxyManager 或另一个 HAProxy 会将其转移到那里连接的容器,获取响应并将其发送回(第一个)HAProxy,然后将后者发送至客户端。

我甚至不确定这是否可行。看看下面的代码。它适用于本地容器,但不适用于远程服务器。它发送请求并重写 Host 标头的名称。这是 haproxy.cfg

global
        maxconn     4000
        daemon

defaults
        mode    http
        default-server init-addr last,libc,none
        option  http-keep-alive
        option  redispatch
        retries 3
        timeout connect 10s
        timeout client  1m
        timeout server  1m
        option forwardfor 


resolvers mynameservers
   nameserver ns2 8.8.8.8:853


frontend stats
        bind *:8500
        stats enable
        stats uri /
        stats refresh 10s


frontend ft
        bind 0.0.0.0:443 ssl crt /usr/local/etc/haproxy/ha_trial.pem  
        default_backend bt2

backend bt2
        balance roundrobin
        http-send-name-header Host        
        server web1 web1:8080 check
        server web2 web2:8080 check
        server web3 web3:8080 check        
        server myback.mysite.com myback.mysite.com:443 ssl verify none resolvers mynameservers
## the latter does not work - it ends at down for maintenance in statistics and in logs it says: Layer6 invalid response, info: "SSL handshake failure" while it is "verify none"

如果您能帮我解答(如果您知道的话)和/或为所有像我一样的人(特别是我)提供一些参考,我将不胜感激。

谢谢

答案1

该案例正是 SSL 握手失败案例,因为 HAProxy docker 镜像未启用 QUIC,后端位于 Cloudflare 后面,而 Cloudflare 默认支持 QUIC。如果我在 https 通信协议中使用未启用 QUIC 的其他域,则一切正常。我也很好奇它为什么会以不同的方式处理前端和后端?在前端,它理解 QUIC(?- 或者您和 cloudflare 之间是 QUIC,而 cloudflare 到服务器是不同的加密?)但无法从后端连接?

简而言之:

  1. HAProxy docker 镜像未启用 QUIC - 至少我得到的是 (alpine)
  2. Cloudflare 已默认激活 QUIC 作为其产品的通信协议,并且您不能更改它。
  3. 这两者的合作显然是不可能的,它会给你一个“SSL 握手失败”
  4. 为了修复它,请使用不支持最新技术通信协议的提供商 - 好的,现在这只是缓解措施而不是解决方案。
  5. HAProxy 站点提供了一种从 github 重新编译 HAProxy 并支持 QUIC 的方法,我稍后会研究它...

相关内容