Un proxy inverso può utilizzare SNI con SSL?


18

Devo servire diverse applicazioni su https usando un indirizzo IP esterno.

I certificati SSL non devono essere gestiti sul proxy inverso. Sono installati sui server delle applicazioni.

È possibile configurare un proxy inverso per utilizzare SNI e passare ssl per la terminazione all'endpoint?

È possibile usare qualcosa come Nginx o Apache? Come appare la configurazione?

Risposte:


14

Questo è possibile con Haproxy. È possibile impostare un proxy TCP ed estrarre SNI ed eseguire il routing in base a SNI. Ecco un esempio:

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

È essenziale ritardare la richiesta fino a quando non viene visualizzato il messaggio SSL, altrimenti haproxy tenterà di stabilire una connessione prima di ricevere l'intestazione SNI.

Sto usando server con peso 0 perché, nella mia configurazione attuale, ho un solo server in esecuzione per ogni SNI e non voglio che ricevano richieste casuali. Probabilmente puoi trovare modi migliori per giocare con questo.

Spero che questo possa essere d'aiuto.


Puoi indicarmi qualsiasi documentazione su questo o uno snippet di configurazione in modo da poter accettare la risposta?
user319862

3
@ user319862 Ho trovato questo simpatico tutorial che sembra essere quello di cui si sta discutendo.
Michael Hampton

1
Veramente? Perché qualcuno dovrebbe sottovalutare questa risposta?
Florin Asăvoaie,

Il problema è che l'indirizzo IP del client non viene inoltrato, quindi il server vede sempre e solo il traffico proveniente dal proxy.
Kyle,

@Kyle Certo. È un proxy TCP. L'unica cosa che puoi fare al riguardo è se configura e imposta haproxy come router per il server e usi tproxy.
Florin Asăvoaie,

5

Puoi usare sniproxy: https://github.com/dlundquist/sniproxy

Una configurazione di esempio:

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
}

Grazie per la pubblicazione di quel progetto. Non ne ero a conoscenza
user319862 il

@mick Ciao mick quando esegui SNI come proxy trasparente, interrompe alcuni siti con errori SSL. Come sistemarlo ?
gripenfighter

1

Questo è certamente possibile, anche ora nel 2019 con l'imminente TLS 1.3! Molti server Web o proxy inversi specializzati offrono questa funzionalità pronta all'uso:

  • Nginx ≥ 1.11.5 (Debian ≥ buster o stretch-backport)
  • HAProxy ≥ 1,5 (Debian ≥ jessie)
  • Sniproxy (Debian ≥ buster)
  • eccetera.

Questa è una configurazione di esempio per Nginx, che è una scelta molto popolare per le configurazioni che richiedono 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;
  }
}

I moduli Nginx rilevanti sono stream_coree stream_ssl_preread. manuali:

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.