Nginx Proxy Manager für HomeOffice mit Fritzbox

Webanwendungen im HomeOffice brauchen in der Regel einen VPN-Zugang, dass ist manchmal umständlich und einige Smartphone VPN-Programme saugen einem den Akku leer. Was gibt es an Alternativen. Mit Portforwarding auf der Fritzbox oder ähnlichen Routern kann man schon sehr viel erreichen ohne VPN. Nur ist es oft umständlich, und jede neue Anwendung muss in der Fritzbox mit Portforwarding neu eingerichtet werden.

Wäre es nicht viel einfacher, eine einzige IP-Adresse im Heimnetz zu haben die für Port 80/443 auf der Fritzbox freigeschaltet wird und doch höchste Fexibilität zu haben? Wäre es nicht besser eine Anwendung zu haben, in der man immer wieder weitere Webanwendungen hinzufügt, egal welche IP-Adresse intern, egal welcher Port ohne an der Fritzbox konfigurieren zu müssen. Wäre es nicht besser mehrere Domains mit SSL zu haben, egal ob die Anwendung nur über Port 80 mit HTTP angebunden ist?

Könnte hier noch einige Probleme aufzählen die uns täglich begegnen. Die Lösung heißt “Nginx Proxy Manager”. Das Programm stellt ein Webinterface zur Verfügung mit der alle Domains, Zertifikate, Hosts, Weiterleitungen und sogenannte “Custom Locations” eingetragen werden. Vor einiger Zeit hatte ich hierzu schon mal einen Artikel veröffentlicht allerdings mit Apache. Das kann man ebenfalls so benutzen, da lernt man auch etwas dabei:
https://blog.unixweb.de/zugriff-auf-openwebrx-ueber-apache-als-reverse-proxy/

Die Lösung mit “Nginx Proxy Manager” nimmt einem den lästigen Syntax von einem Webserver ab, was aber nicht davon abhalten soll, sich in der Tiefe damit zu beschäftigen 🙂 .

Mir gefällt die Lösung sehr gut, da sie mir etwas Arbeit abnimmt und die vielen Webserver mit seinen Anwendungen etwas übersichtlicher macht im Webinterface, als es eine Textdatei kann.

Was wird benötigt:

  1. DNS-Server wie duckdns.org oder noip.com
  2. Ein virtueller Server für NGINX Proxy Manager als VM (kein CT)
  3. Auf diesen Container wird Docker benötigt
  4. Alternativ geht auch ein Raspberry Pi 4 mit 4 GB RAM und Ethernet (kein Pi3/Pi2/Zero/WLAN)
  5. Weitere virtuelle Server mit Anwendungen oder ein bis mehrere Raspberry Pi
  6. Fritzbox Port Weiterleitung auf IP-Adresse des NGINX Manager mit Port 80/443

Architektur:

Hier eine Übersicht einer Beispiel Architektur, wie aussehen könnte.

Wir haben mehrere Anwendungen die Zugriff über das Internet benötigen:

  • https://unixweb.duckdns.org/etherpad -> 192.168.1.22:80
  • http://unixweb.duckdns.org/wordpress -> 192.168.1.20:443
  • https://meineurl.duckdns.org/web2 -> 192.168.1.10:8080
Architektur NGINX Proxy
Architektur NGINX Proxy

Installation des Docker Container:

Für die Grundinstallation bitte diesen Artikel anwenden:
https://blog.unixweb.de/docker-auf-raspberry-pi-sinnvoll/

Erstelle ein Verzeichnis unter /home/<Benutername>/nginx
Erstelle dort eine Datei mit den Namen “docker-compose.yml”.
Starte Container mit “docker-compose up -d”.

