web-dev-qa-db-fra.com

Mise en œuvre TCP sessions collantes avec haproxy pour gérer le trafic transféré sur la passe SSL

Comment pouvons-nous mettre en œuvre la session collant à haproxy lorsque SSL doit se terminer sur les serveurs Backend? Nous avons besoin de la colline car les backends ne peuvent pas partager des sessions.

Ceci est ma configuration d'origine:

# 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

La configuration ci-dessous est ma tentative de lire le src:

Cela se traduit par une 502 erreur de passerelle Bad. Je suppose que c'est parce que le trafic est déjà déchiffré au moment où il atteint le backend.

# 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

Notez que j'ai branché le certificat à la liaison. Ceci est pour que Haproxy puisse lire le SRC et configurer la table Stick-Tableau. (Je ne sais pas si cela est correct.) Et à ce stade, le trafic est déjà déchiffré.

Je pense que le problème réside lorsque ce trafic déchiffré est transmis aux serveurs de backend qui attend le trafic crypté ...

J'ai vu ces suggestions:

  1. Terminez SSL à Haproxy 1.5 - Pas possible dans mon cas. SSL doit être géré par les serveurs de backend.
  2. tilisez SSL Session ID pour maintenir la collaboration. - Je suis sceptique à essayer ceci parce que je ne comprends pas bien cela encore. Et il semble utiliser une version modifiée (?) De haproxy.
  3. Utilisez send-proxy directive & X-Forward-Proto en-tête . - mais réalisé cela nécessite également un backend http uniquement.

Apprécierait tout conseil.

3

La solution la plus facile est d'utiliser balance source, mais si de nombreux clients proviennent de la même adresse IP, il peut ne pas être très juste sur vos serveurs de backend.

Voir http://blog.haproxy.com/2013/04/22/client-ip-persistence-or-source-ip-hashloadbanancing/ Pour plus de discussion sur les méthodes pour accomplir cette .

2
Jim G.

Si la racine de votre problème est le fait que les serveurs de backend s'attendent à ce que le trafic soit https plutôt que http, essayez cryptage le HTTP et faire votre équilibrage de la charge régulière7.

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

Plus facilement - comme vous essayez apparemment de coller par src de toute façon, pourquoi vous déchiffrez même le TCP trafic en premier lieu?

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

In TCP =, vous vous souciez de la charge utile. Plus précisément, vous ne vous souciez pas de savoir si c'est crypté et comment.

0
Felix Frank