HAProxy

Instalando HAProxy

Instalando HAProxy via apt

sudo apt install haproxy

Instalando HAProxy via Docker

# Instalando um container docker com o haproxy com acesso a todas as portas da máquina hostsudo docker run --name haproxy --hostname haproxy -d --restart unless-stopped --network host haproxy# Mas perai, o haproxy não iniciou! O erro é o seguinte:# [ALERT] 339/051209 (1) : Cannot open configuration file/directory /usr/local/etc/haproxy/haproxy.cfg : No such file or directory# É preciso criar um haproxy.conf antes de executar.

Criando um HAProxy 2.1 com portas mapeadas para o computador host.

sudo docker run --name haproxy2 --hostname haproxy2 -d --restart unless-stopped --network host --log-driver=journald -v /home/tiago/docker-volumes/haproxy2:/usr/local/etc/haproxy/ haproxy:2.1

Crie o seu haproxy.conf e copie-o para dentro do conteiner

sudo docker cp haproxy.conf haproxy:/usr/local/etc/haproxy/haproxy.cfg

sudo docker exec -it haproxy bash

Ou então crie um Dockerfile com as configurações desejadas

Crie uma pasta/diretório chamada my-haproxy-image (ou qualquer outro nome) e entre nela.

Crie/copie os certificados SSL/TLS que deseja usar no haproxy.

Crie/copie o arquivo de configuração do haproxy desejado com o nome haproxy.cfg

FROM haproxyCOPY haproxy.cfg /usr/local/etc/haproxy/haproxy.cfg

Configurando o HAProxy

A principal forma de configurar o HAProxy é através do arquivo de configuração haproxy.cfg. Podemos dizer que é o coração do HAProxy.

O arquivo fica em:

# Para Debian e Ubuntu/etc/haproxy/haproxy.cfg# Para PfSense# No PfSense, não edite esse arquivo manualmente pois ele é substituído pela interface gráfica./var/etc/haproxy/haproxy.cfg

Verificando se o o arquivo de configuração é válido

haproxy -c -V -f /etc/haproxy/haproxy.cfg

Usando TLS/SSL no HAProxy

O HAProxy, além de ser um Load Balancer também serve para encriptar conexões HTTP e TCP com o TLS (Transport Layer Security).

Sem o TLS, todas as mensagens trocadas entre um cliente e um servidor são visíveis e legíveis para todos que tiverem o poder de interceptá-las (roteadores, administrador de redes de uma empresa, provedores de VPN, provedores de proxy, provedores de internet). Com o TLS, as mensagens trocadas entre um cliente e um servidor são todas criptografadas, de forma que se alguém interceptá-las, não conseguirá entender nada, todos os dados estarão embaralhados/escondidos/indecifráveis.

Você pode fazer TLS com o HAProxy de 4 formas:

  • SSL/TLS Passthrough
  • SSL/TLS Offloading
  • SSL/TLS bridging or re-encryption
  • SSL/TLS encryption

Antes de abrir o seu HAProxy para a internet, certifique-se de que você está aceitando apenas versões seguras do protocolo TLS.

O link abaixo do Mozilla gera para você uma configuração do HAProxy mais segura possível, dentro dos limites desejados.

Um exemplo de configuração para o HAProxy versão 1.8 com OpenSSL versão 1.1.1d

global    # intermediate configuration    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 no-sslv3 no-tlsv10 no-tlsv11 no-tls-tickets    ssl-default-server-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-server-options no-sslv3 no-tlsv10 no-tlsv11 no-tls-tickets

Para usar TLS/SSL no HAProxy, precisamos informar à ele o arquivo com os certificados e chave X.509.

O HAProxy espera um arquivo único com os dados na seguinte ordem:

  • Certificado do servidor
  • Certificado do CA intermediário 1 (se houver)
  • Certificado do CA intermediário 2 (se houver)
  • ... (se houver)
  • Certificado do CA principal (se houver)
  • Chave do certificado do servidor

O arquivo vai tem mais ou menos essa cara:

