
✨ Affronta HAProxy e Keepalived, oltre al load balancer e al cluster, anche per la sicurezza (prevenzione della vulnerabilità dell'uso debole di SSL/Crypto (LOGJAM) (CVE-2015-4000)) e contro carichi elevati.

HAProxy è un software open source che fornisce un servizio proxy per applicazioni TCP e HTTP con bilanciamento del carico ad alta disponibilità.
Keepalived è un software open source in grado di fornire la funzionalità IP failover per più di due server. Keepalived utilizza al suo interno la tecnica di comunicazione Multicast.
Nella nostra architettura utilizzeremo HAProxy per il bilanciamento del carico e Keepalived per il failover dell'IP, ovvero per rendere la nostra architettura HAProxy un Cluster.
Nel nostro scenario sono presenti 3 server. Installeremo HAProxy su questi 3 server per renderli un bilanciatore di carico. Successivamente installeremo il servizio Keepalived in modo che, quando uno dei server si spegne, esegua un IP failover e passi all'altro server senza interruzioni, mantenendo attivo il nostro servizio di bilanciamento del carico.
Per questo utilizzeremo 4 IP (gli IP sono completamente fittizi)
Ora installiamo i servizi HAProxy e Keepalived su tutti e 3 i server come segue.
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: I server devono avere "net.ipv4.ip_nonlocal_bind=1". Altrimenti, non potendo ospitare lo stesso IP contemporaneamente sulla configurazione utilizzata per HAProxy, si verificherà un errore di bind e il servizio non funzionerà. Per questo è necessario seguire il percorso seguente.
Per prima cosa, modificate il file "vi /etc/sysctl.conf", incollate il seguente parametro, salvate e uscite.
net.ipv4.ip_nonlocal_bind=1
Quindi eseguite il seguente comando.
sysctl -p
Nota2: Se utilizzerete 443 SSL, nella directory "/etc/ssl/private/" deve essere presente il file "haproxy.pem" contenente il Bundle dei vostri SSL (.crt,.ca,*.key).
Ora diamo un'occhiata alla configurazione di HAProxy di esempio qui sotto. Utilizzerete la stessa configurazione per ogni HAProxy nella vostra architettura.
Per questo, modificherete il file "/etc/haproxy/haproxy.cfg". La configurazione seguente supporta minimo HAv2.
vi /etc/haproxy/haproxy.cfg
Di seguito sono presenti anche i valori predefiniti
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 di configurazione Dashboard per HAProxy (aggiunta integrazione prometheus per il monitoraggio)
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
Nella configurazione seguente, in due blocchi è stato utilizzato ACL. Nel primo blocco, se in qualsiasi punto del link è presente la parola "rest", verrà eseguito il blocco middleware-fatlan-backend; nel secondo, per una richiesta a un dominio diverso (forum.fatlan.com) verrà eseguito backend fatlan-forum-backend; altrimenti, tutte le richieste verranno eseguite nel blocco fatlan-backend443. Escluse le altre reindirizzazioni di porta.
Parte di reindirizzamento dalla porta 80 alla 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
Configurazione di esempio ACL (proxypass) se in qualsiasi punto del link è presente la parola rest reindirizza
acl middleware-fatlan path_beg /rest
use_backend middleware-fatlan-backend if middleware-fatlan
Reindirizzamento ad host forum diverso tramite ACL
acl host_fatlanforum hdr(host) -i forum.fatlan.com
use_backend fatlan-forum-backend if host_fatlanforum
Parte reindirizzata di default, parte reindirizzata per 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 reindirizzata rest proveniente da ACL
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