基于 SNI 的 TLS Passthrough 反向代理如何工作?

基于 SNI 的 TLS Passthrough 反向代理如何工作?

有各种文章和问题解释如何使用给定的反向代理(例如 nginx)实现这一点[1] [2] [3] [4]但没有人能解释其内部具体是如何运作的。

我所说的“基于 SNI 的 TLS 直通”是指代理不在代理处执行 TLS 终止,而是根据 TLS clientHello 数据包中的 SNI 将未加密的 TLS 数据包直接转发到上游服务器。

有人可以详细解释一下这是如何工作的吗?

  • 例如,我假设客户端和代理之间首先进行 TCP 握手,从 TLS clientHello 开始,选择正确的上游服务器,因此代理充当 L4 反向代理;但是代理在转发 clientHello 之前是否会在自身和服务器之间建立单独的 TCP 握手?之后会发生什么?
  • 另外,当多个域共享同一个 IP 时会发生什么情况,鉴于 SNI 仅出现在 clientHello 中,代理如何区分到每个域的流?

答案1

SNI 是服务器名称指示的缩写。它将您请求的主机名放在未加密的 TLS 客户端 Hello 握手中。

拥有一个执行 TLS 直通的代理服务器与在 Apache 中拥有 20 个域(每个域都有自己的 SSL 证书)没有太大区别。代理有一个主机名列表及其相应的后端服务器。它从 SNI 信息中读取主机名,然后将所有内容转发到适当的服务器。

对于代理服务器来说,跟踪每个流并没有什么特别之处——这就是代理服务器所做的。它会跟踪每个传入连接及其与后端服务器的对应连接。一旦建立了该连接,它就不需要知道使用了什么主机名,它只需在同一路径上不断来回转发信息即可。

相关内容