version: "3"
services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: always
    ports:
      # Public HTTP Port:
      - '80:80'
      # Public HTTPS Port:
      - '443:443'
      # Admin Web Port:
      - '81:81'
    environment:
      # These are the settings to access your db
      DB_MYSQL_HOST: "db"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "npm"
      DB_MYSQL_NAME: "npm"
      # If you would rather use Sqlite uncomment this
      # and remove all DB_MYSQL_* lines above
      # DB_SQLITE_FILE: "/data/database.sqlite"
      # Uncomment this if IPv6 is not enabled on your host
      # DISABLE_IPV6: 'true'
    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
    depends_on:
      - db
  db:
    image: 'jc21/mariadb-aria:latest'
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 'npm'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'npm'
    volumes:
      - ./data/mysql:/var/lib/mysql

Nun kann das Webfrontend mit http://<IP-Adresse>:81 aufgerufen werden und es sollte ein Login Fenster erscheinen.

 

Login NGINX Proxy Manager

Übersicht Proxy-Hosts

Erstellung eines SSL-Zertifikat

Aufruf der Webseite z.B. http://127.0.0.1:81/nginx/certificates
“These domains must be already configured to point to this installation” heißt, Dein DSL-Anschluß muss die gewünschte Domain bereits eingerichtet sein mit DuckDNS etc. in diesem Beispiel “unixweb.duckdns.org”.
E-Mail Adresse noch eintragen, I Agree to .. anklicken und dann auf Save klicken.
Hinweis: Fritzbox Portweiterleitung (Host-IP-Adresse Port 80/443) muss an diesen Schritt ebenfalls schon konfiguriert sein, sonst fällt dieser Schritt fehl und es kommt zu einer Fehlermeldung.

Nach erfolgreicher Einrichtung sollte nun ein neues Zertifikat mit dem entsprechendem Zertifikat hinterlegt sein. Nun wird die Domain eingerichtet als sogenannter Proxy-Host. Dieser nimmt dann die Anfragen für HTTP/HTTPS von außen an und leitet diese weiter. Wenn es Anwendungen gibt im Netz die eine Websocket Anbindung ( NodeRED,Smarthome) brauchen , einfach diesen bei “Websocket Support” aktivieren.

Als Ziel für “Custom Locations” trägt man den gewünschten Zielserver als Webserver, Webanwendung ein, mit dem Pfad ” / ” oder ” /wordpress” je nachdem ob der Server grundsätzlich erreichbar ist, oder nur für die eine Webanwendung WordPress in diesem Beispiel. Nicht zu vergessen bei “SSL” das dazugehörige erstellte Zertifikat auszuwählen, sonst funktioniert HTTPS nicht. Wenn alles richtig gemacht wurde, sollte der Status Online auf der rechten Seite erscheinen und ein grüner Punkt erscheinen.

Tipp: Wenn eine Konfiguration falsch oder syntaktisch nicht richtig ist, ändert sich der Punkt auf rot und der Proxyhost geht Offline. Das ist ein guter Indikator ob die eingetragenen Regeln alle stimmen oder Fehler enthalten.

Wenn nun alles richtig eingerichtet ist kann die URL aufgerufen werden: Es sollte dann eine Webseite erscheinen die auf den Host mit Location ” / ” hinterlegt ist. In meinem Fall ist es die Standard Webseite des Apache Webseserver.

Um die Anwendungen WordPress und Etherpad über die URL “unixweb.duckdns.org” erreichbar zu machen, müssen noch weitere “Custom Locations” eingetragen werden. Hierbei ist es egal auf welcher Server-IP-Adresse mit welchen Port auch immer die Anwendungen im lokalen Netzwerk laufen. Alle Anwendungen sind nur über eine Einstiegs-URL erreichbar und zwar: 

  • https://unixweb.duckdns.org/wordpress
  • https://unixweb.duckdns.org/etherpad

Es müssen keine Ports, oder verschiedene IP-Adressen angegeben werden. Ist das genial oder genial ?
Auf der Fritzbox hätte man hierzu schon 3 neue Weiterleitungen eintragen müssen.

Eine weitere Möglichkeit wäre verschiedene Docker Container die einen Expose (Published) Port haben über NGINX-Proxy Manager bereit zu stellen wie in diesem Beispiel. Man könnte sogar Container direkt ohne Expose nur über den NGINX-Proxy erreichbar machen. Dazu gibt es ein ensprechendes Youtube Video.

