Answers:
Haproxy可以做到这一点。您可以设置TCP代理并提取SNI并根据SNI进行路由。这是一个例子:
backend be.app1
mode tcp
no option checkcache
no option httpclose
tcp-request inspect-delay 5s
tcp-request content accept if { req.ssl_hello_type 1 }
tcp-request content reject
use-server server1 if { req.ssl_sni -m beg app1. }
server server1 server1:8443 check id 1 weight 0
延迟请求直到您获得SSL问候是必不可少的,否则haproxy会在接收SNI头之前尝试建立连接。
我使用权重为0的服务器,因为在我当前的配置中,每个SNI仅运行一台服务器,并且我不希望它们接收随机请求。您可能会找到更好的方法来玩这个游戏。
我希望这有帮助。
您可以使用sniproxy:https : //github.com/dlundquist/sniproxy
配置示例:
listener 0.0.0.0:443 {
protocol tls
table TableHTTPS
fallback 127.0.0.1:8443
}
listener 0.0.0.0:80 {
protocol http
table TableHTTP
fallback 127.0.0.1:8080
}
table TableHTTPS {
domain1.com backend1:443
domain2.org backend2:443
}
table TableHTTP {
domain1.com backend1:80
domain2.org backend2:80
}
即使在2019年即将推出TLS 1.3的情况下,这肯定也是有可能的!许多Web服务器或专门的反向代理都提供了开箱即用的功能:
这是Nginx的示例配置,对于需要反向代理的设置,这是一个非常受欢迎的选择:
stream {
map $ssl_preread_server_name $selected_upstream {
example.org upstream_1;
example.net upstream_2;
example.com upstream_3;
default upstream_4;
}
upstream upstream_1 { server 10.0.0.1:443; }
upstream upstream_2 { server 10.0.0.2:443; }
upstream upstream_3 { server 10.0.0.3:443; }
upstream upstream_4 { server 10.0.0.4:443; }
server {
listen 10.0.0.5:443;
proxy_pass $selected_upstream;
ssl_preread on;
}
}
相关的Nginx模块是stream_core
和stream_ssl_preread
。手册: