O motivo pelo qual você não pode ficar no SSL Session ID, como você está usando mode http
(o padrão a menos que você especifique explicitamente mode tcp
) é que você está tentando fazê-lo em determinados bytes da carga do pacote. quando, na realidade, os pacotes já foram decodificados e essas compensações podem conter dados totalmente aleatórios.
Você tem duas opções aqui.
-
Stick com base no IP de origem
Se você não se opuser a permanecer no IP do cliente, em vez do ID da sessão SSL, como está fazendo agora, altere sua configuração para ficar assim:
frontend https-forward bind *:443 ssl crt /etc/haproxy/certs.d/combo.pem mode http option http-server-close option forwardfor reqadd X-Forwarded-Proto:\ https reqadd X-Forwarded-Port:\ 443 capture request header Referrer len 64 capture request header Content-Length len 10 capture request header User-Agent len 64 # set HTTP Strict Transport Security (HTST) header rspadd Strict-Transport-Security:\ max-age=15768000 # some ACLs and URL rewrites... default_backend backstuff backend backstuff mode http log 127.0.0.1 local2 notice balance roundrobin option ssl-hello-chk stick-table type ip size 30k expire 30m stick on src server PO1 10.35.59.160:443 ssl verify none maxconn 5000 server PO2 10.35.59.161:443 ssl verify none maxconn 5000
As principais alterações são as linhas
stick-table
estick on
, bem como o uso explícito demode http
.Como você disse, se muitos clientes acessando seu site estiverem por trás de um NAT, todos eles acabarão no mesmo servidor, por isso não é a melhor distribuição, mas funciona e fornece a funcionalidade que você deseja.
-
Use o ID de sessão SSL decodificado por HAProxy
Aqui você teria que aproveitar o conhecimento da conexão do HAproxy via
ssl_fc_session_id
( docs ).ssl_fc_session_id : binary
Returns the SSL ID of the front connection when the incoming connection was made over an SSL/TLS transport layer. It is useful to stick a given client to a server. It is important to note that some browsers refresh their session ID every few minutes.Nesse caso, você usaria a mesma configuração que eu forneci acima, mas com as linhas
stick-table
estick
alteradas para:stick-table type binary len 32 size 30k expire 30m stick on ssl_fc_session_id
Isso é mais parecido com o que você está tentando alcançar.