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:

Dieses Video ansehen auf YouTube.

Bei Fragen wie immer Kommentarfunktion nutzen.

Grüße Joachim

6 Kommentare

  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ß

Kommentar hinterlassen

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