Wie erzwinge ich ein bestimmtes Routing basierend auf SNI in HAProxy?

Wie erzwinge ich ein bestimmtes Routing basierend auf SNI in HAProxy?

Ich habe die folgende HAProxy-Konfiguration:

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

Wenn ich besuche www.example.com, ist alles in Ordnung. Aber wenn ich das mache, nachdem ich demo.example.comsehr oft neu geladen habe (Hämmern auf Umschalt-Strg-R im Browser), lande ich bei demo.example.com. Ja, genau: Ich öffne www.example.comim Browser, aber HAProxy leitet das an backend2 weiter (was einen Fehler zurückgibt).

Offenbar versteht HAProxy nicht ganz, dass die beiden Dienste keine Alternativen für den Lastenausgleich sind, sondern sehr unterschiedliche Produkte. Wie kann ichsicherstellendas www.example.combei backend1 landet?

Antwort1

Dies ist ein Beispiel aus der Dokumentation für 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

Sie müssen wahrscheinlich tcp-request inspect-delayetwas festlegen, denn wenn Sie es nicht festlegen, bedeutet dies, dass Haproxy überhaupt nicht wartet und keine Ahnung hat, was SNI war.
Längere Erklärung inDokumente fürtcp-request inspect-delay

verwandte Informationen