[Update] HowTo: Reverse Proxy mit LetsEncrpyt unter Docker

  • Alte Version ersetzt und durch sicherere Version geupdatet am 25.06.2018


    Bei meinen verschiedenen Ansätzen gab es immer wieder Dinge die mich gestört haben wie:

    • Umständlich für jeden Container einrichten
    • kein automatisches Verlängern von Zertifikaten
    • Nginx von Hand anpassen für jeden Container


    Mit meiner jetzigen Lösung ist all das überflüssig und es lässt sich ganz einfach mit jedem Container umsetzen.


    Voraussetzungen mit SSL über LetsEncrypt:


    • IPv4 – Ich habe das ganze mit DSLite und einer reinen IPv6 versucht, leider war es mir nicht möglich das LetsEncrypt Zertifikat zu genieren.
    • Domain die Wildcards erlaubt (Namecheap hat zum Teil sehr günstige Domains und auch gleich DynDNS mit im Angebot) alternativ sollten auch diverse DynDNS Dienste funktionieren.


    Wofür das Ganze?

    Um mir nicht jeden Port merken müssen und Anwendungen direkt im Browser ansprechen zu können gefällt es mir deutlich besser meinen Programme mit ihrem Namen aufzurufen.
    So wird mein Emby Server nicht mehr mit http://meinedomain.com:8096aufgerufen sondern mit http://emby.meinedomain.comoder mit Verschlüsselungen halt mit https://emby.meinedomain.com.Wenn man es nur Lokal betreibt wäre es dann etwa http://emby.nasoder http://filebot.nas wobei NAS hier der Netzwerkname meines NAS ist.

    Domain aufs eigene Netzwerk schalten
    Grundvoraussetzung damit der ganze Spaß hier funktioniert ist: Eure Domain muss bereits auf euer Netzwerk (eure externe IP) geschaltet sein. Im besten Fall gleich mit eine DynDNS damit ihr die IP nicht manuell neu konfigurieren müsst.


    Die nötigen Container installieren:
    Wir installieren uns als erstes den Nginx Proxy Container. Ich würde empfehlen dies übers Terminal zu machen das geht in der Regel schneller als den Container über das Web UI unseres Dockers zu installieren.
    Wichtig! Es darf kein anderer Dienst auf Port 80 oder 443 laufen. Wenn ihr also OMV nutzt müsst ihr zuerst den Standard Port eures OMV ändern.


    [h1]Seperate Container [/h1]

    Um das Ganze etwas sicherer zu gewährleisten kann man Nginx auch in 2 seperarten Container arbeiten lassen...das ganze hat @SLiX vorgeschlagen und bedarf kaum mehr Arbeit...so würde es dann so aussehen:

    1) Es muss die Datei nginx.tmpl in einen Docker Container gemountet werden.

    Diese findet kopiert ihr mit Hilfe der Terminals an die Gewünschte stelle eures Systems :

    Code
    curl https://raw.githubusercontent.com/jwilder/nginx-proxy/master/nginx.tmpl > /path/to/nginx.tmpl


    /path/to/nginx.tmpl ersetzt ihr durch euren Systempfad. In meinem alten Beispiel wäre da etwa /data/nginx.tmpl


    Als nächstes holen wir uns den offiziellen Nginx Container

    Code
    $ docker run -d -p 80:80 -p 443:443 \
      --name nginx \
      -v /etc/nginx/conf.d  \
      -v /etc/nginx/vhost.d \
      -v /usr/share/nginx/html \
      -v /path/to/certs:/etc/nginx/certs:ro \
      --label com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy \
      nginx


    Auch hier sollte der Eintrag der Zertifikate zu eurem Systempfad angepasst werden /path/to/certs


    Als zweites starten wir den Proxy Container

    Code
    $ docker run -d \
      --name nginx-gen \
      --volumes-from nginx \
      -v /path/to/nginx.tmpl:/etc/docker-gen/templates/nginx.tmpl:ro \
      -v /var/run/docker.sock:/tmp/docker.sock:ro \
      --label com.github.jrcs.letsencrypt_nginx_proxy_companion.docker_gen \
      jwilder/docker-gen \
      -notify-sighup nginx -watch -wait 5s:30s /etc/docker-gen/templates/nginx.tmpl /etc/nginx/conf.d/default.conf


    Auch hier müssen wir nun den Pfad zu unserer nginx.tmpl angeben in dem wir path/to/nginx.tmpl ersetzen.

    Zuguterletzt der Letsencrypt Containert


    Code
    $ docker run -d \
      --name nginx-letsencrypt \
      --volumes-from nginx \
      -v /path/to/certs:/etc/nginx/certs:rw \
      -v /var/run/docker.sock:/var/run/docker.sock:ro \
      jrcs/letsencrypt-nginx-proxy-companion

    Hier wird nun ein letzes Mal der /path/to/certs durch den vorgegebenen Pfad ersetzt.


    Container die nun mit Letsencrypt gesichert werden sollen, müssen um folgendes ergänzt werden :

    Die Ergänzungen:

    VIRTUAL_PORT (Der Port den die Anwendung über den Proxy leiten soll, bei Containern die mehrere Ports nutzen zwingend notwendig).
    VIRTUAL_HOST (Der virtuelle Host des Proxy, zB. emby.meinedomain.com, dieser Eintrag ist immer notwendig auch wenn wir keine SSL Verschlüsselung nutzen)
    LETSENCRYPT_EMAIL (Die Email Adresse die für das Lets Encrypt Zertifikat genutzt werden soll, zwingend notwendig zum generieren)
    LETSENCRYPT_HOST (Die URL die für die SSL Verschlüsselung genutzt werden soll, zum Beispiel emby.meinedomain.com)

    Im Beispiel von Emby würde das dann so aussehen:

    VIRTUAL_PORT : 8096
    VIRTUAL_HOST : emby.meinedomain.com
    LETSENCRYPT_HOST: emby.meinefomain.com
    LETSENCRYPT_EMAIL: nevrion@nerds.de


    Das Ganze funktioniert auch mit Filebot, Omni und eigentlich allem was irgendwie über ein Webinterface aufrufbar ist. Ein weiterer Vorteil ist, ihr müsst nach außen nur die Ports 80/443 öffnen.

    5 Mal editiert, zuletzt von Nevrion (25. Juni 2018 um 15:01) aus folgendem Grund: Auf sicherere Version geupdatet.

  • Hammer..

    Habe OMV4 gerade erst neu aufgesetzt und das passt jetzt super rein.. Danke das du das teilst.. Werde ich umsetzen und bei "Problemen" melde ich mich..

    Meine Hardware

    NAS-->: G4560, 8GB, Gigabyte DS3H- WD Red OMV 4.x (latest)| TVHeadend 4.x.x (latest) | DD CineS2 V6. (+Oscam)
    Raspi 4 --> LibreElec (latest)
    Nvidia Shield 2017

  • Hab mal ein paar kleine Änderungen im Text gemacht (hauptsächlich zufällig zusammengeschriebene Wörter getrennt). Das macht es etwas leichter zu lesen :)

    Danke für das Hau-Zu!

    Sorry das ist mitten in der Nacht zustande gekommen :D


    Hi,

    könntest du auf die schnelle spezifizieren, was ich ändern muss, wenn ich das ohne letsencrypt und nur im lokalen Netzwerk machen will, ändern muss?

    Leider etwas schwierig, mit der Fritzbox hab ich das Problem gehabt dass ich DHCP deaktivieren müsste und zusätzlich nen DNS Server auf dem NAS installieren müsste ODER auf allen Clients die Host Fiiles anpassen muss, anders hab ichs jedenfalls nicht hinbekommen.

  • Also ich kann von jedem Rechner per Eingabe von "omv" auf meinen OMV-Server zugreifen.
    Gut, beim ersten Zugriff pro Rechner(/Browser?) muss ich http://omv eintippen, ab dann weiß die Kiste bescheid.

    Damit sollte es doch eigentlich klappen, oder?

    Wenn ich das ganze ohne Letsencrypt realisieren will, dann kann ich ja den Letsencrypt-Container weglassen und entsprechend die Befehle/Verzeichnisse/... beim ngnix-Container auch?

    Sehe ich das richtig, dass du für jeden "VirtualHost" einen neuen ngnix-Container startest?

    Zitat von root2

    Merke: Das "S" in "IoT" steht für Sicherheit!

  • Ich gehe mal davon aus dass du auch hinter ner Fritz.box hängst? Da ist die eigentlich URL ja dann omv.fritz.box auch wenn http://omv aufgelöst wird. Wenn du aber jetzt zb emby.omv auflösen willst weiß deine fritz.box nicht was sie damit anfangen soll deswegen bekommst du auch die unbekannte IP Meldung.

    Ohne Lets Encrypt fehlt dir weitehrin die Domain die irgendwo auflöst...wie gesagt ich hab das ganze Lokal versucht und bin gescheitert.

  • So habs ichs gestern extra nochmal versucht weil ich deinen Thread gesehen habe, bei mir hats nicht funktioniert und hat nicht aufgelöst... was ich noch gefunden habe ist dass man in der Fritzbox die Config sichert und dann via editor in der Config der IP des NAS eine eigene Domain zuweist und dann die Config zurück in die Fritzbox lädt..ob und wie gut das funktioniert kann ich nicht sagen.

  • So habs ichs gestern extra nochmal versucht weil ich deinen Thread gesehen habe, bei mir hats nicht funktioniert und hat nicht aufgelöst...

    Beziehst du dich hier auf die Eingabe von "omv", "omv.fritz.box" und "http://omv"?
    Zweiteres habe ich gerade vorhin nochmal versuchsweise ausprobiert: funktioniert, da löst wirklich die FritxBox die URL auf. Wie gesagt: wusste ich auch noch nicht, wertvolle Information.
    Ersteres hat wie bereits erwähnt bis jetzt nur funktioniert, wenn ich vorher bereits letzteres eingegeben habe.


    Sehe ich das richtig, dass du für jeden "VirtualHost" einen neuen ngnix-Container startest?

    Wie siehts damit aus?
    Wie siehst du die Chancen, dass ich bei Virtuallhost keine Subdomain eingebe, sondern ein Unterverzeichnis? Könnte das klappen? Also nicht "emby.meinedomain.com" sondern "http://omv.fritz.box/emby"?

    Zitat von root2

    Merke: Das "S" in "IoT" steht für Sicherheit!

  • Beziehst du dich hier auf die Eingabe von "omv", "omv.fritz.box" und "http://omv%22?Zweiteres habe ich gerade vorhin nochmal versuchsweise ausprobiert: funktioniert, da löst wirklich die FritxBox die URL auf. Wie gesagt: wusste ich auch noch nicht, wertvolle Information.
    Ersteres hat wie bereits erwähnt bis jetzt nur funktioniert, wenn ich vorher bereits letzteres eingegeben habe.

    Das liegt soweit ich das gelesen habe an den Browsern dass das vorher nicht geht.

    Wie siehts damit aus?Wie siehst du die Chancen, dass ich bei Virtuallhost keine Subdomain eingebe, sondern ein Unterverzeichnis? Könnte das klappen? Also nicht "emby.meinedomain.com" sondern "http://omv.fritz.box/emby"?

    Das hat in meinem Fall nicht funktioniert, ich probiere aber auch weiter dran rum...ich finds zwar ganz cool das ich alles aus dem Web erreichen kann aber nen paar Sachen würde ich auch gern lokal regeln ...wenn ich da irgendwie weiter komme meld ich mich aber zurück.

  • Ich habe jetzt gerade im OMV-NGINX-PlugIn einen Server erstellt. Namensbasiert, Servername http://omv.fritx.box/emby, Port 8099 (auf 80 hört noch OMV) und unter Zusätzliche Optionen:

    Code
    location ^~ / {
    proxy_pass http://127.0.0.1:8096;
    proxy_http_version 1.1;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_read_timeout 1d;
    }


    Damit leitet der Server jetzt auf emby um, aber leider egal ob ich omv:8099 oder omv:8099/emby eingebe, omv:8099/foo dagegen klappt nicht: "Unable to find the specified file.", wenn man ins html reinguckt um mit emby vergleicht, wird die wohl von emby ausgeliefert und nicht nginx.

    Ich werde demnächst mal gucken, was passiert wenn ich einen zweiten Server omv:8099/filebot anlege und entsprechend konfiguriere...

    Zitat von root2

    Merke: Das "S" in "IoT" steht für Sicherheit!

  • Klasse, danke dir vielmals.

    Wollte sowas letztens auch mal probieren und hatte dann nach n paar Minuten kein Bock mehr, jetzt kann ich einfach nach deinem Schriebs vorgehen :thumbup:

    NAS: Gehäuse: Jonsbo G3, Mainboard: MSI B460M PRO, CPU: Intel Pentium G6400, OS: OMV 6

    Client: NVIDIA Shield Pro 2019

  • Danke für die Anleitung, gibt es einen Grund, warum du nicht die Methode mit den "Seperate Containers" verwendest?

    Ich hätte noch eine Anmerkung:
    Wenn man das ganze nicht hinter einem Router betreibt sind die "alten" Ports weiterhin noch offen. Im Falle von Emby also z.B. 8096.
    Das ganze kann man verhindern, indem man den Zugriff auf den Container nur dem localhost erlaubt (der reverse proxy sollte ja in den meisten Fällen auch auf diesem Host laufen).
    Das ganze macht man wie folgt:

    Code
    --publish 8098:8096 \

    ändern zu:


    Code
    --publish 127.0.0.1:8098:8096 \


    Edit: das ganze macht nur Sinn, wenn der emby Server sich nicht in eurem lokalen Netz befindet, danke @Nevrion

    Einmal editiert, zuletzt von SLiX (13. Juli 2018 um 08:19)

  • Hi,
    ich bin bei meinem jetzt fündig geworden. Der Trick ist, NGINX nicht als Reverse-Proxy zu verwenden, sonder RewriteRules:


    Der Filebotcontainer verschluckt sich hierbei allerdings wohl intern. Mit anderen Diensten läuft dies allerdings ganz gut.
    Das OMV-Webinterface ist jetzt auf Port 9000 gelegt, NGINX hört auf Port 80. Ich werde wohl noch in soweit basteln, dass ich den OMV-Verweis in ein anderes Verzeichnis reinlege, und in das Stammverzeichnis eine Übersicht kommt.
    Ob ich die allerdings komplett zu Fuß in HTML anlege, oder mir z.B. ein PHP-Skript bastel, das etwa Guckt welche Grafiken in einem Unterverzeichnis sind (Vorschaubilder für die Dienste) und anhand deren Dateinamen dann den Link zusammenbastelt... das muss ich mir noch überlegen ;)

    Zitat von root2

    Merke: Das "S" in "IoT" steht für Sicherheit!

  • Hab da keinen wirklichen Mehrwert gesehen,wenns den gibt lass ich mich gern eines besseren belehren.


    In der Readme steht das dazu:

    Zitat


    Separate Containers
    nginx proxy can also be run as two separate containers using the jwilder/docker-genimage and the official nginx image.
    You may want to do this to prevent having the docker socket bound to a publicly exposed container service (avoid to mount the docker socket in the nginx exposed container). It's better in a security point of view.


    Security sollte jeder für sich selber abwägen, aber der Aufwand hält sich wirklich sehr in Grenzen :)

  • Ich muss also diese beiden Container so einrichten.. und dazu dann jeweils einen für jeden Dienst/Website etc ???!

    @Nevrion

    Meine Hardware

    NAS-->: G4560, 8GB, Gigabyte DS3H- WD Red OMV 4.x (latest)| TVHeadend 4.x.x (latest) | DD CineS2 V6. (+Oscam)
    Raspi 4 --> LibreElec (latest)
    Nvidia Shield 2017

    Einmal editiert, zuletzt von Ruschi (25. Juni 2018 um 09:42)

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!