Reverse Proxy - Funktion und wie geht es

Hallo,

Im Umfeld von Geofency kommt immer wieder das Thema ReverseProxy auf Basis von nginx auf.

Ich habe etwas gegoogelt, mir ist aber nicht klar warum das mehr Sicherheit bringt.
Ich würde mich freuen, wenn da jeman erklären könnte.

Und natürlich wüsste ich gerne wie die Conference von nginx unter Windows dann grob aussehen muss.
Wäre es möglich die hier mal zu posten, so dass von extern nur eine Adresse zugänglich ist, und nicht das ganze Webfront offen steht.

Vielen Dank und Gruß
Christian

Wenn du nur bestimmte Seiten verfügbar machen möchtest, kannst du eine eigen Webserverinstanz erstellen ohne das Webfront. Das wiederrum zeigt auf einem Verzeichnis wo nur bestimmte Dateien sind. Besser wäre jedoch VPN.

Mit Reverseproxy veröffentlich man z.B. mehrere URLs unter einer Adresse:

z.B. home.dyndns.org/ips -> 192.168.1.3:82
home.dyndns.org/owa -> 192.168.1.1:443
home.dyndns.org/irgenwas -> 192.168.1.2:12345

Dann am besten noch die URL mit eine SSL Zertifikat sichern - die Anwendungen nach hinten sprechen dann nackt HTTP - die Sicherung mit SSL macht dann der Server vorne (LAN sollte ja in der „Regel“ sicherer sein).

Somit mehr Sicherheit ;).

Ich gehe noch ein Schritt weiter und lasse auf den beiden offenen Ports 443 und 80 nur Anfragen durch, deren Ziel-FQDN erlaubt ist.

So werden alle Anfragen aus dem Internet an Port 443 grundsätzlich mit Fehler 444 beantwortet, nur wenn die Anfrage an spezielle my.domain.tld geht, dann wird’s an IPS geleitet. Ist ehrlich gesagt ein wenig Security by Obscurity, aber Username/Password braucht man dann ja auch noch. Nur Geofency lasse ich direkt auf Port 80 durch, weil die App es damals noch nicht unterstützt hat.

Hier die Beispiel-Config: nginx.conf.txt (1.62 KB).

Netter Nebeneffekt: mein IPS ist von innen und außen über die gleiche URL erreichbar. Die App bekommt das gar nicht mit und läuft einfach weiter :loveips:

Grüße, Axel

Hallo,

vielen Dank für die Erklärung.
Das bedeute, wenn ich mein Webfront intern über Port 80 ohne Kennwort erreiche, sollte ich den ReverseProxy auf z.B. Port 82 mit Kennwort leiten, also dafür eine Webserverinstanz einrichten.
Wenn ich dann nginx entsprechend der beigefügten Konfig laufen lassen (angepasst an mein dyndns und Port) habe ich keine Probleme zu erwarten.

Ich werd das mal versuchen. Am liebsten wäre es mir, wenn ich sogar nur das Webfront/user/Geofence Verzeichnis erreichen kann, dann käme man gar nicht auf das ganze Webfront, sollte man das Kennwort erraten oder mitschneiden.

Gruß
Christian

Du kannst auch nginx als SSL-Endpunkt laufen lassen und dann alles intern und unverschlüsselt auf Port 80 leiten. In meiner Konfig hab ich das anders, aber auch nur, weil ich zu faul bin das entsprechend einzustellen :rolleyes:

Genau das ist in meiner Konfig oben abgebildet.

Grüße, Axel

Hallo,

ich danke für die Erklärung, und die Beispielkonfiguration.

Jetzt läuft auf dem IPS Server ein nginx, der nur den Link zum Geofency Skript durchlässt und alles andere blockt.
Wenn ich zu Haus remote drauf möchte mach ich eh ein VPN auf. Nur mit Geofency geht das nicht automatisch. Das ist somit das einzige „Loch“ in mein Netz neben VPN.

Gruß
Christian

Du kannst auch nginx als SSL-Endpunkt laufen lassen und dann alles intern und unverschlüsselt auf Port 80 leiten

Hätte dazu jemand bitte ein kommentiertes Beispiel? Ich blicks mit den Anleitungen im Internet nicht.

Hallo zusammen,

