Objetivo:
En este ejemplo, las solicitudes HTTP se transmiten directamente como solicitudes HTTP a los servidores web HTTP. En el caso de las solicitudes HTTPS, HAproxy las maneja con los certificados y luego las envía a los servidores web como solicitudes HTTP.
Certificados SSL:
Los certificados para todos los hosts virtuales que se utilizan como proxy se almacenan como un archivo de formato PEM por combinación de certificado/clave en el directorio:/etc/ssl/private/
Las CA también se almacenan como un archivo de formato PEM por CA en el directorio:/etc/ssl/certs/
Pasos:
Instalar HAproxy:apt-get update && apt-get install haproxy
Configurar HAproxy para equilibrio de carga HTTP y HTTPS:
Edite el archivo /etc/haproxy/haproxy.cfg
Contenido: 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
Preservar la IP de origen del cliente en TCP Proxying
En los ejemplos anteriores, los protocolos que se equilibran en la carga son protocolos de aplicación, en los que puede conservar la IP de origen recuperándola del encabezado HTTP/HTTPS X-Forwarded-For: (obtenido por la opción:opción forwardfor ), pero si utiliza HAProxy como equilibrador de carga de capa TCP, para conservar la IP de origen (IP del cliente), consulte el siguiente artículo:http://blog.haproxy.com/2012/06/05/preserve-source- ip-address-peste-reverse-proxies/
Es un poco complejo de entender e implementar, especialmente en el servidor backend. Todavía no lo he probado, por lo que no puedo garantizar su validez, por lo tanto, no puedo dar ningún ejemplo. Por lo que entiendo, los únicos cambios necesarios en las directivas de proxy TCP (no se explican aquí) son los siguientes 2 requisitos:
1) La configuración de HAProxy Backend incluye la entrada adicional:fuente 0.0.0.0 usesrc clientip
2) La configuración de la red del servidor back-end debe configurarse para tener la dirección IP del host HaProxy como la puerta de enlace predeterminada.
De esta forma, el servidor backend ve la IP de origen del cliente como si el cliente se conectara directamente al servidor backend y las respuestas del servidor backend se devuelven a través del host HAProxy.
Continuará pronto con ejemplos prácticos...
Feliz equilibrio de carga 🙂