【问题标题】:HAProxy with SSL passthrough to multiple domains with multiple backends具有 SSL 直通到具有多个后端的多个域的 HAProxy
【发布时间】:2019-12-22 03:26:56
【问题描述】:

我需要为我们所有的应用程序设置一个负载平衡器。

目前我们所有的应用程序都是集群的(2 节点应用服务器,每个节点上也有 1 个 apache),我们没有 LB,所以我们只需将我们的 DNS 别名指向每个节点的第一个网络服务器,使第二个节点没用(必须手动进行 DNS 切换,以防节点 1 发生故障,而且我们没有负载均衡的 https 查询)。

每个应用程序都使用带有特定域和 SSL 证书的 SSL。我们不能接受解密 SSL 并将未加密的流量发送到后端,因为 LB 可能位于另一个国家/地区等,因此我们需要使用直通。

首先,我只是想知道这在 HAProxy 中是否真的可行?

我说的是大约 50 种不同的应用程序。我们的 LB 配置必须是 HA,所以我想我们会为 HAProxy 本身使用带有共享 VIP 的 keepalived 之类的东西。

我想设置看起来像这样:

domain-a.com-'            '-> backend_dom_a -> 1.1.1.1 (app node1 dom a)
             |            |                    1.1.1.2 (app node2 dom a)
domain-b.com-'            '-> backend_dom_b -> 2.1.1.1 (app node1 dom b)
             |            |                    2.1.1.2 (app node2 dom b)
domain-c.com-'            '-> backend_dom_c -> 3.1.1.1 (app node1 dom c)
             |            |                    3.1.1.2 (app node2 dom c)
domain-N.com-'            '-> backend_dom_N -> 4.1.1.1 (app node1 dom N)
             |            |                    4.1.1.2 (app node2 dom N)
             +-> haproxy -+

感谢您的支持,最好的问候