ich fang mal wieder klein ang.

Erstes Ziel ist die Weiterleitung der Eingangsanfragen an verschiedene Webserver.

Habs jetz mal selber versucht nach der Anleitung unter:

youresuchageek: Howto Raspberry Pi - Use your Pi as a secure Reverse Proxy gateway to your Web internal Sites and Services

Der Zugang ist passwortgeschützt.
Die Zielseiten (ausser IPS extern) sind nicht psswortgeschützt.

Das mit den locations direkt auf dem ReverseProxy (shellinabox / rpimonitor) funktioniert.

Das mit den ip’s/namen und verzeichnissen auf andere/n Webservern/Hosts funktioniert leider nicht.

Bekomme immer „404 NotFound“.

Die Adresse sowohl der Name des Hosts wären vom ReversProxy aus zu pingen -> DNS funktioniert.

Wenn ich die Adressen in der config klicke komm ich auf der richtigen Site raus.

Hier mal meine (nach /etc/nginx/sites-available) verlinkte main:

access_log on;
add_header Cache-Control public;
server_tokens off;


# HTTP 80
#server {
# listen         80;
# server_name _;
# rewrite ^ https://my.dyndns.org$request_uri? permanent;
#}

### Default Server für Port 80

server {
        listen 80 default_server;
        return 444;
        access_log /var/log/nginx/port80.log;
}

# HTTPS 443
server  {
 include    /etc/nginx/proxy.conf;

 listen 443 ssl;
 keepalive_timeout 70;

 server_name my.dyndny.org;

 # SSL config
 ssl on;
 ssl_certificate /etc/ssl/localcerts/autosigned.crt;
 ssl_certificate_key /etc/ssl/localcerts/autosigned.key;

 ssl_session_timeout 5m;
 ssl_protocols SSLv3 TLSv1.2;
 ssl_ciphers RC4:HIGH:!aNULL:!MD5;
 ssl_prefer_server_ciphers on;
 ssl_session_cache shared:SSL:10m;

 add_header X-Frame-Options DENY;

 # DDOS protection - Tune Values or deactivate in case of issue
 # limit_conn conn_limit_per_ip 20;
 # limit_req zone=req_limit_per_ip burst=20 nodelay;

 # status for ngxin auditing
 location /nginx-status {
      stub_status on;
      access_log off;
      allow 127.0.0.1;
      deny all;
  }

# wofür ist das denn? funktioniert, zumindest PI-intern ohne
# location / {
#  rewrite ^ https://my.dyndns.org/ips/ permanent;
#  }


#    location /shellinabox/ {
#    proxy_pass http://192.168.178.2:4200; # Shell in a Box auf rasp-reverseproxy #funktioniert
#                proxy_set_header Host $host;
#                auth_basic "Passwortgeschützter Bereich";
#                auth_basic_user_file  "/etc/nginx/.htpasswd";
#                access_log /var/log/nginx/ips.access.log;
#                error_log /var/log/nginx/ips.error.log;
#    }

    location /rpimonitor/ {
    proxy_pass http://192.168.178.2:8888; # RPI-Monitor auf rasp-reverseproxy #funktioniert

                proxy_set_header Host $host;
                auth_basic "Passwortgeschützter Bereich";
                auth_basic_user_file  "/etc/nginx/.htpasswd";
                access_log /var/log/nginx/ips.access.log;
                error_log /var/log/nginx/ips.error.log;
    }

#    location /rpimonitor/status.html/ {
#    proxy_pass http://192.168.178.2:8888/status.html; # RPI-Monitor auf rasp-reverseproxy #funktioniert nicht ->  Can not get information (dynamic.json) from RPi-Monitor server.
#    # und beim 2. refresh nur noch ein quadratischer Punkt
#                proxy_set_header Host $host;
#                proxy_set_header X-Real-IP $remote_addr;
#                auth_basic "Passwortgeschützter Bereich";
#                auth_basic_user_file  "/etc/nginx/.htpasswd";
#                access_log /var/log/nginx/ips.access.log;
#                error_log /var/log/nginx/ips.error.log;
#    }
  
    location /ips/ {
    proxy_pass https://192.168.178.17:82; # IPS 1 # funktioniert nicht -> 404 not found
                proxy_set_header Host $host;
                auth_basic "Passwortgeschützter Bereich";
                auth_basic_user_file  "/etc/nginx/.htpasswd";
                access_log /var/log/nginx/ips.access.log;
                error_log /var/log/nginx/ips.error.log;
    }

    location /CarPort/ {
    proxy_pass http://192.168.178.16/2011ProjectCarport ; # NAS Web-Verzeichnis 2011ProjectCarport # funktioniert nicht -> 404 not found
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                auth_basic "Passwortgeschützter Bereich";
                auth_basic_user_file  "/etc/nginx/.htpasswd";
                access_log /var/log/nginx/ips.access.log;
                error_log /var/log/nginx/ips.error.log;
    }

}


