Implementando TCP Sticky Sessions com o HAProxy para lidar com o tráfego de passagem SSL

2

Como podemos implementar a viscosidade da sessão no HAProxy quando o SSL deve terminar nos servidores de back-end? Precisamos da rigidez porque os back-ends não podem compartilhar sessões.

Esta é a minha configuração original:

# SSL passthrough
listen https_handler
    bind 1.2.3.4:443
    mode tcp
    balance leastconn
    stick match src
    stick-table type ip size 200k expire 30m
    server s1 1.1.1.1:443
    server s2 1.1.1.2:443

# haproxy logs (not sticking)
10.x.x.2:xxxxx [17/Dec/2014:19:29:41.396] fe BACKEND_Website/s1 37/0/1/3/41 200 8364
10.x.x.2:xxxxx [17/Dec/2014:19:29:41.456] fe BACKEND_Website/s1 36/0/1/1/39 200 9082
10.x.x.2:xxxxx [17/Dec/2014:19:29:41.456] fe BACKEND_Website/s2 35/0/1/3/39 200 2529
10.x.x.2:xxxxx [17/Dec/2014:19:29:41.545] fe BACKEND_Website/s1 35/0/0/3/38 200 1460
10.x.x.2:xxxxx [17/Dec/2014:19:29:41.501] fe BACKEND_Website/s2 36/0/1/1/109 200 376
10.x.x.2:xxxxx [17/Dec/2014:19:29:41.545] fe BACKEND_Website/s1 36/0/1/1/74 200 2298
10.x.x.2:xxxxx [17/Dec/2014:19:29:41.604] fe BACKEND_Website/s1 35/0/1/2/38 200 5542

A configuração abaixo é minha tentativa de ler o src :

Isso resulta em um erro 502 Bad Gateway. Presumo que seja porque o tráfego já está descriptografado quando chega ao back-end.

# terminate SSL at HAProxy 
listen https_handler
    bind 1.2.3.4:443 ssl crt /etc/ssl/certs/certs.pem
    mode tcp
    balance leastconn
    stick match src
    stick-table type ip size 200k expire 30m
    server s1 1.1.1.1:443
    server s2 1.1.1.2:443

Observe que eu liguei o certificado à ligação. Isto é para o HAProxy poder ler o src e configurar o stick-table. (Não tenho certeza se isso está correto.) E, neste momento, o tráfego já está descriptografado.

Acho que o problema está quando esse tráfego descriptografado é passado para os servidores de back-end que esperam tráfego criptografado ...

Eu vi estas sugestões:

  1. Encerra o SSL no HAProxy 1.5 - não é possível no meu caso. O SSL precisa ser tratado pelos servidores de backend.
  2. Use SSL Session ID para manter a viscosidade. - estou cético em tentar fazer isso porque ainda não entendi direito. E parece estar usando uma versão modificada (?) Do haproxy.
  3. Use send-proxy directive & X-Forward-Proto header . - mas percebi que isso também precisa de um backend somente HTTP.

Agradecemos qualquer conselho.

    
por Ianthe the Duke of Nukem 16.12.2014 / 12:28

2 respostas

3

A solução mais fácil é usar balance source , mas se muitos clientes vierem do mesmo IP, talvez não seja muito justo em seus servidores de back-end.

Veja link para mais discussão sobre métodos para realizar isso.

    
por 17.12.2014 / 18:46
0

Se a raiz do seu problema for o fato de os servidores de back-end esperarem que o tráfego seja HTTPS em vez de HTTP, tente criptografando o HTTP e fazendo seu balanceamento de carga Layer7 regular.

listen https_handler
    bind 1.2.3.4:443 ssl crt /etc/ssl/certs/certs.pem
    mode http
    balance leastconn
    # any stick rules you need
    server s1 1.1.1.1:443 ssl
    server s2 1.1.1.2:443 ssl

Mais fácil ainda - como você aparentemente tenta ficar com src de qualquer maneira, por que você está descriptografando o tráfego TCP em primeiro lugar?

listen https
    bind 1.2.3.4:443 # <- NO ssl setting
    mode tcp
    balance leastconn
    stick match src
    stick-table type ip size 200k expire 30m
    server s1 1.1.1.1:443 ssl
    server s2 1.1.1.2:443 ssl

No modo TCP, você não se importa com a carga útil. Especificamente, você não se importa se é criptografado e como.

    
por 19.12.2014 / 10:15