我需要使用一个外部 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_core
和stream_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 服务器。
如需参考,请参阅