Docker NGINX Proxyserver für mehrere Geräte.

Zalatschenko

Cadet 2nd Year
Registriert
Dez. 2019
Beiträge
24
Hallo zusammen :)

Bsp: Netzwerk mit 5 Geräten.
  • Alle Geräte sind in unterschiedlichen Netzen.
  • Auf allen Geräten läuft Docker mit jeweils unterschiedlichen Containern.
Gerät 1:
  • NGINX Frontproxy
  • Portainer
#EDIT:
Netzwerk ist managed (UNIFI)

Ich habe folgende Fragen, kann ich auf Gerät 1 einen NGINX Reverseproxy installieren und diesen bei den anderen geräten Nutzen?

Die gleiche Frage stellt sich mir bei z.B. Portainer. Es wäre schön wenn ich die einzelnen Portainer über ein Geräteübergreifendes Docker-Netzwerke verbinden könnte.

Ich habe mir bereits Docker Swarm angeschaut. Dort habe ich leider noch nicht ganz verstanden wo das img nach dem Push liegt bzw. wie ich den Pfad des Pushes ändere (Hierbei eventuell wichtig dass ich keine Container selber schreibe sondern nur jeweils das deploing per compose file anpasse). Jedoch bin ich mir nicht sicher ob das wirklich die Lösung ist.... Ich möchte ja eigentlich nicht das Repository teilen und bei jeder IP das gleiche sehen, sondern ein Netzwerk mit verschiedenen Docker Services auf unterschiedlichen Geräten teilen.

Kennt sich damit jemand aus?

Danke im voraus

Gruss
Zala
 
Zuletzt bearbeitet:
https://traefik.io/ ist als reverseproxy / router absolut brilliant.

Fuer Dockerswarm sehe ich bei dir keinen Usecase - Hier waere auch Kubernetes sehr viel weiter vorn.


Grundsaetzlich sieht ein setup mit reverseproxy so aus

docker run nextcloud -p 5678:80
-> Nextcloud ist im container auf port 80 erreichbar, aussen am container wird es auf 5678 verfuegbar gemacht

In der Nginx config dann
Code:
location / {
proxy_pass http://localhost:5678/;
}

daraufhin wird im container auf 5678 exposte dienst auf dem host durch den reverse proxy auf den dort konfigureirten Port geleitet und du kannst den auf dem gerat laufenden dienst aufrufen.

Wenn die gerate alle in unterschiedlichen Netzen sind brauchst du Routen zwischen den Netzen - kannst du mit einem hardware router oder mit traefik regeln.

Aber beschreib doch mal, was du in welchen netzen wo laufen haben willst. Gern mit buntem Bild :)
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Zalatschenko
traefik.io sieht auch sehr interessant aus. Muss ich mir mal genauer anschalten. Wobei das Wort Cloud mich abschreckt :D

Momentan hab ich ja bereits einen Reverseproxy. Diesen Push ich mittels:

Code:
version: '3.7'

services:
  frontproxy:
    restart: always
    image: jwilder/nginx-proxy:latest
    environment:
     - SSL_POLICY=Mozilla-Modern
    labels:
      - "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy"
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - "/var/run/docker.sock:/tmp/docker.sock:ro"
      - "#################################:/etc/nginx/certs:ro"
      - "/etc/nginx/vhost.d"
      - "/usr/share/nginx/html"
  nginx-letsencrypt-companion:
    restart: always
    image: jrcs/letsencrypt-nginx-proxy-companion:latest
    volumes:
      - "####################################:/etc/nginx/certs"
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
    volumes_from:
      - "frontproxy"

Anschliessend kann ich nach erstellung des Containers alle weiteren Container per:

Code:
version: '3.7'

services:
  <ein Container>:
    restart: always
    image: XXX
    networks:
      - frontproxy_default
      - default
    environment:
      - VIRTUAL_HOST=eincontainer.example.com
      - LETSENCRYPT_HOST=eincontainer.example.com
      - LETSENCRYPT_EMAIL=webmaster@example.com
networks:
  frontproxy_default:
    external: true

deployen kann. Und das Funktioniert top. Nun möchte ich eigentlich nur dass,

Code:
    networks:
      - frontproxy_default
      - default
Ergänzung ()

beim Netzwerk mittels IP auf z.B. 192.168.50 verwiesen wird.
Wieso ich das -default brauche weiss ich nicht mal genau :D beim Deployen wird auf jeden fall für jeden Container ein container.default netzwerk erstellt.

Das wilder image macht die nginx eintragungen selbst. Das ist ein grosser vorteil für mich. Wie gesagt ist das einrichten nicht das Problem. Das Problem ist dass ich nicht 5 nginx reverseproxys für jedes gerät möchte.
Ergänzung ()

