¿Cómo forzar un enrutamiento específico basado en SNI en HAProxy?

¿Cómo forzar un enrutamiento específico basado en SNI en HAProxy?

Tengo la siguiente configuración de HAProxy:

listen sni-443
    bind *:443
    mode tcp

    timeout connect  4s
    timeout client   3m
    timeout server   3m
    tcp-request inspect-delay 5s
    tcp-request content accept if { req.ssl_hello_type 1 }
    acl no-ssl req.ssl_hello_type 0

    use-server backend1.default.svc.cluster.local if !no-ssl { req_ssl_sni -i www.example.com }
    server  backend1.default.svc.cluster.local  10.96.245.95:443 weight 0

    use-server backend2.default.svc.cluster.local if !no-ssl { req_ssl_sni -i demo.example.com }
    server  backend2.default.svc.cluster.local  10.96.184.199:443 weight 0

Si lo visito www.example.com, todo está bien. Pero cuando lo hago después de haber recargado demo.example.comcon alta frecuencia (presionando Shift-Ctrl-R en el navegador), termino en demo.example.com. Sí, exactamente: lo abro www.example.comen el navegador pero HAProxy lo enruta al backend2 (que devuelve un error).

Aparentemente, HAProxy no comprende del todo que los dos servicios no son alternativas para el equilibrio de carga sino productos muy distintos. Cómo puedoasegurar¿Eso www.example.comtermina con backend1?

Respuesta1

Este es un ejemplo de documentos para req_ssl_sni:

tcp-request inspect-delay 5s
tcp-request content accept if { req_ssl_hello_type 1 }
use_backend bk_allow if { req_ssl_sni -f allowed_sites }
default_backend bk_sorry_page

Probablemente necesite tcp-request inspect-delayconfigurar algo, porque no configurarlo significa que haproxy no espera en absoluto y no tiene idea de qué era SNI.
Explicación más larga endocumentos paratcp-request inspect-delay

información relacionada