Como faço para rotear pacotes criptografados HTTPS sem descriptografá-los?

3

Temos um cenário em que tenho dois aplicativos em execução em máquinas virtuais. Ambos servirão tráfego nas portas 80/443, mas em nomes de host diferentes. Um dos contêineres é fornecido pelo fornecedor e eles descriptografam o tráfego HTTPS dentro do contêiner.

Posso configurar o NGINX (ou outra ferramenta) para encaminhar o tráfego para uma determinada VM com base no hostname (talvez via SNI) sem descriptografar os pacotes no proxy?

Por exemplo:

myapp1.example.com:443 - > NGINX - > 10.0.0.1:8443 (encerre o HTTPS na VM) vendor1.example.com:443 - > NGINX - > 10.0.0.1:9443 (encerre o HTTPS na VM)

    
por Joe 17.04.2018 / 14:30

1 resposta

6

Isso pode ser feito usando o nginx ngx_stream_ssl_preread_module . Aqui está uma configuração de exemplo:

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;
    }
}

A diretiva upstream é usada para definir o servidor para o envio de tráfego. Em seguida, o map $ssl_preread_server_name permite que nginx leia o valor SNI da solicitação do cliente para direcionar corretamente o tráfego para a caixa direita upstream .

Isso funcionará APENAS se o cliente enviar um valor SNI válido. Isso também permite o uso de certificados de cliente para autenticação, pois a conexão TLS não é concluída até que DEPOIS nginx envie o tráfego para o ponto de extremidade remoto.

    
por 17.04.2018 / 15:03

Tags