Nun noch in Farbe. Beim Roten Fragezeichen bin ich mir nicht sicher ob sowas möglich ist da auf dem synology Server kein Docker läuft oder vorgesehen ist.

Nun zu den Bildern.
IST zustand:
IST.png


SOLL- Zustand (auf NGINX bezogen):
1609072557969.png
 
Zuletzt bearbeitet:
Sind das Fantasie-IPs oder was sollen die uns sagen?

Der nginx reverse proxy von jwilder richtet sich mehr oder weniger automatisch ein weil dieser lesenden Zugriff auf den Docker Socket bekommt. Betreibst du mehrere Docker-Nodes unabhängig voneinander, das dir alle Nachteile aber keine Vorteile bringt btw, müsste dein einzelner reverse proxy bei allen Nodes auf den Docker Socket lauschen. Das wiederum setzt voraus, dass du den Docker Socket auch von außerhalb von localhost erreichbar machen musst.

Long story short: Technisch ist es machbar aber absolut nicht sinnvoll. Entweder du gehst Richtung Swarm/Kubernetes.
Deutlich einfacher wäre es einfach auf jedem Docker Node einen reverse proxy laufen zu lassen für die dort ansässigen Dienste.

Für die zentrale Verwaltung installierst du auf einem Node Portainer und auf allen weiteren Nodes den Portainer Agent, so zumindest was ich in paar Minuten mit $Suchmaschine finden konnte. Damit hast ja jetzt einen Ansatzpunkt.
 
Sind das Fantasie-IPs oder was sollen die uns sagen?
Ja ist völlig aus der Luft gegriffen :)

Der nginx reverse proxy von jwilder richtet sich mehr oder weniger automatisch ein weil dieser lesenden Zugriff auf den Docker Socket bekommt. Betreibst du mehrere Docker-Nodes unabhängig voneinander, das dir alle Nachteile aber keine Vorteile bringt btw, müsste dein einzelner reverse proxy bei allen Nodes auf den Docker Socket lauschen. Das wiederum setzt voraus, dass du den Docker Socket auch von außerhalb von localhost erreichbar machen musst.

Long story short: Technisch ist es machbar aber absolut nicht sinnvoll. Entweder du gehst Richtung Swarm/Kubernetes.
Ja sowas hab ich mir auch schon überlegt. Obwohl ich dies über getrennte Netze und macvlan halbwegssicher lösen könnte gefällt mir ein solches Setup ebenfalls nicht.

Deutlich einfacher wäre es einfach auf jedem Docker Node einen reverse proxy laufen zu lassen für die dort ansässigen Dienste.
Ja das wird das Ende der Geschichte sein.

Für die zentrale Verwaltung installierst du auf einem Node Portainer und auf allen weiteren Nodes den Portainer Agent, so zumindest was ich in paar Minuten mit $Suchmaschine finden konnte. Damit hast ja jetzt einen Ansatzpunkt.
Ja alternativen gibt es. Hätte es nur Top gefunden wenn man eine Art Bridge Netzwerk zwischen den einzelnen Docker deffinieren könnte eine Art Site-to-Site VPN. Hab mir auch schon überlegt auf allen Geräten einen zusätzlichen OPENVPN Client zu installieren. Diese könnte man jeweils untereinander beliebig oft verbinden. Ausserdem wäre der Datenaustausch relativ sicher.
Habe es aber nicht auf diese Art versucht bis jetzt.


FAZIT: Werde wohl auf jeden Docker Container einen eigenen reverseproxy installieren.
Traefik.io sieht sehr interessant aus. Ebenfalls ist das deployen von neuen containern sehr ähnlich wie bei nginx von jwilder.
 
Zalatschenko schrieb:
Ja ist völlig aus der Luft gegriffen
Nicht hilfreich. Vor allem bei der Art der Anwendung oder nutzt du privat ein /8 Subnet? Ich denke nicht...

Zalatschenko schrieb:
Art Bridge Netzwerk zwischen den einzelnen Docker deffinieren könnte eine Art Site-to-Site VPN.
Genau so etwas wird eingerichtet bei Verwendung von Docker Swarm. Würde aber wenn nicht Openvpn verwenden sondern Wireguard oder direkt tinc-vpn, da dies für mesh-Vernetzung gedacht ist.

Die Lösung von jwilder ist nett, da man sich bei Webanwendungen die dahinter laufen sollen ggf. direkt den Webserver sparen kann und man direkt gewisse Härtungsmaßnahmen zentral abarbeiten kann.
Bei reinen Reverse-Proxies/Loadbalancern wie traefik.io ist es halt genau das: Ein Reverse-Proxy/Loadbalancer. Dafür brauchts für Zertifikate, Service Detection, etc nicht einzelne Container sondern wird bei traefik.io mitgeliefert. Hat eben alles seine Vor- und Nachteile.
 
  • Gefällt mir
