Estou tendo alguns problemas para configurar o HAProxy como um balanceador de carga TCP (camada 4) e gostaria de receber seu conselho sobre isso.
tenho seguido muitos guias na web e cheguei a esta configuração (não mostra nenhum erro nos logs, começa bem):
nota: nomes de domínio reais são mascarados
#---------------------------------------------------------------------
# Global settings
#---------------------------------------------------------------------
global
daemon
user haproxy
group haproxy
log /dev/log local6 debug
maxconn 50000
chroot /var/lib/haproxy
pidfile /var/run/haproxy.pid
#---------------------------------------------------------------------
# common defaults
#---------------------------------------------------------------------
defaults
mode tcp
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 xxxxxx:xxxxxxxx
stats refresh 30s
#---------------------------------------------------------------------
# main frontend which proxys to the backends
#---------------------------------------------------------------------
frontend main_https_listen
bind *:443
mode tcp
option tcplog
# -------------------------------
# ACLs - SIT
# -------------------------------
acl acl_SIT_CI5 req.ssl_sni -i url1.domain.net
acl acl_SIT_HR8 req.ssl_sni -i url2.domain.net
# -------------------------------
# Conditions - SIT
# -------------------------------
use_backend backend_SIT_CI5 if acl_SIT_CI5
use_backend backend_SIT_HR8 if acl_SIT_HR8
#---------------------------------------------------------------------
# Backends
#---------------------------------------------------------------------
backend backend_SIT_CI5
mode tcp
balance source
option ssl-hello-chk
server server_SIT_CI5_1 host1.domain.net:443 check
server server_SIT_CI5_2 host2.domain.net:443 check
backend backend_SIT_HR8
mode tcp
balance source
option ssl-hello-chk
server server_SIT_HR8_1 host1.domain.net:443 check
server server_SIT_HR8_2 host2.domain.net:443 check
eu apontei host1.domain.net para o meu haproxy vIP (ele tem uma configuração keepalived por trás com um IP virtual).
agora ao acessar https://url1.domain.net (ou mesmo https://loadbalancerURL mas suponho que isso seja normal nesse) eu tenho um erro Esta página não pode ser exibida. Ative o TLS 1.0, TLS 1.1 e TLS 1.2 em Configurações avançadas e tente conectar-se a https://host1.domain.net novamente .
um único openssl s_client fornece uma falha de handshake SSL (sem certificados blabla).
você tem alguma ideia do que eu fiz de errado? Além disso, preciso configurar alguns certificados enquanto estou ouvindo em 443? (mesmo que eu não queira que esses certificados sejam descriptografados ou qualquer outra coisa, pois só quero que meu HAProxy atue como um proxy).
eu também tentei ativar o modo de depuração para log, mas não mostrou nenhum erro (nem novos logs)
nota : os backends estão localizados atrás de firewalls, a comunicação entre backends para o HAProxy não é aberta no 443 (somente do Haproxy para os backends), precisa ser direcional ? e porque ?
note2: nas estatísticas do haproxy, posso ver todos os back-ends UP
Além disso, existe uma maneira de saber/verificar se um redirecionamento baseado no nome do host (SNI) está funcionando bem ou não? (tenho a impressão de que a conexão fica no load balancer e não é redirecionada para o backend, e é por isso que estou com erro)
um haproxy -vv dá:
HA-Proxy version 1.5.18 2016/05/10
Copyright 2000-2016 Willy Tarreau <[email protected]>
Build options :
TARGET = linux2628
CPU = generic
CC = gcc
CFLAGS = -O2 -g -fno-strict-aliasing -DTCP_USER_TIMEOUT=18
OPTIONS = USE_LINUX_TPROXY=1 USE_GETADDRINFO=1 USE_ZLIB=1 USE_REGPARM=1 USE_OPENSSL=1 USE_PCRE=1
Default settings :
maxconn = 2000, bufsize = 16384, maxrewrite = 8192, maxpollevents = 200
Encrypted password support via crypt(3): yes
Built with zlib version : 1.2.7
Compression algorithms supported : identity, deflate, gzip
Built with OpenSSL version : OpenSSL 1.0.2k-fips 26 Jan 2017
Running on OpenSSL version : OpenSSL 1.0.2k-fips 26 Jan 2017
OpenSSL library supports TLS extensions : yes
OpenSSL library supports SNI : yes
OpenSSL library supports prefer-server-ciphers : yes
Built with PCRE version : 8.32 2012-11-30
PCRE library supports JIT : no (USE_PCRE_JIT not set)
Built with transparent proxy support using: IP_TRANSPARENT IPV6_TRANSPARENT IP_FREEBIND
Available polling systems :
epoll : pref=300, test result OK
poll : pref=200, test result OK
select : pref=150, test result OK
Total: 3 (3 usable), will use epoll.
ew, eu fiz isso funcionar adicionando isso no frontend (depois de ver este post :)
a coisa é, eu não sei o que essas opções estão fazendo .. ou porque eu preciso especificá-los. isso significa que o comportamento padrão do HAProxy é rejeitar qualquer coisa?
As duas linhas que você adicionou garantem que o HAProxy tenha tempo suficiente para ler o cabeçalho SNI antes de escolher um back-end e também verificar se é realmente tráfego SSL (ou rejeitá-lo).
Você provavelmente também deseja selecionar um back-end padrão:
para um SNI que não corresponde.