在 haproxy 设置中,有一个绑定在 443 上的前端。
问题是在这个前端内部,我需要使用 acl 规则来根据 server_name 区分流量。
但是,如果我理解正确的话,我不能将 acl 与 443 一起使用。
是否有任何方法可以根据主机名将 SSL 流量发送到不同的后端?
谢谢!
答案1
要将 haproxy 与 ssl (443) 一起使用,您需要使用 stunnel,因为 haproxy 本身不支持 ssl。
答案2
在开发分支中,我们支持 SNI(服务器名称指示),如果客户端也使用扩展(所有最近的客户端都使用),则它允许 TCP 模式 haproxy 知道 SSL 客户端所针对的服务器。否则,如 B14D3 所示,您必须解密流量,因为 SSL 的目的是防止任何人看到其中交换的内容。
答案3
到目前为止,SNI 已在 haproxy 中正确实现。您可以使用use-server
区分不同的主机名:
引自文档:
“use-server”语句在 HTTP 和 TCP 模式下均有效。这使得它适合用于基于内容的检查。例如,可以根据 TLS SNI 字段在服务器场中选择服务器。如果这些服务器的权重设置为零,则它们将不会用于其他流量。
文档中的示例:
# intercept incoming TLS requests based on the SNI field
use-server www if { req_ssl_sni -i www.example.com }
server www 192.168.0.1:443 weight 0
use-server mail if { req_ssl_sni -i mail.example.com }
server mail 192.168.0.1:587 weight 0
use-server imap if { req_ssl_sni -i imap.example.com }
server imap 192.168.0.1:993 weight 0
# all the rest is forwarded to this server
server default 192.168.0.2:443 check