Objectif :
Dans cet exemple, les requêtes HTTP sont transmises directement en tant que requêtes HTTP aux serveurs Web HTTP. Dans le cas des requêtes HTTPS, elles sont gérées avec les certificats par HAproxy, puis transmises aux serveurs Web en tant que requêtes HTTP.
Certificats SSL :
Les certificats de tous les hôtes virtuels faisant l'objet d'un proxy sont stockés dans un fichier au format PEM par combinaison certificat/clé dans le répertoire :/etc/ssl/private/
Les CA sont également stockées sous la forme d'un fichier au format PEM par CA dans le répertoire :/etc/ssl/certs/
Étapes :
Installer HAproxy :apt-get update && apt-get install haproxy
Configurer HAproxy pour l'équilibrage de charge HTTP et HTTPS :
Editez le fichier /etc/haproxy/haproxy.cfg
Contenu : 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
#
# 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/
ssl-default-bind-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
ssl-default-bind-options no-sslv3
tune.ssl.default-dh-param 2048
#
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
# Added to create separate error and access logs
option log-separate-errors
#
# ------- HTTP Frontend --------------
frontend http_in
bind *:80
mode http
reqadd X-Forwarded-Proto:\ http
default_backend http_out
#
# ------- HTTPS Frontend --------------
frontend https_glwp-in
bind *:443 ssl crt /etc/ssl/haproxy_certs/
mode http
reqadd X-Forwarded-Proto:\ https
default_backend http_out
#
#------------------------------------
listen stats :2000
mode http
stats enable
stats hide-version
stats realm Haproxy\ Statistics
stats uri /stats
stats auth admin:mypasswd
#
# ------- HTTP Backend --------------
backend http_out
balance roundrobin
stick-table type ip size 200k expire 60m
stick on src
option forwardfor
option httpclose
http-request set-header X-Forwarded-Port %[dst_port]
option httpchk HEAD /
server web1 webserv1.mynet.net:80 check
server web2 webserv2.mynet.net:80 check
server web3 webserv3.mynet.net:80 check
server web4 webserv4.mynet.net:80 check
Conserver l'adresse IP source du client dans le proxy TCP
Dans les exemples ci-dessus, les protocoles dont la charge est équilibrée sont des protocoles d'application, où vous pouvez conserver l'adresse IP source en la récupérant à partir de l'en-tête HTTP/HTTPS X-Forwarded-For : (obtenu par l'option :option forwardfor ), mais si vous utilisez HAProxy comme équilibreur de charge de la couche TCP, afin de conserver l'IP source (l'IP du client) voir l'article suivant :http://blog.haproxy.com/2012/06/05/preserve-source- ip-address-despite-reverse-proxies/
C'est un tout petit peu complexe à comprendre et à mettre en œuvre, surtout dans le serveur backend. Je ne l'ai pas encore essayé, donc je ne peux pas garantir sa validité donc je ne peux pas donner d'exemples. D'après ce que j'ai compris, les seules modifications nécessaires aux directives de proxy TCP (non expliquées ici) sont les 2 exigences suivantes :
1) La configuration HAProxy Backend inclut l'entrée supplémentaire :source 0.0.0.0 usesrc clientip
2) Les paramètres réseau du serveur principal doivent être configurés pour avoir l'adresse IP de l'hôte HaProxy comme passerelle par défaut.
De cette façon, le serveur backend voit l'adresse IP source du client comme si le client se connectait directement au serveur backend et les réponses du serveur backend étaient renvoyées via l'hôte HAProxy.
A suivre bientôt avec des exemples pratiques…..
Bon équilibrage de charge 🙂