用HAProxy  处理SSL证书流量主要有两种模式:SSL卸载(Offloading,也常被称为SSL终止)和  SSL  透传(Passthrough)。简单来说,前者是HAProxy帮你搞定加解密,让后端服务器“轻装上阵”;后者是HAProxy只负责“传话”,把加密流量原封不动地交给后端服务器处理。

下面是它们核心区别的对比:

特性      SSL  卸载  (SSL  Offloading)      SSL  透传  (SSL  Passthrough)  

处理层级          七层  (HTTP)      四层  (TCP)  

SSL  证书位置        统一在  HAProxy  上      在各个后端服务器上  

HAProxy  处理        解密流量,再以明文或新加密连接转发      不解密,只做  TCP  流量转发  

后端连接        HTTP  或  HTTPS      保持原有的  HTTPS  连接  

内容感知能力          强(可基于  URL、Header  等路由)      弱(仅能基于  IP、端口或  SNI  路由)  

主要优势          集中管理证书,减轻后端压力      安全性高,端到端加密,配置简单  

主要劣势          HAProxy  与后端间为内网明文流量,存在风险      HAProxy  无法查看或修改请求内容  

一、卸载  (SSL  Offloading)  配置技巧

SSL卸载将SSL/TLS加解密的繁重工作从后端服务器“卸载”到高性能的HAProxy上,能显著提升后端服务的处理能力。

1.  基础配置:快速实现SSL卸载

这个配置将监听443端口的HTTPS流量,解密后转发给后端的HTTP服务。

haproxy

#  /etc/haproxy/haproxy.cfg

global

        #  全局设置

        daemon

        maxconn  10000

defaults

        mode  http                                          #  工作在七层  HTTP  模式

        timeout  connect  5s

        timeout  client  50s

        timeout  server  50s

#  HTTP  流量重定向到  HTTPS(最佳实践)

frontend  http_redirect

        bind  *:80

        redirect  scheme  https  code  301

#  HTTPS  前端

frontend  https_front

        bind  *:443  ssl  crt  /etc/haproxy/certs/example.com.pem

        mode  http

        #  向后台传递客户端真实  IP  和协议信息

        option  forwardfor

        http-request  add-header  X-Forwarded-Proto  https

        default_backend  web_servers

#  后端服务器池

backend  web_servers

        balance  roundrobin

        #  健康检查

        option  httpchk  GET  /health

        server  web1  192.168.1.10:80  check

        server  web2  192.168.1.11:80  check

  `bind  *:443  ssl  crt  <证书文件路径>`:绑定443端口,启用SSL,并指定证书文件。

  `option  forwardfor`  和  `add-header  X-Forwarded-Proto  https`:关键技巧,确保后端服务器能获取客户端真实IP和原始协议,方便应用处理。

-  `redirect  scheme  https  code  301`:强制将HTTP请求301重定向到HTTPS,是全站加密的最佳实践。

2.  进阶技巧:SSL卸载到后端HTTPS(SSL  Bridging)

如果出于安全合规要求,HAProxy与后端服务器之间也必须加密,可以配置SSL  Bridging。这会启用两次SSL/TLS握手,带来更高的安全性,但也会消耗更多HAProxy的CPU资源。

haproxy

#  在前端与后端间保持全程加密

backend  web_servers_ssl

        balance  roundrobin

        option  httpchk  GET  /health

        #  关键:  server  行使用  ssl  参数和后端HTTPS端口,verify  none  为跳过证书验证(生产环境应配置  ca-file  进行验证)

        server  web1  192.168.1.10:443  ssl  verify  none  check

        server  web2  192.168.1.11:443  ssl  verify  none  check

3.  最佳实践:安全与性能

  合并证书:将证书(`.crt`)和私钥(`.key`)合并成一个  `.pem`  文件供HAProxy加载。

  强化TLS安全:建议显式禁用老旧、不安全的协议和加密套件。

    haproxy

    global

            #  仅允许  TLSv1.2  及以上

            ssl-default-bind-options  ssl-min-ver  TLSv1.2  no-tls-tickets

使用强加密套件:配置安全的密码套件列表,可根据自身合规要求选择。

