У нас есть сценарий, в котором у меня есть два приложения, которые работают на виртуальных машинах. Оба они будут обслуживать трафик на портах 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
отправляет трафик на удаленную конечную точку.