¿Puede un proxy inverso usar SNI con SSL?


18

Necesito servir varias aplicaciones a través de https usando una dirección IP externa.

Los certificados SSL no deben administrarse en el proxy inverso. Se instalan en los servidores de aplicaciones.

¿Se puede configurar un proxy inverso para usar SNI y pasar ssl para su terminación en el punto final?

¿Es esto posible usar algo como Nginx o Apache? ¿Cómo se ve la configuración?

Respuestas:


14

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.

Espero que esto ayude.


¿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.
Florin Asăvoaie

5

Puede usar sniproxy: https://github.com/dlundquist/sniproxy

Una configuración de ejemplo:

listener 0.0.0.0:443 {
    protocol tls
    table TableHTTPS
    fallback 127.0.0.1:8443
}

listener 0.0.0.0:80 {
    protocol http
    table TableHTTP
    fallback 127.0.0.1:8080
}

table TableHTTPS {
    domain1.com backend1:443
    domain2.org backend2:443
}

table TableHTTP {
    domain1.com backend1:80
    domain2.org backend2:80
}

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:

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.