Domain und HTTPS im lokalen Netzwerk mit Home Assistant und Caddy

Die IP-Adresse in den Browser eingeben, um auf das Synology NAS oder Home Assistant zuzugreifen, macht nur bedingt Spaß. Oft muss man sich eine Kombination aus lokaler IP-Adresse und Port merken. Zwar merkt sich der Browser die Eingabe oder man könnte sich ein Lesezeichen hinterlegen, jedoch ist eine Domain, die mit HTTPS läuft, sehr viel schöner und man kennt das Prinzip aus dem Internet.

Eine Variante, um Domains im lokalen Netzwerk mit HTTPS zu nutzen, ist die Verwendung von einem Reverse Proxy. Da neben der Domain der lokale Dienst auch gleich mit HTTPS ausgestattet werden soll, bietet sich Caddy sehr gut dafür an. Caddy ist ein Webserver, der dafür alles mitbringt.

Caddy und Let’s Encrypt

Damit man ein HTTPS Zertifikat für eine Domain über Let’s Encrypt bekommt, muss Let’s Encrypt überprüfen können, dass man der Eigentümer der Domain ist. Bei der HTTP-Challenge müsste man einen Port im Router aufmachen, jedoch bin ich davon kein großer Fan und versuche es immer zu vermeiden. Als Alternative dazu gibt es die DNS-Challenge, bei der kein Port geöffnet werden muss. Es gibt dann aber eine andere Hürde. Damit Caddy automatisiert über die DNS-Challenge ein HTTPS-Zertifikat anfragen kann, benötigt es eine API, um den DNS-Eintrag zu setzen, der für die Validierung notwendig ist.

Dafür nutze ich die DNS-Console von Hetzner. Die Domain selber muss dafür nicht zwingend bei Hetzner liegen. In meinem Fall liegt die Domain bei INWX und ich habe die Nameservers angepasst und somit kann die Domain durch die Hetzner DNS-Console verwaltet werden. INWX bietet zwar auch eine API an, diese ist jedoch nicht zu empfehlen und man müsste auf 2FA bei INWX verzichten, da die API keine extra API-Keys unterstützt und man die normalen Anmeldedaten nutzt.

Da der Zugriff auf die Domains doch besonders schützenswert ist, möchte ich nicht auf 2FA beim IWNX Account verzichten und übergebe die Verwaltung der Domain an Hetzner, die eine API mit eigenen API-Keys anbieten.

Es muss an der Stelle natürlich nicht Hetzner sein, Caddy unterstützt noch eine ganze Reihe andere DNS-Provider.

Caddy als Home Assistant Add-on

Da der Raspberry Pi mit Home Assistant 24/7 in meinem Netzwerk erreichbar ist, bietet es sich natürlich an Caddy auch auf diesem System einzurichten. Dafür muss das Caddy 2 Add-on installiert werden.

Für die Installation muss ein neues Repository in Home Assistant hinzugefügt werden:

https://github.com/einschmidt/hassio-addons

Falls du noch nicht weißt, wie das in Home Assistant funktioniert, kannst du dies in der Dokumentation von Home Assistant nachlesen.

Bevor das Caddy 2 Add-on gestartet werden kann, müssen noch zwei Dateien angelegt werden. Caddy unterstützt einige DNS-Provider, jedoch muss man für diese Unterstützung eine eigene Caddy-Binary nutzen. Diese Datei wird dann über Samba share unter /share/caddy/caddy abgelegt.

Die passende Caddy-Binary lässt sich einfach über die Caddy-Website downloaden. Nutzt du die 64 Bit Version von Home Assistant, wählst du oben rechts unter Platform Linux arm64 aus. Über die Suche suchst du nach deinem DNS-Provider, in meinem Fall wäre das Hetzner. Wähle das Plugin aus und lade dir Caddy herunter. Wenn dir dieser Weg zu einfach ist, kannst du natürlich auch Caddy selber bauen.

Im gleichen Ordner legst du dir dann noch eine /share/caddy/Caddyfile an. Darin werden jetzt alle Dienste definiert, die unter deiner Domain erreichbar sein sollen.

