使用 HAProxy 实施 TCP 粘性会话来处理 SSL 直通流量

Ian*_*kem 5 ssl tcp haproxy sticky-sessions

当 SSL 必须在后端服务器上终止时,我们如何在 HAProxy 中实现会话粘性?我们需要粘性,因为后端无法共享会话。

这是我原来的配置:

# 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
Run Code Online (Sandbox Code Playgroud)

下面的配置是我尝试阅读的src

这会导致 502 Bad Gateway 错误。我认为,这是因为流量在到达后端时已经被解密。

# 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
Run Code Online (Sandbox Code Playgroud)

请注意,我已将证书插入到绑定中。这是为了让 HAProxy 能够读取 src 并设置 Stick-table。(不确定这是否正确。)此时,流量已经解密。

我认为问题在于当解密的流量传递到需要加密流量的后端服务器时......

我看过这些建议:

  1. 在 HAProxy 1.5 处终止 SSL - 在我的情况下不可能。SSL 需要由后端服务器处理。
  2. 使用 SSL 会话 ID 来保持粘性。- 我对尝试这个持怀疑态度,因为我还不太明白。它似乎使用的是 haproxy 的修改版(?)。
  3. 使用send-proxy指令和X-Forward-Proto标头。- 但意识到这也需要一个纯 HTTP 后端。

将不胜感激任何建议。

Jim*_* G. 3

最简单的解决方案是使用balance source,但如果许多客户端来自同一个 IP,这对您的后端服务器可能不太公平。

有关实现此目的的方法的更多讨论,请参阅http://blog.haproxy.com/2013/04/22/client-ip-persistence-or-source-ip-hash-load-balancing/ 。