Wer jetzt denkt “Hilfe das ist ja alles von außen jedermann zugänglich” , kann Abhilfe geschaffen werden. Alle Proxyhosts können über einen Benutzername mit Passwort geschützt werden. Sehr hilfreich für Webkameras die selbst keinen Schutz haben. Dazu rufen wir die folgende URL auf :
http://localhost:81/nginx/access

Am Schluß wird der eben erstelle Access List Eintrag, in die Proxy Domain hinzugefügt. Geschützt sind nun die URL mit /kamera* aber nicht für WordPress und nicht für Etherpad weil man möchte, dass diese öffentlich erreichbar sind. Bei Authorization können weitere Benutzernamen mit individuelle Passwörter eingetragen werden. So kann sich Opa mit einem einfacheren Passwort anmelden als das Enkel 🙂

Wichtiger Hinweis:

Schaltet bitte nicht jede Webanwendung ins Internet, nur weil es so schön bequem und einfach ist. Hierzu gehören zum Beispiel: Octopi ein 3D-Druck Server, es besteht Brandgefahr wenn sich jemand Zugriff verschafft und Nachts unkontrolliert einen 3D-Druck anwirft. Oder Webkameras, die Persönlichkeitrechte verletzten. Auch Smarthome Automation mit Steuerung gehört dort nicht hin. Automatische Maschinen (Fertigungsrobotor) jeder Art die über eine Webanwendung steuerbar sind, haben nichts im Netz zu suchen. Also bitte besser einmal nicht als einmal zu viel, nachdenken bitte.

Ein weiterer Tipp zur Verwaltung von DNS-Namen:

Bei noip.com gibt es die Möglichkeit sogenannter “Wild Card” Domains. Die sehen wie folgt aus:

  • *.docker.ddns.net
  • *.apps.ddns.net usw.

Das hat den Vorteil dass man Anwendungen nach Namen mit den NGINX-Proxy einrichten kann und man betreibt die unter einer Subdomain wie apps.ddns.net. Die Anwendungen selbst laufen dann unter folgenden DNS-Sub Subdomains:

  • webcam1.apps.ddns.net
  • webcam2.apps.ddns.net
  • wordpress.apps.ddns.net
  • etherpad.apps.ddns.net

Dies wäre ein sauberer Aufbau und Trennung von Anwendungen. Es ist dabei zu beachten dass Lets Encrypt Zertifikate als Wildcard *.ddns.net nicht mit *.docker.ddns.net laufen und eine Fehlermeldung erzeugen. Dh. jeder Sub Subdomain Proxy Host benötigt sein eigenes Zertifikat und kann nicht mit Wildcard Zertifikate arbeiten. Ist ja nicht weiter schlimm da die Zertifikate kostenlos sind. Es ist zwar etwas Mehraufwand bei der Ersteinrichtung, aber es lohnt sich die Trennung.

Hier hab ich noch ein Youtube Video gefunden, was man sich gerne zu dem Thema passend ansehen kann:

Wir benötigen Ihre Zustimmung um den Inhalt von YouTube laden zu können.

Mit dem Klick auf das Video werden durch den mit uns gemeinsam Verantwortlichen Youtube [Google Ireland Limited, Irland] das Video abgespielt, auf Ihrem Endgerät Skripte geladen, Cookies gespeichert und personenbezogene Daten erfasst. Damit kann Google Aktivitäten im Internet verfolgen und Werbung zielgruppengerecht ausspielen. Es erfolgt eine Datenübermittlung in die USA, diese verfügt über keinen EU-konformen Datenschutz. Weitere Informationen finden Sie hier.