【问题讨论】:

    标签: apache ssl nginx load-balancing haproxy


    【解决方案1】:

    我认为你有两个选择:

    1. 在 haproxy 前端和后端使用 TCP 模式将流量传递到后端。这样做的好处是您的后端 SSL 证书可以通过。尽管您失去了在您的站点中拥有一个 SSL 终止的可能性。所以我介绍你

    2. 拥有一个(通常的)SSL 证书,作为您站点的终端,并在您的后端和 haproxy 实例之间启用 SSL。这给您带来的优势是您仍然只有一个入口点,但不同的后端具有唯一的证书。

    第二个选项可能如下所示:

    frontend f_foo
        bind :443 ssl crt /path/to/bundle
        mode http
        log global
    
        use_backend b2_foo
    
    backend be_foo
        mode http
        timeout connect 5s
        server FOO address:port ssl check crt /path/to/client/bundle force-tlsv10 verify none
    

    缺点是每个后端服务器都需要一个客户端证书,但这应该很容易实现自动化。

    【讨论】:

    • 感谢您的回答。我想我们必须按照我们的要求坚持第 4 层负载平衡,现在我在整个事情背后的真正问题是,所呈现的模式实际上是可行的,并且可以使用 HAproxy(不管我必须实现的配置),并且有什么技术要求,比如..我可以在 LB 上只使用 1 个虚拟 IP,还是每个站点/域需要 1 个 VIP?我想我们可以只使用 1 并使用每个域的 acl/规则来重定向基于域的流量?
    • 您的 OP 中的描述应该有效。有 2 个 haproxy,将它们与一个带有 keepalived 的虚拟 IP 结合起来,你应该会很好。然后以 TCP 模式连接到后端,每个前端有两台服务器。听起来应该可以。
    • 谢谢,我会试试的,是的,我也期待使用 keepalived。一旦我获得工作配置,可能会发布我的结果,并将问题标记为已解决
    • 感谢您的所有回答,我找到了我的解决方案,明天下班发布。
    • 很高兴能给你一些想法:)
    【解决方案2】:

    作为多域配置的更多更新答案,我使用以下内容来路由不同的域。 在前端是您绑定端口并添加多个必须在同一行 afaik 上的证书。

     frontend https_in
            bind *:443 ssl crt /link/to/cert+key-file.pem  crt /link/to/cert+key-file.pem
    

    acl 主机是您指定域名以及根据该域名使用哪个后端的位置。

     acl host_example.com hdr(host) -i example.com
    
     use_backend BACKEND_NAME if host_example.com
    

    您指定运行域的服务器的后端。

     backend BACKEND_NAME
        mode http
        option httpclose
        option forwardfor
        cookie JSESSIONID prefix
        server server-name server-ip:443 check ssl verify none
    

    【讨论】:

      【解决方案3】:

      仅供参考,我正在使用这个配置,就像一个魅力。

      我已经替换了文件中的值以隐藏我们的域和主机名,并限制了 url/后端的数量,但我们现在有大约 50 个正在运行,负载均衡器将请求转发到许多 apache 服务器(并且每个 apache 将请求转发到Tomcat服务器落后)

      如果您有任何问题,请随时提出

      我们使用平衡来源来确保会话粘性

      #---------------------------------------------------------------------
      # Global settings
      #---------------------------------------------------------------------
      global
          daemon
          user                haproxy
          group               haproxy
          log                 /dev/log local6 notice
          log                 /dev/log local5 info
          maxconn             50000
          #chroot              /var/lib/haproxy
          pidfile             /var/run/haproxy.pid
      
      #---------------------------------------------------------------------
      # common defaults that all the 'listen' and 'backend' sections will
      # use if not designated in their block
      #---------------------------------------------------------------------
      defaults
          mode                 tcp
          option               tcplog
          log                  global
          option               dontlognull
          timeout connect      5000
          timeout client       50000
          timeout server       50000
      
      #---------------------------------------------------------------------
      # dedicated stats page
      #---------------------------------------------------------------------
      listen stats
          mode http
          bind :22222
          stats enable
          stats uri            /haproxy?stats
          stats realm          Haproxy\ Statistics
          stats auth           <mylogin>:<mypass>
          stats refresh        30s
      
      #---------------------------------------------------------------------
      # main frontend which proxys to the backends
      #---------------------------------------------------------------------
      frontend main_https_listen
          bind <ip address>:443
          mode                tcp
          option              tcplog
          log                 global
          tcp-request inspect-delay 5s
          tcp-request content accept if { req.ssl_hello_type 1 }
      
      #---------------------------------------------------------------------
      # Common HAProxy nodes configuration
      #---------------------------------------------------------------------
      
      # -------------------------------
      # ACLs
      # -------------------------------
      
      acl acl_SIT_AT35073      req.ssl_sni -i <app_url1>.my.domain.net  # SIT_AT35073 is just an internal code we use, but you can use any alias
      acl acl_SIT_AT34305      req.ssl_sni -i <app_url2>.my.domain.net
      acl acl_SIT_AT28548      req.ssl_sni -i <app_urlN>.my.domain.net
      
      # -------------------------------
      # Conditions
      # -------------------------------
      
      use_backend backend_SIT_AT35073 if acl_SIT_AT35073   # same here
      use_backend backend_SIT_AT34305 if acl_SIT_AT34305
      use_backend backend_SIT_AT28548 if acl_SIT_AT28548
      
      #---------------------------------------------------------------------
      # Backends
      #---------------------------------------------------------------------
      
      # APP 1
      backend backend_SIT_AT35073
          description APPNAME1
          mode tcp
          balance source
          option ssl-hello-chk
          server server_SIT_AT35073_1 <apache_server1>.my.domain.net:443 check
          server server_SIT_AT35073_2 <apache_server2>.my.domain.net:443 check
      
      # APP 2
      backend backend_SIT_AT34305
          description APPNAME2
          mode tcp
          balance source
          option ssl-hello-chk
          server server_SIT_AT34305_1 <apache_server3>.my.domain.net:443 check
          server server_SIT_AT34305_2 <apache_server4>.my.domain.net:443 check
      
      # APP N
      backend backend_SIT_AT28548
          description APPNAMEN
          mode tcp
          balance source
          option ssl-hello-chk
          server server_SIT_AT28548_1 <apache_server5>.my.domain.net:443 check
          server server_SIT_AT28548_2 <apache_server6>.my.domain.net:443 check
      

      【讨论】:

        猜你喜欢
        • 2014-08-27
        • 2012-10-30
        • 2017-06-05
        • 1970-01-01
        • 2012-05-27
        • 2015-03-18
        • 2016-01-08
        • 2010-10-29
        • 2013-07-21
        相关资源
        最近更新 更多