samiaaa
Goto Top

Nginx reverse proxy an anderen nginx reverse proxy

Hallo zusammen,

ich würde gerne einen Nginx-Reverse Proxy einrichten, der Anfragen je nach Domain an einen anderen Nginx-Reverse proxy weiterleitet.

Also folgendermaßen:

Reverse-Proxy 1:
*.domain1.de --> Reverse-Proxy2 --> sub1.domain1.de --> Host1
*.domain2.de --> Reverse-Proxy3 --> sub1.domain2.de --> Host2

Dabei soll der RP1 nur durchleiten, alles andere soll in den dahinter gelagerten Rps passieren (SSL, etc.)

Gibt es für nginx eine entsprechende Konfiguration, oder gibt es einen anderen Reverse-Proxy mit dem das einfach umzusetzen ist?

Danke schonmal und viele Grüße
Sami

Content-ID: 670169

Url: https://administrator.de/contentid/670169

Ausgedruckt am: 16.12.2024 um 09:12 Uhr

gastric
gastric 13.12.2024 aktualisiert um 13:12:13 Uhr
Goto Top
Hi.
Nach folgendem Schema sollte das klappen, SSL Zeuch kannst du ja selbst anpassen. Die Doku ist dein Freund
https://nginx.org/en/docs/dirindex.html
http {
    server {
        listen 80;
        server_name *.domain1.de;
        return 301 https://$host$request_uri;
    }

    server {
        listen 80;
        server_name *.domain2.de;
        return 301 https://$host$request_uri;
    }

    server {
        listen 443 ssl;
        server_name *.domain1.de;

        ssl_certificate /path/to/certificate1.crt;
        ssl_certificate_key /path/to/privatekey1.key;
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers HIGH:!aNULL:!MD5;

        location / {
            proxy_pass http://sub1.domain1.de;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }

    server {
        listen 443 ssl;
        server_name *.domain2.de;

        ssl_certificate /path/to/certificate2.crt;
        ssl_certificate_key /path/to/privatekey2.key;
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_ciphers HIGH:!aNULL:!MD5;

        location / {
            proxy_pass http://sub1.domain2.de;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }
}
Gruß gastric
SamiAAA
SamiAAA 13.12.2024 aktualisiert um 14:15:46 Uhr
Goto Top
Hallo gastric,

danke für die Antwort. Mein Ziel ist es allerdings, dass SSL von den Reverse-Proxys in zweiter Reihe gemanaged wird.

Hintergrund ist folgender. Wir haben aktuell 13 feste IPs die jeweils von verschiedenen Personen genutzt werden und auf unterschiedliche Server oder Reverse-Proxys zeigen. Diese erledigen auch SSL meistens per LetsEncrypt. Durch den Umstieg auf einen anderen (deutlich günstigeren) Anschluss haben wir demnächst nur noch eine statische IP-Adresse. Um die bisherige Konfiguration beibehalten zu können und auch damit jeder seinen eigenen Reverse-Proxy hat soll nun die Verteilung von einem vorgeschalteten Reverse-Proxy übernommen werden.

Der Traffic soll also möglichst unverändert nur durchgeleitet werden.
Dani
Dani 13.12.2024 um 14:21:04 Uhr
Goto Top
Moin,
danke für die Antwort. Mein Ziel ist es allerdings, dass SSL von den Reverse-Proxys in zweiter Reihe gemanaged wird.
Wie soll das funktionieren? Es wird zuerst der RP1, Port 80 angesprochen. Der leitet den Request an RP2, Port 80 weiter. Dort erfolgt eine Umleitung auf Port 443. D.h. es wir eine neue Verbindung aufgebaut und zwar am RP1. Sprich dort muss Port 443 mit einem gültigen Zertifikat vorhanden sein. Anderenfalls wird es zu einem Timeout/Error kommen.


Gruß,
Dani
SamiAAA
SamiAAA 13.12.2024 aktualisiert um 14:56:51 Uhr
Goto Top
Wie das funktionieren soll ist ja genau meine Frage... face-wink

Mit der Suche nach Transparent Proxy bin ich hierauf gestoßen:

https://serverfault.com/questions/1075851/fully-transparent-reverse-prox ...

Wenn ich es richtig verstehe ist es genau das was ich suche, etwas komplizierter als ich vermutet hätte.
gastric
Lösung gastric 13.12.2024 aktualisiert um 15:24:55 Uhr
Goto Top
Kein Problem einfach die streaming Funktion von nginx nutzen, und SSL preread einschalten, dann kann anhand des SNI die aufgerufene Domain aus dem SSL stream gefiltert werden und anhand dessen auf das richtige Backend weitergeleitet werden.
https://nginx.org/en/docs/stream/ngx_stream_core_module.html
SamiAAA
SamiAAA 13.12.2024, aktualisiert am 14.12.2024 um 08:29:58 Uhr
Goto Top
Zitat von @gastric:

Kein Problem einfach die streaming Funktion von nginx nutzen, und SSL preread einschalten, dann kann anhand des SNI die aufgerufene Domain aus dem SSL stream gefiltert werden und anhand dessen auf das richtige Backend weitergeleitet werden.
https://nginx.org/en/docs/stream/ngx_stream_core_module.html

Danke! Ich werde mich damit auseinandersetzen. Was mich wundert ist, dass in der von mir verlinkten Anleitung auch noch ein Script beschrieben ist was nach meinem Verständnis den Hostname auslesen soll. Ich habe aber noch nicht genug Zeit gehabt um es mir genauer anzugucken. Ich bin auch nicht allzu erfahren mit scripting. Alternativ habe ich auch einen Ansatz mit HA Proxy gefunden den ich mir auch anschauen werde.
SamiAAA
Lösung SamiAAA 14.12.2024 aktualisiert um 11:59:51 Uhr
Goto Top
Ich habe eine sehr einfache Lösung gefunden. Unsere Firewall ist ein OpnSense-Rechner auf dem ich nun Caddy als Plugin installiert habe. Die Layer-4 upstream-Funktion ist per GUI konfigurierbar und die Einrichtung hat 5min gedauert und hat auf Anhieb funktioniert. Hierdurch erspare ich mir auch einen weiteren LXC für den zusätzlichen Proxy. Danke @gastric für den Wink in die richtige Richtung!