Lokale Zugriffe auf Docker Container vereinfachen (DNS, Proxy)


Helmi

Recommended Posts

Tach zusammen,

 

ich hatte in der Vergangenheit auf der Syno bereits rund 7-8 Docker container laufen - alle auf der gleichen IP und entsprechend unterschiedlichen Ports. Vor allem beim Containern die man seltener benutzt vergisst man schon gerne mal die ausgefallen Portfolge und auch sonst ist das (z.B. für lokale Mitbenutzer des Netzwerks) nicht sonderlich zugänglich.


Nicht nur weil mit dem Unraid-Server auch die Komplexität der Angelegenheit zunimmt, will ich das etwas vereinfachen und auch besser strukturieren.

 

Strukturieren heißt nach Möglichkeit verschiedene Themen auch auf verschiedene IP-Adressen verteilen (Es gibt im Unraid-Server nur ein NIC).

 

Das ist jetzt zwar nicht unbedingt nötigt, würde mir aber gut taugen.

 

Was ich noch nicht rausgefunden habe: Gibt es die Möglichkeit custom Bridge networks in Docker (also über docker create network...) eine eigene Host-IP zuzuweisen? 


Der Plan wäre sowas wie:

 

- Unraid Main IP: 10.10.50.30 (Port 80 führt zum Unraid Interface)

- proxy-bridge: 10.10.50.31 - mit u.a. nginx-proxy auf Port 80

- smarthome-bridge: 10.10.50.32 - mqtt, node-red, grafana,etc.

- media-bridge: 10.10.50.32 - plex,....

- xyz-bridge....

 

Also ein Bridge-Network pro Thema mit jeweils einer Host-IP bei denen sich freigegebene Ports nicht gegenseitig kreuzen(?). Wenn ich den Cross-Network-Access in Docker richtig verstanden habe, sollten die Bridge-Networks in der Lage sein untereinander zu sprechen, was ja z.B. nicht möglich wäre, würde ich die IP für den Nginx-Proxy custom vergeben an br0 (bereits getestet und geflucht).

 

Ich könnte mir natürlich auch das Leben vereinfachen und mir einfach eine Übersichtsseite mit Links zu verschiedenen Services basteln, aber das scheint mir gerade viel zu banal. LOL


Wie macht ihr das denn?

 

 

 

Link to comment
49 minutes ago, Helmi said:

Gibt es die Möglichkeit custom Bridge networks in Docker (also über docker create network...) eine eigene Host-IP zuzuweisen? 

Genau dafür wäre das br0 Netzwerk da. Allerdings gilt das als problematisch, wenn auch VMs in dem Netzwerk unterwegs sind (mögliche Serverabstürze). Ab Unraid 6.10 kann man aber in den Docker-Einstellungen auf "ipvlan" umstellen. Dann soll das kein Problem mehr darstellen.

 

Statt IPs nutze ich übrigens Subdomains. zB:

https://unificontroller.example.com/

https://nginxproxymanager.example.com/

 

Die werden von NPM auf den Port des Containers weitergeleitet, also in dem Fall 8443:

image.png.f9b954127804561911a44dbb411d3cfa.png

 

Von außen kann keiner die Domains öffnen, weil ich in NPM diese Advanced Regel ergänzt habe, die ausschließlich einen lokalen Zugriff erlaubt:

# allow anyone in 192.168.178.0/24
allow 192.168.178.0/24;
# drop rest of the world
deny all;

 

Das einzige was von außen erlaubt ist, ist der Unterordner zur Verifikation von SSL Zertifikaten:

https://unifi.example.com/.well-known/acme-challenge/

 

Dazu braucht es aber keine extra Einstellung, weil das eine Grundregel in NPM ist.

Link to comment

Das mit den Subdomains hab ich tatsächlich auch so vor. Externer Zugriff ist erstmal gar nicht vorgesehen, aber gut das schonmal im Kopf zu haben.

 

Die Aufteilung in IPs ist daher natürlich auch nicht wirklich nötig, aber wie oben geschrieben eben nice to have.


Darf ich fragen wie du DNS bei dir organisierst? Hast du einen lokalen DNS laufen der das mapping macht?


Hier läuft ein pihole und sonst kein DNS lokal (abgesehen von dem was Unifi selbst an DNS macht) und ich frag mich ob mich die local DNS option von pihole alleine auf Dauer glücklich macht. Schon allein die fehlenden Wildcards nerven da etwas.

 

 

Link to comment

Ich betreibe (noch) keinen lokalen DNS Server.

 

Ich muss aber was korrigieren:

1 hour ago, mgutt said:

