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_servidorbind *: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/