Esto ES posible con Haproxy. Puede configurar un proxy TCP y extraer el SNI y hacer el enrutamiento basado en el SNI. Aquí hay un ejemplo:
backend be.app1
mode tcp
no option checkcache
no option httpclose
tcp-request inspect-delay 5s
tcp-request content accept if { req.ssl_hello_type 1 }
tcp-request content reject
use-server server1 if { req.ssl_sni -m beg app1. }
server server1 server1:8443 check id 1 weight 0
Es esencial retrasar la solicitud hasta que reciba el saludo SSL, de lo contrario, haproxy intentará establecer una conexión antes de recibir el encabezado SNI.
Estoy usando servidores con peso 0 porque, en mi configuración actual, solo tengo un servidor ejecutándose para cada SNI y no quiero que reciban solicitudes aleatorias. Probablemente puedas encontrar mejores formas de jugar con esto.
¿Me puede indicar alguna documentación de esto o un fragmento de configuración para que pueda aceptar la respuesta?
user319862
3
@ user319862 Encontré este bonito tutorial que parece ser lo que se está discutiendo.
Michael Hampton
1
De Verdad? ¿Por qué alguien rechazaría esta respuesta?
Florin Asăvoaie
El problema con esto es que la dirección IP del cliente no se reenvía, por lo que el servidor solo ve el tráfico proveniente del proxy.
Kyle
@Kyle por supuesto. Es el proxy TCP. Lo único que puede hacer al respecto es si configura y establece haproxy como un enrutador para el servidor y usa tproxy.
Gracias por publicar sobre ese proyecto. No lo sabía
user319862
@mick Hola mick cuando ejecuta SNI como proxy transparente, rompe algunos sitios con errores SSL. Como arreglarlo ?
gripenfighter
1
¡Esto es ciertamente posible, incluso ahora en 2019 con el próximo TLS 1.3! Muchos servidores web o proxys inversos especializados proporcionan esta funcionalidad lista para usar:
Nginx ≥ 1.11.5 (Debian ≥ buster o stretch-backports)
HAProxy ≥ 1.5 (Debian ≥ jessie)
Sniproxy (Debian ≥ buster)
etc.
Este es un ejemplo de configuración para Nginx, que es una opción muy popular para configuraciones que requieren un proxy inverso:
stream {
map $ssl_preread_server_name $selected_upstream {
example.org upstream_1;
example.net upstream_2;
example.com upstream_3;
default upstream_4;
}
upstream upstream_1 { server 10.0.0.1:443; }
upstream upstream_2 { server 10.0.0.2:443; }
upstream upstream_3 { server 10.0.0.3:443; }
upstream upstream_4 { server 10.0.0.4:443; }
server {
listen 10.0.0.5:443;
proxy_pass $selected_upstream;
ssl_preread on;
}
}
Los módulos de Nginx relevantes son stream_corey stream_ssl_preread. Manuales:
Puede usar sniproxy: https://github.com/dlundquist/sniproxy
Una configuración de ejemplo:
fuente
¡Esto es ciertamente posible, incluso ahora en 2019 con el próximo TLS 1.3! Muchos servidores web o proxys inversos especializados proporcionan esta funcionalidad lista para usar:
Este es un ejemplo de configuración para Nginx, que es una opción muy popular para configuraciones que requieren un proxy inverso:
Los módulos de Nginx relevantes son
stream_core
ystream_ssl_preread
. Manuales:fuente