HAProxy com passagem SSL para vários domínios com várias infra-estruturas

Preciso de configurar um balancer de carga para todas as nossas aplicações.

No momento todos os nossos pedidos são agrupados (2 nó appservers, e 1 apache em cada nó bem) e não temos um LB então, nós apenas apontar o alias de DNS para o primeiro servidor de web de cada nó, fazendo com que o segundo nó inútil (tem que manualmente fazer mudar de DNS no caso de uma falha do nó1, e nós não temos o balanceamento de carga https consultas).

cada aplicação usa SSL com um domínio específico Certificado & SSL. não podemos aceitar descodificar o SSL e enviar tráfego não cifrado para as infra-estruturas, uma vez que o LB pode estar localizado noutro país, etc. temos de usar o passe.

Antes de tudo, só queria saber se isto é realmente possível em HAProxy ou não ?

Estou a falar de 50 aplicações diferentes. Nossa configuração LB teria que ser HA, então acho que vamos usar algo como keepalived com um VIP compartilhado para o próprio HAProxy.

a armadilha seria parece-se com isto, suponho.

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 -+
Obrigado pelo vosso apoio, melhores cumprimentos.
Author: olivierg, 2019-08-15

3 answers

Acho que tens duas opções:

  1. Passe o tráfego para a infra-estrutura usando o modo TCP na interface e infra-estrutura haproxy. Isto tem o benefício pelo qual o seu certificado SSL da infra-estrutura é passado. Embora você perca a possibilidade de ter uma rescisão SSL em seu site. Então apresento-te

  2. Ter um certificado SSL (normal), agindo como terminação para o seu site e ativar SSL entre a sua infra-estrutura e instância haproxy. Isto dá-lhe o vantagem de que você ainda tem apenas um ponto de entrada, mas diferentes infra-estruturas com certificados únicos.

A segunda opção pode ser assim:

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

A desvantagem é que você precisa de um certificado de cliente para cada servidor de infra-estrutura, mas que deve ser facilmente automatizável.

 1
Author: zokkker13, 2019-08-17 16:30:05

Como mais uma resposta de atualização para configurações de vários domínios, eu uso o abaixo para roteamento de diferentes domínios. na interface é onde você liga a porta e adiciona as certs que múltiplas têm que estar na mesma linha afaik.

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

A máquina acl é onde você indica o nome do domínio e a infra-estrutura a usar com base nesse nome de domínio.

 acl host_example.com hdr(host) -i example.com

 use_backend BACKEND_NAME if host_example.com

A infra-estrutura onde indica o servidor em que o domínio está a correr.

 backend BACKEND_NAME
    mode http
    option httpclose
    option forwardfor
    cookie JSESSIONID prefix
    server server-name server-ip:443 check ssl verify none
 0
Author: Alex M, 2019-08-27 16:04:17

Para tua informação, estou a usar esta configuração que funciona como um encanto.

Eu substituí os valores nos ficheiros para esconder os nossos domínios e nomes das máquinas, e limitei os números de urls/infra-estruturas, mas temos cerca de 50 a correr agora com a balancer de carga a encaminhar os pedidos para muitos servidores apache (e cada apache encaminha os pedidos para os servidores tomcat por trás)

Sinta-se à vontade se tiver alguma pergunta

Usamos a fonte de equilíbrio para garantir a estabilidade da sessão

#---------------------------------------------------------------------
# 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
 0
Author: olivierg, 2020-06-18 07:10:26