Kann ein Reverse Proxy SNI mit SSL-Pass-Through verwenden?

18

Ich muss mehrere Anwendungen über https mit einer externen IP-Adresse bedienen.

Die SSL-Zertifikate sollten nicht auf dem Reverse-Proxy verwaltet werden. Sie werden auf den Anwendungsservern installiert.

Kann ein Reverse-Proxy so konfiguriert werden, dass er SNI verwendet und SSL zur Beendigung am Endpunkt durchläuft?

Ist dies mit etwas wie Nginx oder Apache möglich? Wie sieht die Konfiguration aus?

user319862
quelle

Antworten:

14

Dies ist mit Haproxy möglich. Sie können einen TCP-Proxy einrichten, die SNI extrahieren und das Routing basierend auf der SNI durchführen. Hier ist ein Beispiel:

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 ist wichtig, die Anforderung zu verzögern, bis Sie die SSL-Begrüßung erhalten. Andernfalls versucht haproxy, eine Verbindung herzustellen, bevor der SNI-Header empfangen wird.

Ich verwende Server mit der Gewichtung 0, da in meiner aktuellen Konfiguration nur ein Server für jedes SNI ausgeführt wird und sie keine zufälligen Anforderungen erhalten sollen. Sie können wahrscheinlich bessere Möglichkeiten finden, um damit zu spielen.

Ich hoffe das hilft.

Florin Asăvoaie
quelle
Können Sie mich auf eine Dokumentation dieses oder eines Konfigurationsausschnitts hinweisen, damit ich die Antwort akzeptieren kann?
user319862
3
@ user319862 Ich fand dieses nette Tutorial, das zu sein scheint, was diskutiert wird.
Michael Hampton
1
"Ja wirklich?" Warum sollte jemand diese Antwort ablehnen?
Florin Asăvoaie
Das Problem dabei ist, dass die IP-Adresse des Clients nicht weitergeleitet wird, sodass der Server immer nur Datenverkehr vom Proxy sieht.
Kyle
@ Kyle Natürlich. Es ist ein TCP-Proxy. Das einzige, was Sie tun können, ist, wenn Sie haproxy als Router für den Server konfigurieren und einstellen und tproxy verwenden.
Florin Asăvoaie
5

Sie können sniproxy verwenden: https://github.com/dlundquist/sniproxy

Eine Beispielkonfiguration:

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
}
mick
quelle
Vielen Dank für die Veröffentlichung über dieses Projekt. Ich war mir dessen nicht bewusst
user319862
@mick Hi mick, wenn SNI als transparenter Proxy ausgeführt wird, werden einige Sites mit SSL-Fehlern beschädigt. Wie man es repariert ?
Gripenfighter
1

Dies ist mit dem kommenden TLS 1.3 sicherlich schon ab 2019 möglich! Viele Webserver oder spezialisierte Reverse-Proxys bieten diese Funktionalität sofort an:

  • Nginx ≥ 1.11.5 (Debian ≥ Buster oder Stretch-Backports)
  • HAProxy ≥ 1,5 (Debian ≥ Jessie)
  • Sniproxy (Debian ≥ Buster)
  • etc.

Dies ist eine Beispielkonfiguration für Nginx, die bei Setups, die einen Reverse-Proxy erfordern, sehr beliebt ist:

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;
  }
}

Die relevanten Nginx-Module sind stream_coreund stream_ssl_preread. Anleitungen:

vog
quelle