
✨ Aborda o tema HAProxy e Keepalived, além de load balancer e cluster, também segurança (prevenção da vulnerabilidade de uso fraco de SSL/Cripto (LOGJAM) (CVE-2015-4000)) e contra altas cargas.

HAProxy é um software de código aberto que fornece serviço de servidor proxy para aplicações baseadas em TCP e HTTP com balanceamento de carga de alta disponibilidade.
Keepalived é um software de código aberto capaz de fornecer o recurso de IP failover para mais de dois servidores. O Keepalived utiliza a técnica de comunicação Multicast entre seus pares.
Na nossa estrutura, usaremos o HAProxy como balanceador de carga e o Keepalived para fazer o failover de IP, ou seja, colocar a nossa estrutura HAProxy em Cluster.
No nosso cenário existem 3 servidores. Instalaremos o HAProxy nesses 3 servidores para torná-los um balanceador de carga. Em seguida, instalaremos o serviço Keepalived para que, quando um dos servidores cair, o failover de IP ocorra passando para o outro servidor sem interrupção, mantendo o nosso serviço de balanceador de carga em funcionamento.
Para isso, usaremos 4 IPs (os IPs são totalmente fictícios).
Agora vamos instalar o serviço HAProxy e Keepalived nos 3 servidores da seguinte forma.
sudo add-apt-repository ppa:vbernat/haproxy-2.7 -y
sudo apt update
sudo apt install haproxy keepalived -y
sudo openssl dhparam -out /etc/haproxy/dhparams.pem 2048
Nota1: Os servidores precisam ter “net.ipv4.ip_nonlocal_bind=1”. Caso contrário, a configuração usada para o HAProxy não conseguirá manter o mesmo IP ao mesmo tempo, apresentará erro de bind e o serviço não funcionará. Para isso, você precisa seguir o procedimento abaixo.
Primeiro, edite o arquivo “vi /etc/sysctl.conf”, cole o parâmetro abaixo, salve e saia.
net.ipv4.ip_nonlocal_bind=1
Em seguida, execute o seguinte comando.
sysctl -p
Nota2: Se for usar SSL 443, você precisará ter no diretório “/etc/ssl/private/” um arquivo chamado “haproxy.pem” contendo o Bundle dos seus certificados SSL (.crt,.ca,*.key).
Agora, vamos ver como exemplo a configuração do HAPoxy abaixo. Na sua estrutura, você usará a mesma configuração para cada HAProxy.
Para isso, você editará o arquivo “/etc/haproxy/haproxy.cfg”. A configuração abaixo suporta no mínimo HAv2.
vi /etc/haproxy/haproxy.cfg
Abaixo também estão os valores padrão.
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin expose-fd listeners
stats timeout 30s
user haproxy
group haproxy
daemon
# maxconn 100000 #replaceable
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# Default ciphers to use on SSL-enabled listening sockets.
# For more information, see ciphers(1SSL). This list is from:
# https://hynek.me/articles/hardening-your-web-servers-ssl-ciphers/
# An alternative list with additional directives can be obtained from
# https://mozilla.github.io/server-side-tls/ssl-config-generator/?server=haproxy
ssl-default-bind-ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:RSA+AESGCM:RSA+AES:!aNULL:!MD5:!DSS
#ssl-default-bind-options no-sslv3
ssl-default-bind-ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
ssl-dh-param-file /etc/haproxy/dhparams.pem
#tune.ssl.default-dh-param 2048
# nbproc 1
# nbthread 8
tune.maxrewrite 16384
tune.bufsize 32768
defaults
log global
mode http
option httplog
option dontlognull
option forwardfor
# maxconn 1000000 #replaceable
timeout connect 3000000
timeout client 6000000
timeout server 6000000
errorfile 400 /etc/haproxy/errors/400.http
errorfile 403 /etc/haproxy/errors/403.http
errorfile 408 /etc/haproxy/errors/408.http
errorfile 500 /etc/haproxy/errors/500.http
errorfile 502 /etc/haproxy/errors/502.http
errorfile 503 /etc/haproxy/errors/503.http
errorfile 504 /etc/haproxy/errors/504.http
Parte da configuração do Dashboard para o HAProxy (integração com Prometheus adicionada para monitoramento).
listen stats
bind fatlan.com:8989
mode http
stats enable
stats uri /stats
option http-use-htx
http-request use-service prometheus-exporter if { path /metrics }
#stats hide-version
stats realm HAProxy\ Statistics
stats auth admin:admin
Na configuração abaixo, ACL é usada em dois blocos. No primeiro bloco, se a palavra “rest” aparecer em qualquer lugar do link, o bloco middleware-fatlan-backend será executado; no segundo, para uma requisição a um domínio diferente (forum.fatlan.com), o backend fatlan-forum-backend será executado; todas as demais requisições serão executadas no bloco fatlan-backend443. Exceto outros redirecionamentos de porta.
Parte do redirecionamento da porta 80 para a porta 443.
frontend fatlan80
bind fatlan.com:80
mode http
redirect scheme https if !{ ssl_fc }
frontend fatlan443
bind fatlan.com:443 ssl crt /etc/ssl/private/haproxy.pem ciphers ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS
option httplog
option forwardfor
#http-request set-header X-Client-IP req.hdr_ip([X-Forwarded-For])
#option forwardfor except 127.0.0.0/8
option http-server-close
http-request set-header X-Forwarded-Proto https
# reqadd X-Forwarded-Proto:\ https #old config
mode http
default_backend fatlan-backend443
Exemplo de configuração de ACL (proxypass): redireciona se a palavra rest aparecer em qualquer lugar do link.
acl middleware-fatlan path_beg /rest
use_backend middleware-fatlan-backend if middleware-fatlan
ACL para redirecionar para um host forum diferente.
acl host_fatlanforum hdr(host) -i forum.fatlan.com
use_backend fatlan-forum-backend if host_fatlanforum
Parte do redirecionamento padrão, a parte redirecionada para 443.
backend fatlan-backend443
mode http
balance roundrobin
stick store-request src
stick-table type ip size 256k expire 30m
option forwardfor
# option httplog
option httpchk HEAD /
server frontend_01 10.10.37.12:8001 check port 8001 inter 3000 rise 2 fall 3
server frontend_02 10.10.37.13:8001 check port 8001 inter 3000 rise 2 fall 3
Parte recebida pela ACL e redirecionada para rest.
backend middleware-fatlan-backend
mode http
balance roundrobin
stick store-request src
stick-table type ip size 256k expire 30m
option forwardfor
# option httplog
option httpchk OPTIONS /login HTTP/1.0
http-check expect status 200
http-request replace-path (.*)(?:rest\/)(.*) \1\2
# reqrep ^([^\ :]*)\ /rest[/]?(.*) \1\ //\2 #old config
server middleware_01 10.10.37.34:3000 check port 4000 inter 12000 rise 3 fall 3
server middleware_02 10.10.37.35:3000 check port 4000 inter 12000 rise 3 fall 3