Kann mir bitte jemand einen Tipp geben was ich in der main ändern muss um zum Ziel zu kommen?

Die „/etc/nginx/nginx.conf“ wurde verglichen aber nicht angepasst.

Vielen Dank für Eure Hilfe im Voraus.

Sorry Leute,

war ein Tippfehler meinerseits. Hatte nicht beachtet, dass die locations CaseSensitive sind. Jetzt funktionierts.

Jetzt taucht ein neues Problem auf: einige Scriptinterne includes funktionieren nicht (Thema HighCharts).

Ist bstimmt nur ein Problem für dummies.

Zustandsbeschreibung:
Wenn ich die URL im Webbrowser direkt aufrufe bekomm ich eine Site mit dem gewünschten Ergebnis. Sowohl von intern, als auch über die Weiterleitung des ReverseProxys.
Die selbe Datei hab ich auch über das IPS-Webfront als externe Seite eingebunden und funktioniert sowohl von intern als auch von extern über den RevereseProxy.

Problem:
! Was nicht funktioniert ist der Aufruf der Datei, sowohl intern als auch über den Reverseproxy, wenn ich die Seite über einen Link in einem jq-Menü, aufrufe.

Da kommt immer Warning: include_once(): open_basedir restriction in effect. file …
Das Include verweist auf ein Verzeichnis 2 Ebenen höher, das direkt unter dem Gesamtverzeichnis liegt.

Wenn ich die Datei direkt unter das Gesamtverzeichnis lege, und den include() Pfad anpasse, dann funktionierts.

            // Verbrauche
            if($_GET['ac'] == "trinkwasserjahr") // VerbrauchsCharts
            {
        #    include_once './Verbrauche/Trinkwasser/TrinkwasserJahr.php'; // funktioniert nicht
            include_once 'TrinkwasserJahr.php'; // funktioniert

Nun die Frage: wie kann ich die .php Datei in ein Unterverzeichnis mit Unterverzeichnis legen, so dass die includes noch funktionieren?

Was ich schon gelesen hab ist sowas wie irgend wo open_basedir azupassen. Hab aber keine Ahnung wo. Auf dem Nas auf dem die Datei liegt? In welcher Datei? Oder auf dem Reverseproxy? In welcher Datei?

Wenn ich mittlerweile mit meinen Fragen im falschen Threat bin, dan bitte verschieben.

Hallo zusammen,

nach dem mein ReversProxy einige Zeit super funktioniert hat, bekomm ich seit kurzem bei 2 Weiterleitungen einen

504 Gateway Time-out

[HR][/HR]nginx

die WebCam und IPS bekommen diesen Fehler.

andere wie meine Synology (diverse Weiterleitungen), der Pi-Statusmonitor, funktionieren weiterhin.

Hab am ReverseProxy, an der Kamera und an IPS nix rumgespielt.

Wo kann ich suchen um das Problem einzugrenzen/zu lösen?

Vielen Dank für Eure Hilfe im vorraus,

Edit: Ich bin voll angepixxt. Kaum hatte ich den Post geschrieben, da seh ich nach einer Aktualisierung des Browsers, dass sich IPS wieder aufrufen lässt. Die Cam auch.

Hab nix verändert. Nur gesucht und BackupKonfigs mit der aktiven Konfig verglichen ???

Was mich am meisten ärgert ist, dass das jeder Zeit wieder passieren kann und ich dann wieder keine Lösung hab.

Hat evtl schon jemand das selbe Phänomen gehabt oder eine Lösung zu o.g. Problem?

Vielen Dank für Eure Hilfe im vorraus,