通用的基于 SNI 的透明 TLS 代理,无需枚举所有后端?

通用的基于 SNI 的透明 TLS 代理,无需枚举所有后端?

我所处的情况是,我必须在一组数千个后端 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

相关内容