-----BEGIN CERTIFICATE-----...-----END CERTIFICATE----------BEGIN CERTIFICATE-----...-----END CERTIFICATE----------BEGIN CERTIFICATE-----...-----END CERTIFICATE----------BEGIN RSA PRIVATE KEY-----...-----END RSA PRIVATE KEY-----

Mais informações sobre TLS com o HAProxy:

Tipos de TLS no HAProxy
https://www.haproxy.com/documentation/haproxy/deployment-guides/tls-infrastructure/

Tutorial básico de TLS no HAProxy
https://www.haproxy.com/blog/haproxy-ssl-termination/

Usando certificados SSL/TLS no HAProxy
https://serversforhackers.com/c/using-ssl-certificates-with-haproxy

Formato do arquivo .pem para o HAProxy
https://www.meshcloud.io/2017/04/18/pem-file-layout-for-haproxy/

Configurando HAProxy multi node

É possível fazer o HAProxy trabalhar em paralelo com outro HAProxy. Uma forma de fazer isso é usando o software para linux keepalived.

Referências HAProxy multi node

HAProxy com keepalived
https://www.howtoforge.com/setting-up-a-high-availability-load-balancer-with-haproxy-keepalived-on-debian-lenny-p2

HAProxy com keepalived
https://www.digitalocean.com/community/tutorials/how-to-set-up-highly-available-haproxy-servers-with-keepalived-and-floating-ips-on-ubuntu-14-04

Seção Frontend

WebSocket + HAProxy

Referências
https://blog.silverbucket.net/post/31927044856/3-ways-to-configure-haproxy-for-websockets

https://github.com/ant-media/Ant-Media-Server/wiki/Load-Balancer-with-HAProxy-SSL-Termination

https://www.haproxy.com/blog/websockets-load-balancing-with-haproxy/

Referências

A Base do HAProxy: Globals, Defaults, Backend, Frontend

Ótimo tutorial sobre configuração do HAProxy
https://www.haproxy.com/blog/the-four-essential-sections-of-an-haproxy-configuration/

ACLs no HAProxy

Introdução a ACLs
https://www.haproxy.com/blog/introduction-to-haproxy-acls/

Criando regras com base no domínio (lidando com vários domínios em um só servidor haproxy)
https://seanmcgary.com/posts/haproxy---route-by-domain-name/

TLS/SSL com HAProxy

Usando TLS/SSL - HAProxy Blog
https://www.haproxy.com/documentation/haproxy/deployment-guides/tls-infrastructure/
Usando TLS/SSL - ServersForHackers
https://serversforhackers.com/c/using-ssl-certificates-with-haproxy

HAProxy Docker
https://hub.docker.com/_/haproxy

Autenticação e Autorização no HAProxy com scripts Lua e JWT
https://www.haproxy.com/blog/using-haproxy-as-an-api-gateway-part-2-authentication/

Protegendo contra DDOS no HAProxy
https://www.haproxy.com/blog/application-layer-ddos-attack-protection-with-haproxy/

Cheatsheet HAProxy

Redirecionando HTTP para HTTPS

listen seu_servidor    bind *:80 ssl crt /seu/certificado/certificado.pem    bind *:443 ssl crt /seu/certificado/certificado.pem    mode http    # Essa é a linha que faz o redirecionamento    http-request redirect scheme https code 301 if !{ ssl_fc }    http-request set-header X-Forwarded-Protocol https    server seu-servidor-1 123.123.123.123:80

Documentação

Documentação de várias versões diferentes do HAProxy
http://cbonte.github.io/haproxy-dconv/

Fazendo load balancing com HAProxy
https://serversforhackers.com/c/load-balancing-with-haproxy
https://www.linode.com/docs/uptime/loadbalancing/how-to-use-haproxy-for-load-balancing/

You should also read:

CouchDB + HAProxy

Instalando o CouchDB pelo Docker sudo docker run -d --restart unless-stopped --hostname couchdb1 --name couchdb1 -p 5984:5984 couchdb Instalando o HAProxy via APT…