HAProxy 无法与 SNI 和 ACL 配合使用

HAProxy 无法与 SNI 和 ACL 配合使用

我正在尝试让 haproxy 使用带有 SNI 的 acl,但它不配合。它提供了正确的证书,因此 SNI 一定在工作。但是,我无法让它根据 SNI 中的主机名选择后端。

我检查配置后得到以下信息

[WARNING]  (21486) : Proxy 'fe-dr-totalflood.com': L6 sample fetches ignored on HTTP proxies (declared at ./haproxy.cfg.tmp:176).
[WARNING]  (21486) : Proxy 'fe-dr-totalflood.com': L6 sample fetches ignored on HTTP proxies (declared at ./haproxy.cfg.tmp:177).
Warnings were found.
Configuration file is valid

我不知道这些错误信息是什么意思,并且我在以下代码片段中相应的行旁边做了注释。

frontend  fe-dr-totalflood.com
  mode      http
  bind      172.22.8.229:80
  bind      172.22.8.229:443 ssl crt dr-www.totalflood.com.crt crt dr-xml.totalflood.com.crt

  ## http->https redirect
  http-request redirect scheme https unless { ssl_fc }

  ## access control lists
  acl https ssl_fc
  acl letsencrypt-acl path_beg /.well-known/acme-challenge/
  acl www-acl req_ssl_sni dr-www.totalflood.com
  acl xml-acl req_ssl_sni dr-xml.totalflood.com

  # if Let's Encrypt, skip remainder and jump to the backend
  use_backend be-letsencrypt if letsencrypt-acl

  use_backend be-dr-www.totalflood.com if www-acl <------ 176
  use_backend be-dr-xml.totalflood.com if xml-acl <------ 177

  default_backend be-no-such-site

#------------------------------------------------
backend   be-dr-www.totalflood.com
  mode      http
  balance   roundrobin
  cookie    SERVERID insert indirect nocache maxidle 30m

  ## set the host name in the header
  acl h_host_exists req.hdr(Host) -m found
  http-request del-header Host if h_host_exists
  http-request set-header Host www.totalflood.com

  default-server check maxconn 100

  server  scadmzp2wb01 scadmzp2wb01.lereta.net:80 cookie scadmzp2wb01

#------------------------------------------------
backend   be-dr-xml.totalflood.com
  mode      http
  balance   roundrobin
  cookie    SERVERID insert indirect nocache maxidle 30m

  ## set the host name in the header
  acl h_host_exists req.hdr(Host) -m found
  http-request del-header Host if h_host_exists
  http-request set-header Host xml.totalflood.com

  default-server check maxconn 100

  server  scadmzxml01 scadmzxml01.lereta.net:80 cookie scadmzxml01

#------------------------------------------------
backend be-letsencrypt
  server localhost 127.0.0.1:8888

#------------------------------------------------
backend be-no-such-site
  server localhost 127.0.0.1:8888

当我尝试访问任一网站时,无论如何我都会访问默认后端。我已通过更改默认后端以访问其他地方对此进行了测试。如果我将 /.well-known/acme-challenge 路径附加到任一 url,haproxy 似乎会将我发送到正确的位置。

我不明白为什么基于 SNI 信息的 acl 不起作用。

我正在使用 haproxy OracleLinux 8 2.4.2 版本。

$ haproxy -v
HAProxy version 2.4.2-553dee3 2021/07/07 - https://haproxy.org/
Status: long-term supported branch - will stop receiving fixes around Q2 2026.
Known bugs: http://www.haproxy.org/bugs/bugs-2.4.2.html
Running on: Linux 5.4.17-2136.304.4.1.el8uek.x86_64 #2 SMP Tue Feb 8 11:54:24 PST 2022 x86_64

答案1

引用文档:

从缓冲区内容中获取样本与上述样本获取略有不同,因为采样数据是短暂的。这些数据仅在可用时才可使用,在转发时会丢失。因此,请求期间从缓冲区内容中获取的样本不能用于响应。即使在获取数据时,它们也可能发生变化。

这就是您会收到有关忽略第 6 层 ACL 的警告的原因。

req_ssl_sni您最好不要使用,而应ssl_fc_sni在第 5 层使用,这样可以获取相同的信息,但更加可靠。

相关内容