Das einzige was von außen erlaubt ist, ist der Unterordner zur Verifikation von SSL Zertifikaten:

https://unifi.example.com/.well-known/acme-challenge/

Bei mir haben alle Subdomains im DNS die lokale IP des Servers stehen:

396485809_2021-08-3017_35_46.png.49f14eae2a216b4d87c57bc9f39409ab.png

 

Dadurch kann Let's Encrypt den Server nicht erreichen, um das SSL Zertifikat zu aktivieren / erneuern.

 

Ich hatte schon mal die öffentliche IP hinterlegt, aber dann blockt diese Regel wirklich alle Zugriffe:

# allow anyone in 192.168.178.0/24
allow 192.168.178.0/24;
# drop rest of the world
deny all;

 

Das liegt daran, dass wenn die Domain eine lokale IP im DNS stehen hat, dass die Fritz!Box dann einen NAT Loopback macht und der eigentlich lokale Zugriff kommt dann von der öffentlichen IP meines Internetanschlusses. Daher funktioniert dann auch keine Erneuerung des SSL Zertifikates. Ich muss dafür erst der Domain wieder kurz die öffentliche IP zuweisen (also alle 3 Monate).

 

Tatsächlich könnte ich genau das Problem lösen, in dem ich der Domain eine öffentliche IP gebe und lokal über einen lokalen DNS Server der Domain die lokale IP zuweise, was ja mit pihole ziemlich einfach möglich wäre:

https://blog.unixweb.de/pi-hole-als-dns-server-fuer-lokale-ip-adressen/

 

Ich überlege immer noch wie ich das vielleicht doch ohne hinbekomme.

Link to comment

Nur damit ich das richtig verstehe: Der Public DNS für deine Domain (Der Screenshot sieht nach All-inkl aus? und example.com hast du da vermutlich aus privacy-Gründen reingetackert?) trägt deine lokalen IPs damit deine lokalen Aufrufe (über den Public DNS) richtig auflösen? Netter Stunt ;-)

 

Das mit PiHole stimmt zwar, aber es gehen halt leider keine Wildcards - das heißt du musst jede Subdomain extra eintragen.

 

Nebenbei: Das mit den .local-Adressen im verlinkten Blogpost ist wohl auch nicht mehr so ganz einfach. Davon wird fast überall abgeraten weil einem das wohl spätestens in der Kombination mit Apple-Geräten um die Ohren fliegt.

 

Aber was anderes: Deine Docker-Container laufen alle in einem Bridge-Network? Wie hast du das denn mit :80 gelöst? Hast du das Unraid-Interface umgebogen oder läuft das über einen zweiten NIC? Sonst conflicted das doch mit dem NPM, oder?

Link to comment
1 hour ago, Helmi said:

Hast du das Unraid-Interface umgebogen

Korrekt. unRAID läuft auf 5000/5001. In NPM ist dann ein redirect von tower auf tower:5000 drin. Wobei ich da jetzt auch unraid.example.com machen könnte.

 

1 hour ago, Helmi said:

trägt deine lokalen IPs damit deine lokalen Aufrufe (über den Public DNS) richtig auflösen?

Korrekt. Es ist ja nicht vorgeschrieben, dass eine Domain eine öffentliche IP haben muss.

Link to comment
7 hours ago, Helmi said:

Wie macht ihr das denn?

 

da ich keine Probleme mit macvlan habe, Beispiel alles auf custom:br0 (ipvlan war sehr problematisch hier, Fritzbox ...)

 

image.thumb.png.0091f6e9758bbf350e39da8d4d621ebd.png

 

wenn du cross over machen willst bridge mit custom dass die miteinander können, dann kannst du auch mixen ... die Einstellung dann auf enabled setzen.

 

image.thumb.png.ff452f979c453fbaa4fa5397f11032fd.png

 

da ich es auch ab und an bequem mag (auch wenn es banal ist)

 

image.thumb.png.8dfc6976a7029c83844834d3ce49988a.png

  • Like 1
Link to comment

Danke für den Input. Ja, das mit dem Host access for custom networks wusste ich eigentlich schon, hab ich aber irgendwie verdrängt. Das löst in der Tat einen Teil des Problems. Dennoch würde ich gerne ein custom bridge network auf eine andere IP legen. Also statt einzelnem Container auf eine einzelne IP nochmal ein Bridge-Network.

 

Hat jemand ne Ahnung wie das funktionieren könnte? Beim ipvlan bin ich mir noch unsicher was es mir wirklich bringen würde, ich hab auch erstmal macvlan gelassen für custom:br0.

Link to comment

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.