Reaktionen: Zalatschenko
Nicht hilfreich. Vor allem bei der Art der Anwendung oder nutzt du privat ein /8 Subnet? Ich denke nicht...
Nun ja eigentlich schon also keine /8 sondern alles /20er und aufgrund der Nummerierung nehm ich immer die 10.1.32.0/20 und nummerier dann hoch (10.1 oder dann 20.1 bei VPN 30.1 bei Heimauto etc). Kann sein dass das ganze nicht so schlau ist (aus gründen die ich nicht kenne) aber für mich funktioniert es. Tut mir Leid wenn es verwirrend war.

EDIT: Ja ich habe viele Tote IP's dazwischen. Aber ist ja nicht so dass ich dadurch engpässe bekähme 😅

Genau so etwas wird eingerichtet bei Verwendung von Docker Swarm. Würde aber wenn nicht Openvpn verwenden sondern Wireguard oder direkt tinc-vpn, da dies für mesh-Vernetzung gedacht ist.
Oh. Ok dann wäre ja das genau das was ich zu beginn suchte :D Muss mir Swarm mal ansehen. Wobei ich gerade was ineressantes gefunden habe. Darauf komm ich später zurück.

Die Lösung von jwilder ist nett, da man sich bei Webanwendungen die dahinter laufen sollen ggf. direkt den Webserver sparen kann und man direkt gewisse Härtungsmaßnahmen zentral abarbeiten kann.
Bei reinen Reverse-Proxies/Loadbalancern wie traefik.io ist es halt genau das: Ein Reverse-Proxy/Loadbalancer. Dafür brauchts für Zertifikate, Service Detection, etc nicht einzelne Container sondern wird bei traefik.io mitgeliefert. Hat eben alles seine Vor- und Nachteile.
Als Leie suche ich natürlich etwas möglichst einfaches. Desshalb hab ich mir nun mal traefik angeschaut.

Ich habe es hinbekommen den traefik in betrieb zu nehmen inkl. Dashboard und den statischen und dynamischen .toml files. (Hierbei habe ich 0 verstanden wieso dynamisch und statisch getrennt oder was das überhaupt macht. xD Hauptsache es läuft alles. Leider sind im Netz momentan viele gemische von Syntax V1 und V2 unterwegs. Hab aber nicht getestet ob ein V1 File automatisch in V2 umgewandelt wird beim Start (Achtung hier gehts nur um die config files. Traefik selbst ist glaubs schon über V3.2).

Ich kann nur die online- Doku empfehlen. Selbst ich als eigentliche "rubber duck" konnte es zum laufen bringen. (Ebenfalls kann ich hierbei Google nicht empfehlen. Traefix gibt auf Github keine Hilfestellung. Sie verweisen auf ihr Comunity Forum inwelchem man dann auch über die Seiteninterne Suche auf die Lösungen trifft.)

Nun habe ich heute zufällig noch folgendes gesehen:
in diesem Tutorial vom Oktober 2020 wird erklärt wie man weitere Dienste welche auf einem externen Host laufen z.B. einem Raspberry ebenfalls einbinden kann.

Ich werde nochmal bescheidgeben aber so wie es aussieht kann ich nun alle meine Wünsche ohne Swarm (Woraus ich noch nicht ganz schlau wurde) umsetzen :)


PS: WIe ist das hier im Forum? Soll ich die Beispielseinrichtung von Traefik hier mal teilen oder hat das dann nichts mehr mit dem Thema zu tun?
 
Zuletzt bearbeitet:
Zalatschenko schrieb:
/20er und aufgrund der Nummerierung nehm ich immer die 10.1.32.0/20 und nummerier dann hoch (10.1 oder dann 20.1 bei VPN 30.1 bei Heimauto etc). Kann sein dass das ganze nicht so schlau ist (aus gründen die ich nicht kenne) aber für mich funktioniert es. Tut mir Leid wenn es verwirrend war.
10.1.32.0/20 erlaubt IPs von 10.1.32.1 bis 10.1.47.254. Bist du dir wirklich sicher, dass du pro Subnetz 4094 IP-Adressen brauchst? Ja, es funktioniert aber es erzeugt unnötig hohen Broadcast-Traffic.
Deine Zählweise ist nicht eindeutig oder zählst du wirklich jeweils im allerersten Oktet hoch? Falls ja wäre das ziemlich dämlich denn dann verwendest du IP-Adressbereiche die für das Internet vorgesehen sind. Das Ergebnis wäre für dich, dass du Teile des Internets nicht mehr erreichst weil dein Router denkt das wären interne Adressen bei dir. Bitte informiere dich über die privat nutzbaren IP-Adressbereiche und verwende diese.
 
