Dienste im Heimnetzwerk mit domain/subdomain erreichbar machen, statt per IP

  • Hallo,


    Ich habe in meinem Heimnetzwerk eine Raspberry Pi hinter der FB laufen, auf dem div. Docker Container laufen, u.a. AdGuard, Homeassistant etc. Bisher werden die Dienste alle mit IP:Port aufgerufen.


    Gibt es die Möglichkeit die Dienste mit Domain / Subdomain (z.b. ene die hier bei NC liegt) aufzurufen, ohne dafür die Firewall zu öffnen und ohne im Browser Zertifikatsfehler zu erhalten?


    Danke

  • Moin,

    ansich kannst du für deine Domain einfach weitere Records mit der internen IP einrichten. Dafür musst du nichts freigeben und nur Leute aus deinem Netzwerk können damit was anfangen.

    Damit du nicht immer den Port angeben musst würde es sich ggf. empfehlen einen zentralen Loadbalancer z.b. Traefik (da du schon Docker nutzt?) oder z.B. NGINX einzurichten und dann alle Subdomains auf die interne IP von diesem Server zeigen zu lassen.

    Wenn du eine öffentlich verfügbare Domain, die dir gehört nutzen willst, kannst du sogar über LetsEncrypt mittels DNS Auth ein echtes SSL-Zertifikat für deine internen Dienste holen.

    Alternativ würde sich anbieten, dass du eine eigene selbstsignierte Root-Zertifizierungsstelle erstellst (da gibt es auch ziemlich viele OpenSource Tools mit (Web)-GUI) und die selbsterstellten Zertifikate für deine Dienste darüber signierst. Dann musst du nur das Root Zertifikat als "vertrauenswürdige Stammzertifizierungsstelle" auf all deine Geräte ausliefern und nicht jedes Zertifikat, um die Warnungen zu unterdrücken.

  • Also ansich müsstest du nur im NPM-Webinterface ein neues Zertifikat erstellen und das Häkchen bei "Use DNS Challenge" setzen & deinen DNS Provider auswählen.

    Jetzt musst du dich nur noch entscheiden, ob du lieber ein Zertifikat pro Dienst, mehrere Dienste pro Zertifikat oder ein Wildcard SSL Zertifikat nutzen willst.

    Wenn du nicht willst, dass andere herausfinden wie deine Dienste so heißen oder welche Dienste du so hast würde es sich anbieten ein Wildcard Zertifikat zu nutzen "*.example.com". Dann sehen andere auf z.b. https://crt.sh/ nur *.example.com und nicht "meingeheimerservice.example.com".

    Wildcards kommen halt mit dem Vor/Nachteil, dass du das gleiche Zertifikat für alle Dienste in einem Level nutzen kannst.
    Auf Servern im Internet würde ich das nicht unbedingt mehr machen.

    Sobald das Zertifikat ausgestellt wurde, gehst du zu deinem Proxy Host und trägst das Zertifikat im "SSL" Tab ein.

    Das wars eigentlich schon.


    pasted-from-clipboard.png

  • Habe so ungefähr das Setup bei mir aufgesetzt, das @abdc beschrieben hat:

    1. "Subdomains" über A-Records auf die lokale IP eingetragen

    2. Reverse-Proxy mit DNS-Challenge konfiguriert

    3. Rebind-Schutz für Subdomains ausgeschaltet

    Funktioniert bei mir insgesamt sehr gut.


    1. Ich nutze dafür eine gesonderte Domain. Unter dieser Domains lege ich Subdomains mittels A-Records an. Habe mich auf A-Records beschränkt, weil ich für AAAA-Records entweder Link-Lokale IPv6-Adressen oder DynDNS einsetzen müsste. Mein Internetprovider weist mir kein fixes IPv6-Subnet zu. Das geht soweit alles mit dem Netcup-DNS-Server.


    2. Ich setze Caddy als Reverse-Proxy ein, aber das funktioniert vmtl. auch mit Traefik. Beide können automatisch Zertifikate über Let's Encrypt anfordern. Für Netcup gibt es ein Caddy-Plugin, das einem mit ein paar Angaben die DNS-Challenge für Let's Encrypt erledigt. Ich hatte allerdings das gleiche Problem wie in der README des Plugins bei mir festgestellt: Die DNS-Server übernehmen Änderungen teilweise sehr langsam. Ich nutze deshalb einen anderen DNS-Server. Mit dem beschriebenen Workaround sollte es aber auch mit den DNS-Servern von Netcup funktionieren.


    3. Ich nutze den DNS-Resolver der FritzBox im lokalen Netz. Dieser filtert Antworten der Namensauflösung, wenn diese auf interne IP-Adressen zeigen. Man kann die entsprechenden Hostnames dort einfach eintragen und hat damit dann keine Probleme mehr. Wenn ein anderer DNS-Resolver verwendet wird, ist das ggf. nicht notwendig.

  • Super vielen Dank. Euch beide. Glaube die Anleitung von Notthebe habe ich soweit verstanden... Bis auf die Sache mit den DNS Einträgen. Also ich hab eine öffetnliche Domain die hier bei NC liegt.

    Was trage ich wo ein, wenn ich Wildcard Certs nutzen willen? Warum die lokale IP eintragen? Da meine Firewall doch zu bleibt, wie soll die die lokale IP von extern gefunden werden? Stehe vermutlich auf dem Schlauch

  • Also wenn du ein WIldcard Zertifikat nutzen willst, musst du nur "*.example.com" bei NPM im SSL Zertifikat eingeben. Im DNS musst du eigentlich nichts anders machen.

    Ganz stark vereinfacht ist die Domain ja nur ein Alias für eine IP. Wenn du die Domain auf eine interne Adresse auflösen lässt, kann zwar jeder sehen das "meinservice.example.com" auf "10.1.1.1" läuft aber nicht darauf zugreifen. Geräte aus deinem Netzwerk die eh schon auf 10.1.1.1 zugreifen können, können jedoch über die Domain auf den Service zugreifen.

    Also trägst du z.b. bei Netcup im DNS nen neuen A Record ein mit "meinservice" und "10.1.1.1" und sobald ein Gerät aus deinem Netzwerk auf meinservice.example.com geht landet er intern auf 10.1.1.1.

    Wenn du auch nicht willst, dass andere die Domain außerhalb auflösen können kannst du es ja wie nebula76 machen und die Subdomains im lokalen DNS Resolver eintragen. Dann können nur Geräte die Subdomain auflösen, die in deinem Netzwerk sind und deine FB als Nameserver nutzen.

  • OK, sorry, aber ganz checke ich es glaube ich immer noch nicht.

    1. *.example.de im NPM eingeben => verstanden

    2. Im NC DNS für jede subdmomain die ich habe will einen Eintrag auf die lokale IP setzen.

    3. Nein, ich will nicht, dass andere die Domain von außen Auflösen können. Mein DNS Resolver ist der Adguard. Dort dan Einträge setzen? Bleibt dann Punkt 2, trotzdem erhalten?

  • Wenn du auch nicht willst, dass andere die Domain außerhalb auflösen können kannst du es ja wie nebula76 machen und die Subdomains im lokalen DNS Resolver eintragen. Dann können nur Geräte die Subdomain auflösen, die in deinem Netzwerk sind und deine FB als Nameserver nutzen.

    Kleine Korrektur dazu: Ich habe in der FritzBox nur den Rebind-Schutz für die entsprechenden Hostnames deaktiviert, damit die FritzBox die gefundenen A-Records des externen DNS-Servers an die Anfrager im Netzwerk zurück gibt. Gehen wir mal davon aus, dass ich den Netcup-DNS nutzen würde. Dann sähe das Setup so aus:

    Netcup Nameserver:

    A-Record, 10.0.0.2, service.local.example.org

    FritzBox:

    Namensauflösung über DNS vom ISP
    Rebind-Schutz für service.local.example.org deaktiviert


    3. Nein, ich will nicht, dass andere die Domain von außen Auflösen können. Mein DNS Resolver ist der Adguard. Dort dan Einträge setzen? Bleibt dann Punkt 2, trotzdem erhalten?

    Nur um sicher zu gehen: Willst du, dass andere die Domain nicht auflösen können oder möchtest du, dass andere den Service hinter der Domain nicht erreichen können? Das macht einen Unterschied.


    Solange du keine Ports in der Firewall öffnest oder sonst etwas aktiv dafür tust, erreicht niemand von außen deine lokal betriebenen Dienste. D.h. Außenstehende können wissen, dass unter einer lokalen IP ein Dienst läuft, diese Information aber nicht ohne Zugang in dein lokales Netzwerk nutzen.


    Wenn du nicht möchtest, dass andere deine Domain auflösen können, darfst du 2 aus deinem Post nicht durchführen. Dann musst die diese Einträge statt dessen in deinem Adguard vornehmen.


    Da du sowieso schon lokal Adguard betreibst, sehe ich keinen Vorteil, die Einträge im Netcup-DNS statt in Adguard zu setzen. Die DNS-Challenge für Let's Encrypt funktioniert unabhängig von diesen Einträgen, d.h. du erhältst trotzdem ein gültiges Zertifikat.

  • Danke für die Antwort. Nein, ich will nicht, dass andere von extern meinen Namen auflösen können.


    Sollte das dann mit der Domain funktionieren, kann ich ja mit AdGuard dann auch DNS over TLS nutzen, was bisher ja nicht ging, da für IP Adressen ja keine Zertifikate generiert werden….