Назад | Перейти на главную страницу

Как маршрутизировать зашифрованные пакеты HTTPS, не расшифровывая их?

У нас есть сценарий, в котором у меня есть два приложения, которые работают на виртуальных машинах. Оба они будут обслуживать трафик на портах 80/443, но на разных именах хостов. Один из контейнеров предоставляется поставщиком, и они будут расшифровывать HTTPS-трафик внутри контейнера.

Могу ли я настроить NGINX (или другой инструмент) для маршрутизации трафика к определенной виртуальной машине на основе целевого имени хоста (возможно, через SNI) без расшифровывать пакеты в прокси?

Например:

myapp1.example.com:443 -> NGINX -> 10.0.0.1:8443 (завершить HTTPS на ВМ) vendor1.example.com:443 -> NGINX -> 10.0.0.1:9443 (завершить HTTPS на ВМ)

Этого можно добиться, используя 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_name позволяет nginx прочитать значение SNI запроса от клиента, чтобы правильно направить трафик вправо upstream коробка.

Это будет ТОЛЬКО работают, если клиент отправляет допустимое значение SNI. Это также позволяет использовать клиентские сертификаты для аутентификации, поскольку TLS-соединение не завершается до ПОСЛЕ nginx отправляет трафик на удаленную конечную точку.