godlich
Goto Top

Reverse proxy zu https mit nginx

Ich habe folgendes Setup:

  • Zwei domains, zwei server
  • Anfragen gehen von der fritzbox an Server 1 (nginx)
  • Server 1 bearbeitet Anfragen für Domain 1 selbst, für Domain 2 leitet er weiter an Server 2
  • Server 2 (apache) ist so konfiguriert, dass automatisch auf https umgeleitet wird.
  • Auf beiden Servern läuft ein certbot

Die Server lassen sich aus dem Heimnetzwerk fehlerfrei ansprechen.

netzwerk konfiguration

Fehler:
  • Domain 1 meldet End of File Error
  • Domain 2 antwortet gar nicht

Kann mir bitte jemand helfen, die nginx.conf anzupassen?

Meine nginx.conf:

root@reverseProxy:~# nano /etc/nginx/nginx.conf
  GNU nano 2.9.3                                    /etc/nginx/nginx.conf

user www-data;
worker_processes auto;
pid /run/nginx.pid;
include /etc/nginx/modules-enabled/*.conf;

events {
        worker_connections 768;
        # multi_accept on;
}

#stream {
#       server {
#               listen 443;
#               proxy_ssl on;
#               server_name .bardhome.de;
#               location / {
#                       proxy_pass https:{{comment_single_line_double_slash:0}}
#               }
#       }
#
#}

http {

        ##
        # Basic Settings
        ##

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_timeout 65;
        types_hash_max_size 2048;
        # server_tokens off;

        # server_names_hash_bucket_size 64;
        # server_name_in_redirect off;

        include /etc/nginx/mime.types;
        default_type application/octet-stream;

        ##
        # SSL Settings
        ##

        ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # Dropping SSLv3, ref: POODLE
   ssl_prefer_server_ciphers on;

    ##
    # Logging Settings
    ##

    access_log /var/log/nginx/access.log;
    error_log /var/log/nginx/error.log;

    ##
    # Gzip Settings
    ##

    gzip on;

    # gzip_vary on;
    # gzip_proxied any;
    # gzip_comp_level 6;
    # gzip_buffers 16 8k;
    # gzip_http_version 1.1;
    # gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javas$

    ##
    # Virtual Host Configs
    ##

    server {
            listen 80;
            server_name huntworker.ddns.net;
            return 301 https://$host$request_uri;
    }

    server {
            listen 80;
            server_name .bardhome.de bardhome.spdns.de;

            return 301 192.168.178.8;
    }

    server {
            listen 443;
            server_name .bardhome.de bardhome.spnds.de;
            return 301 192.168.178.8:443;

#                location / {
#                      proxy_pass https://192.168.101/;
#                       proxy_buffering off;
#                       proxy_ssl_server_name on;
#                       proxy_set_header X-Real-IP $remote_addr;
#                }
#
#       }

        server {
                listen 80 default_server;
                listen 443 ssl;
                listen [::]:80 default_server;


                ssl_certificate         /etc/letsencrypt/live/huntworker.ddns.net/fullchain.pem;
                ssl_certificate_key     /etc/letsencrypt/live/huntworker.ddns.net/privkey.pem;

                server_name _;

                location / {
                        proxy_pass http://192.168.178.2:81/;
                        proxy_buffering off;
                        proxy_set_header X-Real-IP $remote_addr;
                }

                location /pv {
                        proxy_pass http://192.168.178.7/;
                        proxy_buffering off;
                        proxy_set_header X-Real-IP $remote_addr;
                }
        }

        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
}

Wenn ich folgendes auskommentiere funktioniert Domain 1, domain 2 aber antworetet nicht:

   server {
            listen 443;
            server_name .bardhome.de bardhome.spnds.de;
            return 301 192.168.178.8:443;

#                location / {
#                      proxy_pass https:{{comment_single_line_double_slash:0}}
#                       proxy_buffering off;
#                       proxy_ssl_server_name on;
#                       proxy_set_header X-Real-IP $remote_addr;
#                }
#
#       }

Content-ID: 585320

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

Ausgedruckt am: 19.11.2024 um 07:11 Uhr

NordicMike
NordicMike 06.07.2020 um 12:36:19 Uhr
Goto Top
Das nützt nicht wenn du dem anfragenden Browser ein

return 301 192.168.178.8

zurück gibst, mit dieser Adresse kann er nichts anfangen, das ist eine IP, die übers Internet nicht erreichbar ist.

Die return 301 sind nur gut um dem Browser zu sagen, der Server ist wo anders erreichbar (nicht hier), das ist also nur gut um auf HTTPS zu wechseln oder der Server ist nun wirklich unter einem anderen DNS Namen oder anderer öffentlicher IP erreichbar). Proxy Anfragen darfst du nicht mit 301 beantworten, sondern der Proxy muss die Anfrage annehmen, sich die Daten holen und es dem Anfragendenen selbst weiter geben.

Dafür gibt es zwei Varianten:

Der Nginx nimmt die Anfragen an, holt sich die Daten vom Server2 und antwortet mit ihnen.
Variante 1: Der Nginx verwendet dafür sein eigenes Zertifikat (das beide Namen beinhalten muss)
Variante 2: Der Host Header wird durchgereicht, also antwortet Nginx mit dem Zertifikat von Server2, wenn die Anfrage für Server2 angedacht war.

Beides müsste Nginx theoretisch können (praktisch habe ich keine Erfahung gesammelt oder die Datenblätter überprüft).
godlich
godlich 06.07.2020 um 13:43:59 Uhr
Goto Top
Vielen Dank!

ich habs auch mit proxy_pass http://192.168.178.8 versucht, aber das lief auch nicht, gleicher Fehler.

Variante 2: Der Host Header wird durchgereicht, also antwortet Nginx mit dem Zertifikat von Server2, wenn die Anfrage für Server2 angedacht war würde ich präferieren. Ich habe schon einiges gegoogelt, aber ich finde nur Anleitungen, in denen auf http umgeleitet wird oder bei denen eben nur 1 Server im Spiel ist, dessen certbot sich um alle Anfragen kümmert.
ziqz00ma
ziqz00ma 06.07.2020 um 14:06:34 Uhr
Goto Top
Zitat von @godlich:

Vielen Dank!

ich habs auch mit proxy_pass http://192.168.178.8 versucht, aber das lief auch nicht, gleicher Fehler.

Variante 2: Der Host Header wird durchgereicht, also antwortet Nginx mit dem Zertifikat von Server2, wenn die Anfrage für Server2 angedacht war würde ich präferieren. Ich habe schon einiges gegoogelt, aber ich finde nur Anleitungen, in denen auf http umgeleitet wird oder bei denen eben nur 1 Server im Spiel ist, dessen certbot sich um alle Anfragen kümmert.

Dazu müssten beide Zertifikate auf deinem Reverse Proxy (Server1) vorhanden sein. Ein "Durchreichen" des Zertifikats vom Backend-Server (Server2) ist prinzipbedingt nicht möglich. Wenn das ginge, wäre https ja grundsätzlich per Man-in-the-middle angreifbar.

Erstell dir am besten ein internes Zertifikat für Server2 (welchem Server1 dann vertrauen muss) und handhabe beide öffentlichen (Certbot-)Zertifikate auf deinem Reverse-Proxy.