{
    email <E_MAIL>
    acme_dns hetzner <API_TOKEN>
}

homeassistant.example.org {
    reverse_proxy localhost:8123
}

nas.example.org {
    reverse_proxy 192.168.0.10:5001 {
        transport http {
            tls
            tls_insecure_skip_verify
        }
    }
}

syncthing.example.org {
    reverse_proxy 192.168.0.10:8384 {
        transport http {
            tls
            tls_insecure_skip_verify
        }
    }
}

Im oberen Teil wird Caddy allgemein konfiguriert. Die E-Mail-Adresse wird von Let’s Encrypt benötigt. Darüber wirst du z.B. informiert, wenn es Probleme mit dem Zertifikat gibt. Den Platzhalter <API_TOKEN> musst du mit deinem API-Token ersetzen, den du dir in der Hetzner DNS-Console erzeugt hast.

Die Konfiguration für den Reverse Proxy sollte selbsterklärend sein. Weitere Informationen dazu findest du in der Caddy Dokumentation.

Der Abschnitt transport http sorgt dafür, dass die Anfragen von Caddy dann auch wieder über HTTPS gemacht werden. Da vom Synology-NAS oder auch von Syncthing ein selbstsigniertes Zertifikat genutzt wird, wird die Verifikation übersprungen.

Nachdem die Caddy-Binary und das Caddyfile angelegt ist, kann das Add-on gestartet werden. Nach dem Starten schaust du in die Logs und überprüfst, ob die Erstellung der HTTPS-Zertifikate erfolgreich war.

Home Assistant über einen Reverse Proxy aufrufen

Damit Home Assistant Anfragen über den Reverse Proxy zulässt, muss dies in der Konfigurations-Datei hinterlegt werden.

http:
  use_x_forwarded_for: true
  trusted_proxies:
    - 127.0.0.1
    - ::1
    - 172.30.33.0/24

Mehr dazu in der Home Assistant Dokumentation

DNS

Zu einer Domain gehört natürlich auch immer eine IP-Adresse. Die IP-Adresse kann entweder direkt beim DNS-Provider hinterlegt werden oder du überschreibst die IP-Adresse zu einer Domain in deinem lokalen Netzwerk. Sowas ist zum Beispiel möglich, wenn du AdGuard einsetzt, der alle DNS-Anfragen aus deinem Netzwerk verarbeitet und dann eine Antwort auf eine Domain geben kann, die so nicht beim DNS-Provider hinterlegt ist.

Alternativ hinterlegst du einfach die lokale IP-Adresse in der Hetzner DNS-Console und deine Geräte machen eine normale DNS-Abfrage und bekommen deine lokale IP-Adresse als Antwort.

DNS-Rebind-Schutz

Du hast es fast geschafft. Wenn dein Router deine DNS-Anfragen verarbeitet und einen aktivierten DNS-Rebind-Schutz hat, musst du die Domain im Route hinterlegen. Bei einer Fritz!Box ist das zum Beispiel der Fall.

Der DNS-Rebind-Schutz verhindert, dass eine Domain auf eine lokale IP-Adresse zeigen darf. Da du dies aber genau möchtest, muss deine Domain erlaubt werden.

Unter Netzwerk > Netzwerkeinstellungen > DNS-Rebind-Schutz kannst du deine Domain hinterlegen, damit diese nicht von der Fritz!Box blockiert wird.

Es kann etwas dauert bis diese Anpassung aktiv wird.

Fazit

Jetzt kannst du endlich deine Dienste, die du in deinem lokalen Netzwerk betreibst, über eine Domain und mit HTTPS aufrufen. Durch dieses Setup ergibt sich zum Beispiel auch der Vorteil, dass du auf einem Synology NAS Webauthn und Passkeys nutzen kannst und kein Passwort mehr für die Anmeldung benötigst. Findest du unter dem User-Icon (oben rechts) > Persönlich > Konto > Anmeldemethode.

Bitte bedenke weiterhin, dass du mit diesem Setup nur eine verschlüsselte Verbindung zwischen Browser und Caddy hast. Die Verbindung zwischen Caddy und deinem Dienst kann weiterhin unverschlüsselt sein.