O roundrobin SSL HAProxy não funciona quando o SSL é finalizado e encaminhado

1

Estou usando a configuração a seguir para encerrar o SSL para que eu possa inspecionar a solicitação, reconfigurar a URL, ACL etc e encaminhar o tráfego SSL de volta aos meus servidores de back-end. No entanto, não consigo me manter pegajosa no trabalho. Eu posso ficar grudado no trabalho quando uso apenas o "modo tcp" e faço o encaminhamento direto do tcp, mas as paradas ficam difíceis de funcionar assim que eu começo a encerrar o SSL no front-end.

Aqui está minha configuração:

frontend https-forward
  bind *:443 ssl crt /etc/haproxy/certs.d/combo.pem

  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

  log 127.0.0.1 local2 notice

  balance roundrobin
  option ssl-hello-chk
  stick-table type binary len 32 size 30k expire 30m

  acl clienthello req_ssl_hello_type 1
  acl serverhello rep_ssl_hello_type 2

  tcp-request inspect-delay 5s
  tcp-request content accept if clienthello
  tcp-response content accept if serverhello

  stick on payload_lv(43,1) if clienthello
  stick store-response payload_lv(43,1) if serverhello

  server PO1 10.35.59.160:443 ssl verify none maxconn 5000
  server PO2 10.35.59.161:443 ssl verify none maxconn 5000
    
por oazabir 23.11.2015 / 18:20

1 resposta

3

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.

  1. 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 e stick on , bem como o uso explícito de mode 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.

  2. 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 e stick 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.

por 24.11.2015 / 14:25

Tags