Jmx0O2lmcmFtZSB0aXRsZT0mcXVvdDtzeXNvcHMudHYgIzEwOCAtIG5naW54IFByb3h5IE1hbmFnZXImcXVvdDsgd2lkdGg9JnF1b3Q7MTIwMCZxdW90OyBoZWlnaHQ9JnF1b3Q7Njc1JnF1b3Q7IHNyYz0mcXVvdDtodHRwczovL3d3dy55b3V0dWJlLmNvbS9lbWJlZC9zRU43T1lSVE1OYz9zdGFydD0xNjU3JmFtcDtmZWF0dXJlPW9lbWJlZCZxdW90OyBmcmFtZWJvcmRlcj0mcXVvdDswJnF1b3Q7IGFsbG93PSZxdW90O2FjY2VsZXJvbWV0ZXI7IGF1dG9wbGF5OyBjbGlwYm9hcmQtd3JpdGU7IGVuY3J5cHRlZC1tZWRpYTsgZ3lyb3Njb3BlOyBwaWN0dXJlLWluLXBpY3R1cmU7IHdlYi1zaGFyZSZxdW90OyBhbGxvd2Z1bGxzY3JlZW4mZ3Q7Jmx0Oy9pZnJhbWUmZ3Q7

Bei Fragen wie immer Kommentarfunktion nutzen.

Grüße Joachim

Joachim

Aus Leidenschaft für Technik. Aktuelle Themen sind Datensicherheit, Software für Datenschutz, Mobile Geräte, Smartphone Sicherheit und Anwendungen, Raspberry Pi Geek.

Alle Beiträge ansehen von Joachim →

