我正在尝试让 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 层使用,这样可以获取相同的信息,但更加可靠。