Ja, es funktioniert aber es erzeugt unnötig hohen Broadcast-Traffic.
Das ist genau das was ich mit (aus gründen die ich nicht kenne meinte) :( . Was bedeutet das? Merck ich das bei der Nutzung durch packetverlust oder ping? Oder wird einfach mehr unnötig berechnet und energie verschwendet?
Ne also nicht komplett im Oktet. Ich habe 10.x.32.0, 20.x.32.0 und 30.x.32.0 Netze. Damit habe ich 3 x 255 x 4094 IP's das sollte für immer reichen... 🤣🤦‍♂️

Und ja du hast völlig recht. Hab ich aber erst jetzt wiedermal gemacht.... Werde mich wohl auf die 10.x.32.0/20 beschränken sind ja immernoch 255 x 4096 IP's.
Dachte irgendwie dass die 20. und 30 auch noch Privat sind.... Werde das heute noch anpassen.... Groober schnitzer. Danke dass du es nicht einfach überlesen hast xD
 
Zalatschenko schrieb:
Nutzung durch packetverlust oder ping
Schlicht und ergreifend durch Nichterreichbarkeit.

Stell dir vor, der Server von Computerbase.de hätte die IP 20.1.32.150.
Du willst jetzt also auf computerbase.de etwas lesen oder im Forum posten. Du tippst die Adresse im Browser ein, dein Browser kann mit Namen nur begrenzt was anfragen und schickt eine DNS-Abfrage los, die geht Richtung Internet und als Antwort kommt zurück: computerbase.de hat die 20.1.32.150. Dein Browser schickt also jetzt Datenpakete an diese IP mit dem Inhalt doch bitte die Webseite computerbase.de auszuliefern.
Dein Router bekommt diese Datenpakete und schaut in seine Routingtabelle und da steht unter anderem drin, dass das Subnetz 20.1.32.0/20 ja an einem seiner lokalen Interfaces anliegt und die Adresse gehört in dieses Subnetz. Also gehen die Pakete in dieses lokale bei dir verwendete Subnetz anstatt Richtung Internet zum eigentlichen Empfänger.
Ergebnis der Geschichte: du kannst computerbase.de nur noch am Handy aufrufen aber nur wenn das WLAN aus ist und machst dann darüber nen Hilfe-Hilfe-mimimi-Thread auf weil du irgendwas zusammen gepfuscht hast.
Netzwerke sind komplex und die Lernkurve ist steil und das bisschen was der durchschnittliche Haushalt mit einer Fritzbox oder vergleichbarem "Router" zuhause verwendet sind vielleicht 1,5%.
 
Super Erklärung! Ja das mit dem 20er Netz bzw. was passiert wenn man intern Netze mit öffentlichen IP's deffiniert ist mir klar.
Ich wollte mich auf:
10.1.32.0/20 erlaubt IPs von 10.1.32.1 bis 10.1.47.254. Bist du dir wirklich sicher, dass du pro Subnetz 4094 IP-Adressen brauchst? Ja, es funktioniert aber es erzeugt unnötig hohen Broadcast-Traffic.
beziehen. Ich verstand es so dass Subnetze mit 4094 IP's einen hohen Broadcast traffic verursachen. Unabhängig ob es jetzt ein privater oder öffentlicher IP bereich ist.
Broadcast ist meiner meinung nach ja das verteilen eines packetes an alle IP's eines Subnetzes. Hierbei ist eigentlich logisch dass bei einem /24 Netz natürlich viel weniger IP's vorhanden sind an welche die Anfrage versucht wird.
Hoffe das verstehe ich soweit richtig.

Nun dachte ich zumindest dass mein UNIFI Netzwerk so "stark" ist, dass es auch mehrere /20 Netze inkl. Broadcasting oder (was ich auch mal einrichten wollte, aber nicht sicher bin ob das sogar das selbe ist bzw. scheint es eine untergruppe zu sein) igmp-multibroadcast unter gewissen Netzen, ermöglicht bzw. verarbeiten kann. Ebenfalls dachte ich dass beim Broadcasten die Packete nur an im Netz angemeldete IP's gesendet wird.

Ist das ein Trugschluss und diese Netzgrössen überfordern die Hardware?

Sorry dass das ganze ein wenig ausartet...
 
Das hat weniger was mit der Hardware an sich zu tun aber du müllst dir mir Ansage dein Netzwerk zu.
Nutze eine Suchmaschine und schau dir ein paar Ergebnisse zu "issues with large broadcast domains" oder "big broadcast issues" an und entscheide dann ob du weiter /20 verwenden willst.
Einen wirklichen Grund für so große Subnetze habe ich bisher nicht wirklich gesehen...
 
Zurück
Oben