我们有一个场景,我有两个在虚拟机中运行的应用程序.它们都将在端口80/443上提供流量,但使用不同的主机名.其中一个容器是供应商提供的,它们将解密容器内的HTTPS流量.
我是否可以配置Nginx(或其他工具)根据目标主机名(可能通过SNI)将流量路由到某个VM,而无需解密代理中的数据包?
例如:
myapp1.example.com:443 – > Nginx – > 10.0.0.1:8443(在VM上终止HTTPS)
vendor1.example.com:443 – > Nginx – > 10.0.0.1:9443(在VM上终止HTTPS)
最佳答案
这可以通过使用Nginx ngx_stream_ssl_preread_module来实现.这是一个示例配置:
原文链接:https://www.f2er.com/nginx/435284.htmluser Nginx;
worker_processes auto;
error_log /var/log/Nginx/error.log warn;
pid /var/run/Nginx.pid;
events {
worker_connections 1024;
}
stream {
upstream server1 {
server 192.0.2.125:443;
}
upstream server2 {
server 192.0.2.126:443;
}
map $ssl_preread_server_name $upstream {
hostnames;
.server1.example.com server1;
.server2.example.com server2;
}
server {
listen 443;
listen [::]:443;
ssl_preread on;
proxy_pass $upstream;
}
}
upstream指令用于定义要向其发送流量的服务器.然后映射$ssl_preread_server_name允许Nginx从客户端读取请求的SNI值,以正确地将流量定向到右上游框.
如果客户端发送有效的SNI值,这只会起作用.这也允许使用客户端证书进行身份验证,因为在NTERx将流量发送到远程端点之前,TLS连接尚未完成.