我有一个使用 SNI 且不终止的 HAProxy 路由 HTTPS。
配置类似如下:
frontend ft_ssl_vip
bind 0.0.0.0:5000
mode tcp
option tcplog
tcp-request inspect-delay 5s
tcp-request content accept if { req.ssl_hello_type 1 }
default_backend bk_ssl_default
# Using SNI to take routing decision
backend bk_ssl_default
mode tcp
acl application_1 req.ssl_sni -i foo.example.com
acl application_2 req.ssl_sni -i bar.example.com
use-server server1 if application_1
use-server server2 if application_2
use-server server3 if !application_1 !application_2
option ssl-hello-chk
server server1 127.0.0.1:777
server server2 127.0.0.1:778
server server3 127.0.0.1:779
我还需要通过同一端口 (5000) 路由 HTTP 流量。
如何修改我的配置以通过 SNI 同时适应 HTTP 和 HTTPS,而无需通过同一端口终止?
编辑
我已经更接近了。HTTPS 路由似乎正在运行,但由于某种原因,HTTP 后端 acl 与域不匹配。
我现在的位置是:
frontend app
bind 0.0.0.0:5000
mode tcp
option tcplog
tcp-request inspect-delay 5s
tcp-request content accept if HTTP
tcp-request content accept if { req.ssl_hello_type 1 }
use_backend testing_http if HTTP
default_backend testing_https
backend testing_https
mode tcp
acl app_2 req.ssl_sni -i foo.bar.com
use-server server2 if app_2
use-server default if !app_2
server server2 127.0.0.1:777
server default 127.0.0.1:443
backend testing_http
mode http
acl app_2 hdr(host) -i foo.bar.com
use-server server2 if app_2
use-server default if !app_2
server server2 127.0.0.1:777
server default 127.0.0.1:80
答案1
我发布自己问题的答案是因为我已经拼凑了一些内容,但这个问题似乎没有任何意义。如果它出现在谷歌搜索中,这应该会对某人有所帮助。
到目前为止,以下内容对我有用:
frontend app
bind 0.0.0.0:5000
mode tcp
option tcplog
tcp-request inspect-delay 5s
tcp-request content accept if HTTP
tcp-request content accept if { req.ssl_hello_type 1 }
use_backend testing_http if HTTP
default_backend testing_https
backend testing_https
mode tcp
acl app_2 req.ssl_sni -i foo.bar.com
use-server server2 if app_2
use-server default if !app_2
server server2 127.0.0.1:777
server default serverfault.com:443
backend testing_http
mode http
acl app_2 hdr_dom(host) -i foo.bar.com
use-server server2 if app_2
use-server default if !app_2
server server2 127.0.0.1:777
server default www.example.com:80
需要理解的重要部分是——前端检查请求是否为 HTTP。如果不是,它会检查它是否是 SNI 请求。否则,它不会接受。
另一个让我困惑的部分是 http 后端的主机匹配。使用 hdr_dom 而不是 hdr 进行域匹配非常重要,这样字符串中手动指定的端口就不会破坏 acl。
最困难的部分是前端的 tcp 模式对 http 的日志记录毫无帮助。而且由于 http 后端无法记录,因此您无法获得任何 http 信息。