Joh*_*ohn 5 ssl openssl haproxy sni
我想使用 HAProxy 终止 TLS 加密的 TCP 连接,并根据用于启动 TLS 连接的服务器名称指示将未加密的 TCP 流量传递到各个后端。
我在后端服务器上运行 3 个服务,每个服务都在不同的端口(5001、5002、5003)上。HAProxy 绑定到端口 5000。我想按名称将连接路由到前 2 个服务,如果不匹配,则路由到第三个服务。我正在使用 启动与 HAProxy 的连接openssl s_client
。但是,在日志中我可以看到连接仅路由到默认服务器,即 SNI 似乎被忽略。
域名系统:
A record demo.sni.example.com 1.2.3.4
CNAME 1.sni.example.com pointing to demo.sni.example.com
CNAME 2.sni.example.com pointing to demo.sni.example.com
Run Code Online (Sandbox Code Playgroud)
即我希望发生以下路由:
SNI = 1.sni.example.com:5000 -> 1.2.3.4:5001
SNI = 2.sni.example.com:5000 -> 1.2.3.4:5002
anything else on port 5000 -> 1.2.3.4:5003
Run Code Online (Sandbox Code Playgroud)
haproxy.cfg:
global
log stdout format raw local0 info
defaults
timeout client 30s
timeout server 30s
timeout connect 5s
option tcplog
frontend tcp-proxy
bind :5000 ssl crt combined-cert-key.pem
mode tcp
log global
tcp-request inspect-delay 5s
tcp-request content accept if { req_ssl_hello_type 1 }
use_backend bk_sni_1 if { req.ssl_sni -i 1.sni.example.com }
use_backend bk_sni_2 if { req.ssl_sni -i 2.sni.example.com }
default_backend bk_default
backend bk_sni_1
mode tcp
log global
balance roundrobin
server server1 1.2.3.4:5001 check
backend bk_sni_2
mode tcp
log global
balance roundrobin
server server1 1.2.3.4:5002 check
backend bk_default
mode tcp
log global
balance roundrobin
server server1 1.2.3.4:5003 check
Run Code Online (Sandbox Code Playgroud)
combined-cert-key.pem
是一个自签名证书文件加密钥,其中 CN 是服务器的 IP ( 1.2.3.4
),并且有所有 DNS 值和 IP 的 SAN。
使用以下命令启动连接openssl s_client
:
我尝试通过 DNS(A 和 CNAME 记录以及 IP)进行连接:
echo test | openssl s_client -connect demo.sni.example.com:5000 -servername 1.sni.example.com
echo test | openssl s_client -connect 1.sni.example.com:5000 -servername 1.sni.example.com
echo test | openssl s_client -connect 1.2.3.4:5000 -servername 1.sni.example.com
Run Code Online (Sandbox Code Playgroud)
但是,所有连接都会路由到默认后端bk_default
。
是什么导致 HAProxy 无法识别 SNI 服务器名?(我正在使用最新的 HAProxy docker 映像: https: //hub.docker.com/_/haproxy)
归档时间: |
|
查看次数: |
15851 次 |
最近记录: |