HaProxy 3.0
Une nouvelle version majeure du fameux load balancer HaProxy viens de sortir, la version 3.0.
Les nouveautés sont les suivantes : https://www.haproxy.com/blog/announcing-haproxy-3-0
La mise à jour de la 2.9 vers la 3.0 est passé comme une lettre ... juste en changeant les dépôts pour la 3.0.
curl https://haproxy.debian.net/bernat.debian.org.gpg | gpg --dearmor > /usr/share/keyrings/haproxy.debian.net.gpg
echo deb "[signed-by=/usr/share/keyrings/haproxy.debian.net.gpg]" http://haproxy.debian.net bookworm-backports-3.0 main > /etc/apt/sources.list.d/haproxy.list
apt update
apt-get install haproxy=3.0.\*
systemctl restart haproxy.service
Load Balancer devant un cluster Proxmox
J'en profite pour rappeler la sortie récente de Proxmox LE concurrent opensource de VMWare pour la virtualisation, avec notement un assistant d'import de VMs depuis VMWare, une présentation des nouveautés.
Je ferais un article plus tard sur la mise en place d'un cluster, je présente ici ma configuration HaProxy en front du cluster.
Les avantages :
- gestion du https depuis le proxy, avec notement la gestion des certificats ssl vu ici
- les noeuds proxmox ne sont pas directement accessible donc protection de la console Proxmox
- à partir du moment ou les noeuds Proxmox sont dans le cluster n'importe quel noeud peut être accessible depuis le load balancer
Ma configuration
global
log /dev/log local0
log /dev/log local1 notice
chroot /var/lib/haproxy
stats socket /run/haproxy/admin.sock mode 660 level admin
stats timeout 30s
user haproxy
group haproxy
daemon
# Default SSL material locations
ca-base /etc/ssl/certs
crt-base /etc/ssl/private
# See: https://ssl-config.mozilla.org/#server=haproxy&server-version=2.0.3&config=intermediate
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-ciphersuites TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256
ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets
# For acme.sh
setenv ACCOUNT_THUMBPRINT '***************'
defaults
log global
mode http
option httplog
option dontlognull
timeout connect 5000
timeout client 50000
timeout server 50000
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
# Frontends
frontend stats
bind 0.0.0.0:8080
stats enable
stats hide-version
stats uri /
stats realm Haproxy\ Statistics
stats auth login:password
stats refresh 10s
frontend web
bind :80
bind :443 ssl crt /etc/haproxy/certs/ strict-sni alpn h2,h2c,http/1.1
http-request return status 200 content-type text/plain lf-string "%[path,field(-1,/)].${ACCOUNT_THUMBPRINT}\n" if { path_beg '/.well-known/acme-challenge/' }
tcp-request inspect-delay 5s
# Redirect ssl
tcp-request content accept if { req_ssl_hello_type 1 }
http-request redirect scheme https unless { ssl_fc }
# forward header
option forwardfor
# HSTS (63072000 seconds)
http-response set-header Strict-Transport-Security max-age=63072000
# fqdn-proxmox
acl host_pmx hdr(host) -i fqdn-proxmox
use_backend pmx if host_pmx
# fqdn-backups
acl host_pmxbkp hdr(host) -i pmx-bkp.aukfood.ovh
use_backend pmxbkp if host_pmxbkp
# Backends
backend pmx
description Back-end proxmox
mode http
balance roundrobin
option forwardfor
option httpchk GET /
cookie SERVERID insert indirect nocache
http-request set-header X-Forwarded-Port %[dst_port]
http-request add-header X-Forwarded-Proto https if { ssl_fc }
server pmx-01 IP1:8006 cookie S1 check ssl verify none
server pmx-02 IP2:8006 cookie S1 check ssl verify none
server pmx-03 IP3:8006 cookie S1 check ssl verify none
backend pmxbkp
description Back-end proxmox backup
mode http
balance roundrobin
option forwardfor
option httpchk GET /
cookie SERVERID insert indirect nocache
http-request set-header X-Forwarded-Port %[dst_port]
http-request add-header X-Forwarded-Proto https if { ssl_fc }
server pmx-bkp1 IP4:8007 cookie S1 check ssl verify none
On vois ici que j'utilises des ACLs pour suivant l'en-tête host qui arrive sur HaProxy la redirection se fasse directement vers le bon backend.
Voilà de quoi avoir une belle configuration HaProxy.