SSL 终止和转发时,HAProxy SSL 循环不起作用

SSL 终止和转发时,HAProxy SSL 循环不起作用

我使用以下配置来终止 SSL,以便我可以检查请求、执行 URL 重写、ACL 等,然后将 SSL 流量转发回我的后端服务器。但是,我无法让 Sticky 工作。当我仅使用“模式 tcp”并进行直接 tcp 路由时,我可以让 Sticky 工作,但是一旦我开始在前端终止 SSL,Sticky 就会停止工作。

这是我的配置:

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

答案1

您不能像使用时那样坚持使用 SSL 会话 ID mode http(除非您明确指定,否则使用默认值mode tcp)的原因是您试图在数据包有效负载的某些字节上执行此操作,而实际上数据包已经被解码并且这些偏移量可能包含完全随机的数据。

这里您有两个选择。

  1. 根据源IP进行粘贴

    如果您不反对坚持使用客户端的 IP,而不是像现在这样使用 SSL 会话 ID,那么您可以将配置更改为如下所示:

    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
    

    关键的变化是stick-tablestick on行,以及的明确使用mode http

    正如您所说的,如果访问您网站的许多客户端都在 NAT 后面,那么它们最终都会位于同一台服务器上,因此这不是最顺畅的分布,但它确实有效并提供您想要的功能。

  2. 使用 HAProxy 解码的 SSL 会话 ID

    在这里你必须利用 HAproxy 的连接知识ssl_fc_session_id文档)。

    ssl_fc_session_id: 二进制
    当传入连接通过 SSL/TLS 传输层建立时,返回前端连接的 SSL ID。将给定客户端粘贴到服务器很有用。需要注意的是,某些浏览器每隔几分钟就会刷新其会话 ID。

    在这种情况下,您将使用与我上面提供的相同的配置,但将 stick-tablestick行更改为:

      stick-table type binary len 32 size 30k expire 30m
      stick on ssl_fc_session_id
    

    这实际上与您想要实现的目标最为类似。

相关内容