如何在不解密的情况下路由 HTTPS 加密数据包?

如何在不解密的情况下路由 HTTPS 加密数据包?

我们有一个场景,我有两个应用程序在虚拟机中运行。它们都将在端口 80/443 上提供流量,但使用不同的主机名。其中一个容器是供应商提供的,它们将解密容器内的 HTTPS 流量。

我可以配置 NGINX(或其他工具)根据目标主机名(可能通过 SNI)将流量路由到某个虚拟机吗?没有解密代理中的数据包?

例如:

myapp1.example.com:443 -> NGINX -> 10.0.0.1:8443(在 VM 上终止 HTTPS)vendor1.example.com:443 -> NGINX -> 10.0.0.1:9443(在 VM 上终止 HTTPS)

答案1

这可以通过使用nginx ngx_stream_ssl_preread_module。以下是示例配置:

user  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指令用于定义要发送流量的服务器。然后允许map $ssl_preread_server_namenginx客户端读取请求的 SNI 值,以将流量正确地引导到正确的upstream框。

这会仅有的nginx如果客户端发送了有效的 SNI 值,则此方法有效。这也允许使用客户端证书进行身份验证,因为 TLS 连接直到将流量发送到远程端点后才完成。

相关内容