Skip to content

Haproxy

HAProxy es un proxy inverso gratuito, muy rápido y fiable que ofrece alta disponibilidad, equilibrio de carga y proxy para aplicaciones basadas en TCP y HTTP. Es particularmente adecuado para sitios web de muy alto tráfico y alimenta una parte significativa de los más visitados del mundo. A lo largo de los años, se ha convertido en el equilibrador de carga de código abierto estándar de facto, ahora se envía con la mayoría de las distribuciones principales de Linux y, a menudo, se implementa de forma predeterminada en plataformas en la nube.

Instalación

yum -y install haproxy

Archivo de configuración /etc/haproxy/haproxy.cfg

balanceo simple a dos nodos con stats

[root@node01 ~]# cat /etc/haproxy/haproxy.cfg 
...
frontend LB
    bind 192.168.33.11:80
    reqadd X-Forwarded-Proto:\http
    default_backend LB

backend LB 192.168.33.11:80
    mode http
    stats enable
    stats hide-version
    stats uri /stats
    stats realm Haproxy\Statistics
    stats auth haproxy:reverse
    balance roundrobin
    server nodo02 192.168.33.12:80 check
    server nodo03 192.168.33.13:80 check

Balanceo con ssl

Creación de certificado

[root@node01 ssl]# openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/haproxy.key -out /etc/ssl/haproxy.crt
[root@node01 ssl]# cat haproxy.key haproxy.crt > haproxy.pem

Archivo config

[root@node01 ~]# cat /etc/haproxy/haproxy.cfg 
global
    ...
    tune.ssl.default-dh-param 2048


frontend LBS
    bind 192.168.33.11:443 ssl crt /etc/ssl/haproxy.pem
    reqadd X-Forwarded-Proto:\https
    default_backend LB

frontend LB
    bind 192.168.33.11:80
    reqadd X-Forwarded-Proto:\http
    default_backend LB

backend LB 192.168.33.11:80
    redirect scheme https if !{ ssl_fc }
    mode http
    stats enable
    stats hide-version
    stats uri /stats
    stats realm Haproxy\Statistics
    stats auth haproxy:reverse
    balance roundrobin
    server nodo02 192.168.33.12:80 check
    server nodo03 192.168.33.13:80 check

Escuchar en puerto especifico

[root@node01 ~]# cat /etc/haproxy/haproxy.cfg 
...
listen mysql 192.168.33.100:3307
    mode tcp
    balance roundrobin
    server mariadb1 192.168.33.12:3306 check weight 10
    server mariadb2 192.168.33.13:3306 check weight 20

Extra

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/
    # 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

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


frontend ssl
    bind *:80 
    mode tcp
    option tcplog
    tcp-request inspect-delay 5s
    tcp-request content accept if HTTP

    # capta sinla petición es ssh
    acl client_attempts_ssh payload(0,7) -m bin 5353482d322e30

    use_backend ssh if !HTTP
    use_backend ssh if client_attempts_ssh
    #use_backend secure_http if HTTP

    # según el dominio nde petición redirecciona al backend indicado.
    acl is-tk hdr(host) -i jorgepastorr.tk:50022
    acl is-docs hdr(host) -i docs.jorgepastorr.tk:50022
    use_backend docs if is-tk
    use_backend docs if is-docs

backend ssh
    mode tcp
    option tcplog
    server ssh 127.0.0.1:22 check
    timeout server 1h
    timeout connect 1h

backend docs
    reqadd X-Forwarded-Proto:\ https
    rspadd Strict-Transport-Security:\ max-age=31536000
    mode http
    option httplog
    option forwardfor
    server local_http_server 127.0.0.1:8000

Autorizo la conexión ssh desde el dominio indicado en el usuario pi.

pi@raspberryJorge:~ $ cat ~/.ssh/config
Host jorgepastorr.tk
    ProxyCommand openssl s_client -connect jorgepastorr.tk:50022 -quiet