14 Gedanken zu “Nginx Proxy Manager für HomeOffice mit Fritzbox

  1. Hallo und vielen Dank für deinen Artikel!
    Ich hätte dazu die eine oder andere Frage und hoffe dass du mir weiterhelfen kannst.
    Kann ich mit dem Proxy Manager auch nur lokal agieren, damit ich nicht dauernd die Ports merken muss? Ein VPN wäre bereits eingerichtet und als DNS/DHCP Server fungiert das Pi-Hole.
    Wäre schön, wenn ich dann nur noch pi.home eingebe und direkt auf die Admin Page vom Pi-Hole komme. Weißt du wie ich das bewerkstelligen kann?

    1. Hallo whoami

      Schau mal hier Pi-Hole DNS
      So hab ich es gelöst. Du musst allerdings auf allen Rechnern die *.local als Suchdomain eintragen, dann sollte es funktionieren.

      Grüße Joachim

    1. Hi

      ich hab nicht gesagt dass der dort nicht laufen darf.
      Das Problem ist dass viele es falsch machen und dann nicht läuft
      und dann sich bei mir beschweren das es nicht funktioniert.

      Grüße Joachim

  2. Hallo, danke für den Artikel.
    Ich habe noch nicht ganz kapiert, wie ich die Umleitung von URL auf meine Services im lokalen Netz konfiguriere. Sie schreiben:

    “Um die Anwendungen WordPress und Etherpad über die URL “unixweb.duckdns.org” erreichbar zu machen, müssen noch weitere “Custom Locations” eingetragen werden. Hierbei ist es egal auf welcher Server-IP-Adresse mit welchen Port auch immer die Anwendungen im lokalen Netzwerk laufen. Alle Anwendungen sind nur über eine Einstiegs-URL erreichbar und zwar:
    https://unixweb.duckdns.org/wordpress
    https://unixweb.duckdns.org/etherpad
    Es müssen keine Ports, oder verschiedene IP-Adressen angegeben werden. Ist das genial oder genial ?
    Auf der Fritzbox hätte man hierzu schon 3 neue Weiterleitungen eintragen müssen.”

    Da würden mich noch Details interessieren, weil ich das nicht hin bekomme.

    Danke und Gruß

    1. Hallo Karsten

      wo bekommst Du was genau nicht hin , an welcher Stelle ?
      Hast Du Docker schon installiert ?
      Hast Du “docker-compose up -d” schon am laufen ?
      Bekommst Du schon den Login zum Nginx Proxy Manager ?

      Grüße Joachim

  3. Hallo Joachim,

    Vielen Dank für die tolle Anleitung.
    Kann ich Nginx auch verwenden um für meinen lokalen IMAP server mir einem SSL Zertifikat zu versorgen.
    Seit Apple die Sicherheits Einstellung am iPhone verschärft hat, kann ich keine Mails mehr empfangen, weil der Dovecot IMAP Server kein gültiges Zertifikat hat.
    Muss ich in der Docker Compose Konfiguration Port 993 hinzufügen?
    Vielen Dank,
    Thomas

    1. Hallo Thomas

      klar kannst Du Nginx auch für IMAP und andere Protokolle nutzen.
      Nur diesen von mir beschriebenen Manager kannst nicht nutzen, da dieser nur über die GUI http/https unterstützt.

      Hier ein kleines Beispiel :

      mail {
      #auth_http unix:/path/socket:/cgi-bin/auth;
      auth_http localhost:9000/cgi-bin/auth;

      proxy on;

      imap_capabilities "IMAP4rev1" "UIDPLUS"; ## default
      server {
      listen 143;
      protocol imap;
      }

      ## uncomment to enable POP3 proxy
      # pop3_capabilities "TOP" "USER";
      # server {
      # listen 110;
      # protocol pop3;
      # }

      }

      Schau mal hier, da gibt es weitere Infos die Dir sicher helfen können:
      https://www.nginx.com/resources/wiki/start/topics/examples/imapproxyexample/

      Beste Grüße Joachim

  4. Hallo Joachim,

    vielen Dank für diesen hervoragenden Blog zum Thema nginx proxy manager.

    Die Einrichtung des NPM war damit völlig problemlos.
    Es gibt allerdings Probleme mit der Einrichtung der Lets Encrypt Zertifikate, die bei mir wahrscheinlich Ihre Ursache bei der Konfiguration meiner FritzBox haben.
    Ich nutze keinen DynDNS-Dienst sondern myFritz, d.h. bei mir sieht die URL dann z.B. so aus:

    gsdfwere3zgsdfe4w.myfritz.net

    Leider bekomme ich beim Anlegen eines Proxy hosts in NPM immer die Fehlermeldung:

    “Some challenges have failed”

    wenn ich z.B. webserver.gsdfwere3zgsdfe4w.myfritz.net per NPM auf ein internes Ziel weiterleiten möchte.

    Hast Du eine Idee, woran das liegen könnte bzw. wie ich dem Fehler auf die Spur kommen kann?
    Vielen Dank.

  5. Hallo Joachim!
    Vielen Dank für die Infos!
    Frage mich, ob es auch möglich ist, anstelle DynDNS (o. ä. Diensten) auch die Domain “myfritz.net” zu benutzen.
    Also z.B. diese URL “https://qwertzuiop1234.myfritz.net/
    Solch eine URL wird erzeugt, wenn man in der Fritzbox den Fernzugriff einrichtet. Über diese URL kann man die Box im Netz finden und darauf zugreifen. Die Box nutzt dazu natürlich Port 443.
    Wenn man nun diese URL in nginx einträgt, und auch Zertifikate dazu erzeugen könnte, könnte ich mir als Fritz Box User dann nicht den zusätzlichen DynDNS Dienst sparen?

    1. Hallo Klaus

      das kann man so nutzen, aber dann ist halt nur die Fritzbox erreichbar. Dienste und Webserver die dahinter liegen sind dann aber nicht erreichbar und die belegst mit myfritz den Port 443 der nicht mehr weitergeleitet werden kann. Mit NPM als Lösung möchte man doch verschiedene Dienste mit verschiedenen URL’s zur Verfügung stellen und das geht mit myfritz nicht. Du kannst nur mit myfritz das machen wie es von AVM gedacht ist, oder musst es eben abschalten. Ich verstehe nicht wieso man sich einen DNS-Dienst sparen will, dass ist ein ganz anderes Konzept mit myfritz.
      Nebenbei erwähnt schau Dir mal https://ipv64.net an , der Dienst ist kostenlos und macht genau was es soll.

      Grüße Joachim

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert