反向代理可以使用带有 SSL 直通的 SNI 吗?

反向代理可以使用带有 SSL 直通的 SNI 吗?

我需要使用一个外部 IP 地址通过 https 为多个应用程序提供服务。

不应在反向代理上管理 SSL 证书。它们安装在应用程序服务器上。

是否可以配置反向代理以使用 SNI 并传递 ssl 以在端点终止?

可以使用 Nginx 或 Apache 之类的东西来实现吗?配置是什么样的?

答案1

使用 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 hello 至关重要,否则 haproxy 将在收到 SNI 标头之前尝试建立连接。

我使用权重为 0 的服务器,因为在当前配置中,每个 SNI 只运行一个服务器,并且我不希望它们接收随机请求。您可能可以找到更好的方法来解决这个问题。

我希望这有帮助。

答案2

您可以使用 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
}

答案3

这当然是可能的,即使到了 2021 年,TLS 1.3 也越来越普及!许多 Web 服务器或专用反向代理都提供了开箱即用的功能:

  • Nginx ≥ 1.11.5(Debian ≥ buster 或 stretch-backports)
  • HAProxy ≥ 1.5(Debian ≥ jessie)
  • Sniproxy(Debian≥buster)
  • ETC。

这是 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_corestream_ssl_preread。手册:

答案4

请注意,如果目标服务器使用相同的证书(使用通配符证书时这种情况不太可能发生),则无法使用 HTTP/2。它会将您的流量路由到错误的服务器。

样本:

  • a.example.com 带有证书 *.example.com
  • b.example.com 带有证书 *.example.com

如果 a.example.com 和 b.example.com 由同一个反向代理处理,则将打开一个连接 - 并流式传输到首次调用的服务器。因此,如果您调用 a.example.com,将来对 b.example.com 的请求可能会到达错误的 Web 服务器。

如需参考,请参阅

相关内容