我所处的情况是,我必须在一组数千个后端 https 网络服务器前提供透明的反向代理,并且列表会(相对)频繁地更改。
我知道我可以haproxy
根据客户端随 Client Hello 发送的 SNI 字符串来选择要连接的后端(例如反向代理可以使用带有 SSL 直通的 SNI 吗?),但似乎我需要枚举所有后端并在配置中单独引用它们;即“如果 SNI 是某某,则与后端对话”。
我只想从客户端 Hello 中获取 SNI 字符串,在 DNS 中查找它,连接到 DNS 提供的 IP(在 tcp 端口 443 上),将客户端 Hello 中继到服务器,然后继续在客户端和服务器之间中继。
我不想检查流量,也不想在客户端上安装新的证书。
haproxy 能做到这一点吗?如果不行,还有什么程序可以?
答案1
我最终使用nginx
了流SSL预读模块。
配置非常简单:
stream {
server {
resolver 127.0.0.1;
listen 443;
ssl_preread on;
proxy_pass $ssl_preread_server_name:443;
}
}
甚至不需要任何http { }
块,但如果我省略它,就会出现段错误,因此配置中nginx
有一个空块。只加载了流模块。nginx需要能够在 DNS 中查找后端名称;我在 127.0.0.1 上有一个缓存递归解析器。http { }
resolver
我让所有需要连接到任何后端的客户端都连接到我的 nginx(使用水平分割 DNS 和 DNAT 的组合),然后 nginx 代表它们连接到实际的后端。这对客户端来说是完全透明的。
答案2
您可以使用 http-request set-var 将 HAProxy 中的变量设置为 SNI 值,并使用 var 引用它。
https://www.haproxy.com/documentation/hapee/1-9r1/onepage/#7.3.2-var