自动证书管理:面对证书有效期不断缩短的趋势(已减至47天),强烈建议集成ACME协议(如Let's  Encrypt)实现证书的自动申请和续期,以避免服务中断。

优化SSL性能:开启HAProxy的SSL硬件加速(如AES-NI)及会话复用(Session  Resumption)等功能,可有效提升处理能力。

二、SSL  透传  (SSL  Passthrough)  配置技巧

SSL透传模式让HAProxy在四层(TCP)转发SSL流量,不解密,保证加密数据端到端直达后端服务器。后端服务器独立完成SSL握手,非常适合安全性要求极高的场景。

1.  基础配置:TCP模式透传

这是最简单的SSL透传配置,HAProxy根据端口将流量转发。

haproxy

#  /etc/haproxy/haproxy.cfg

defaults

        mode  tcp                                          #  工作模式切换为四层  TCP

        timeout  connect  5s

        timeout  client  50s

        timeout  server  50s

frontend  mysql_front

        bind  *:3306                                    #  监听  MySQL  端口

        default_backend  mysql_servers

backend  mysql_servers

        balance  roundrobin

        server  db1  192.168.1.101:3306  check

        server  db2  192.168.1.102:3306  check

frontend  https_passthrough

        bind  *:443

        mode  tcp

        default_backend  ssl_servers

backend  ssl_servers

        balance  roundrobin

        server  web1  192.168.1.10:443  check

        server  web2  192.168.1.11:443  check

  `mode  tcp`:关键设置,将模式切换为四层TCP代理。

  检查:在TCP模式下,健康检查(`check`)默认只检查端口是否存活,更为高效。

2.  高级技巧:基于SNI的路由

一个IP和端口(如443)背后有多个HTTPS服务时,SNI(Server  Name  Indication)成为区分流量的关键。HAProxy可以“窥探”TLS握手中的SNI信息,实现智能路由,无需解密。

haproxy

frontend  https_sni_routing

        bind  :443

        mode  tcp

        #  关键:  配置检查延迟,等待足够数据以分析SNI

        tcp-request  inspect-delay  5s

        #  接受包含SSL  hello的数据包

        tcp-request  content  accept  if  {  req_ssl_hello_type  1  }

        #  根据SNI域名进行路由

        use_backend  bk_api  if  {  req_ssl_sni  -i  api.example.com  }

        use_backend  bk_admin  if  {  req_ssl_sni  -i  admin.example.com  }

        default_backend  ssl_default

backend  bk_api

        mode  tcp

        server  api1  10.0.0.10:443  check

        server  api2  10.0.0.11:443  check

backend  bk_admin

        mode  tcp

        server  admin1  10.0.0.20:443  check

  `req_ssl_sni  -i  <domain>`:这是实现SNI路由的核心ACL,用于检查TLS请求中的服务器名称。

3.  最佳实践:保留客户端真实IP

在透传模式下,后端服务器看到的来源IP将是HAProxy的内网IP。如果需要获取客户端真实IP,需要使用  Proxy  Protocol**。

haproxy

#  HAProxy  前端配置

frontend  https_passthrough

        bind  :443

        mode  tcp

        default_backend  ssl_servers

#  HAProxy  后端配置,启用  send-proxy-v2

backend  ssl_servers

        mode  tcp

        server  web1  192.168.1.10:443  send-proxy-v2  check

        server  web2  192.168.1.11:443  send-proxy-v2  check

同时,需要在后端的Nginx/Apache中配置启用Proxy  Protocol,才能正确解析客户端真实IP。

三、选型建议:何时用卸载,何时用透传?

选择  SSL  卸载,如果:

      你需要根据HTTP层面的信息(如URL路径、Cookie)进行智能路由。

      希望简化后端服务器的配置,统一管理SSL证书,降低运维成本。

      后端服务器性能有限,希望将加解密计算压力从它们身上移除。

选择  SSL  透传,如果:

      后端服务有严格的合规性或安全要求,必须实现端到端的加密,不希望任何中间节点解密数据。

      后端服务需要基于客户端证书进行mTLS(双向TLS)认证,HAProxy不解密就无法处理这一过程。

      追求极致的转发性能,且不需要HAProxy处理HTTP层面的内容。

四、总结

方面      SSL  卸载  (Offloading)      SSL  透传  (Passthrough)  

模式        HTTP  (`mode  http`)      TCP  (`mode  tcp`)  

核心价值    高性能  +  智能路由      高安全  +  极致性能  

证书位置        HAProxy    各后端服务器  

HAProxy配置          相对复杂,需加载证书      非常简单,只需绑定端口  

后端配置    简单(多数接收HTTP)    需配置独立证书和Proxy  Protocol  

IP透传方法          通过  `X-Forwarded-For`  Header    必须使用Proxy  Protocol  

适用场景        Web网站、API网关、微服务      数据库、高安全要求的HTTPS服务、mTLS  

简单来说,处理普通的Web流量和API时,SSL证书卸载是功能与性能兼顾的主流选择;而在面对需要最高等级安全和合规的场景,或是处理非HTTP协议时,SSL透传则是更合适的方案。