Dienste veröffentlichen

Ein Dienst auf einem Mitglied, etwa einem NAS zu Hause, ist aus dem Internet per Name erreichbar. Ein Gerät mit öffentlicher Adresse reicht die Verbindungen weiter; die Verschlüsselung endet beim Mitglied.

M9 · in Arbeit · Linux

Worum es geht

Du betreibst zu Hause einen Dienst, etwa einen Dokumentenserver auf deinem NAS, und willst ihn aus jedem Browser als docs.example.org öffnen. Dein Router zu Hause öffnet dafür keinen Port, und seine Adresse steht in keinem öffentlichen Eintrag.

Zuerst ein paar Begriffe:

  • Eine Domain ist ein Name im Internet, der dir gehört, etwa example.org.
  • Ein DNS-Eintrag steht bei deinem DNS-Anbieter und sagt, auf welche Adresse ein Name zeigt.
  • TLS ist die Verschlüsselung, die ein Browser für https://-Adressen nutzt.
  • Ein Zertifikat beweist dem Browser, dass der Server wirklich docs.example.org ist. juist holt eins von Let’s Encrypt.
  • Eine Ingress ist ein Gerät deines Netzes mit öffentlicher Adresse, etwa ein kleiner VPS, dem ein Admin die Rolle ingress gegeben hat. Sie nimmt Verbindungen auf Port 443 an, liest den Namen, den der Browser verlangt, und reicht die Verbindung durch den Tunnel an das Mitglied weiter, das den Namen veröffentlicht.
  1. browserüberall

    Fragt nach docs.example.org.

  2. TLSvpsIngress

    Liest den Namen im TLS-ClientHello und reicht die Verbindung weiter.

  3. WireGuardnasZiel

    Beendet TLS, mit einem Zertifikat von Let's Encrypt.

  4. HTTP127.0.0.1:8080Dienst

    Bekommt die unverschlüsselte Verbindung.

Die Ingress sieht den Namen, die Adresse des Clients, Größen und Zeitpunkte, nicht den Inhalt.

Die Ingress beendet kein TLS, sie sieht also nie den Inhalt. TLS endet beim NAS, und das NAS reicht die unverschlüsselte Verbindung an den Dienst weiter. Eine Ingress bedient alle Namen des Netzes.

Einrichten

1auf dem Gerät eines Admins

Die Domain des Netzes setzen, dem VPS die Rolle geben und den Namen docs auf nas veröffentlichen:

juist network domain example.org
juist grant vps ingress
juist publish add nas docs

docs geht an Port 443 des NAS, außer du gibst nach dem Namen einen anderen Port an. Braucht eine Änderung mehr als einen Admin, wartet sie auf die anderen (wie Änderungen bestätigt werden).

2auf der Website deines DNS-Anbieters

*.example.org auf die öffentliche Adresse des VPS zeigen lassen, für alle Namen auf einmal, oder nur docs.example.org.

3auf vps, der Ingress
juist ingress serve

Es fragt einmal nach sudo, startet den Dienst juist-ingress und öffnet die Ports 443 und 80. Port 80 leitet nur auf https weiter.

4auf nas, dem Ziel

Sein Operator, der lokale Benutzer, der das Gerät verwaltet, stimmt zu, den Namen zu bedienen, und sagt, wohin die unverschlüsselte Verbindung geht:

juist publish serve docs=127.0.0.1:8080

juist holt über die Ingress ein Zertifikat und beendet TLS hier. Es gibt serving docs.example.org und ending TLS for docs.example.org to 127.0.0.1:8080 aus.

juist grant und juist publish add nennen den nächsten Schritt und das Gerät, auf dem er läuft. Führt der Operator jenes Geräts sie dort aus, machen sie diesen Schritt gleich mit. juist invite vps --ingress nimmt ein neues Gerät gleich als Ingress auf.

Den Server vom Netz fernhalten

Gefahr

Ein Server, den ein volles Mitglied veröffentlicht, erreicht das Netz und das LAN des Mitglieds, sobald jemand in ihn einbricht. Veröffentliche von dort nur, was du ohnehin ins Internet stellen würdest.

Ein Service-Mitglied hält den Server davon fern: ein eigener juistd neben dem Dienst, ohne Privilegien, dem jedes Gerät verbietet, eine Verbindung zu ihm zu öffnen. Nur seine Antworten kommen durch. Lass es neben dem Dienst laufen, etwa in einem Container im Container-Netz des Dienstes:

juistd --serve immich=immich-server:2283 --home /var/lib/juist
juist -s /var/lib/juist/daemon.sock join 'juist:…' --name immich

Dann auf dem Gerät eines Admins juist grant immich service und juist publish add immich immich. Es beendet TLS selbst, mit einem Zertifikat von Let’s Encrypt, und beantwortet nichts außer dem, was es veröffentlicht, und dem Log-Abgleich. Es hat keinen Weg nach draußen. Ein Dienst, der beim ersten Start etwas herunterlädt, muss das also vorher erledigt haben.

Gut zu wissen

  • Ein veröffentlichter Name ist ein Label unter der Domain: docs.example.org, nicht a.docs.example.org und nicht example.org. Die Domain selbst zu veröffentlichen ist geplant.
  • Ohne =ADDR, also mit juist publish serve, beendet der Dienst TLS selbst und hat sein eigenes Zertifikat, wie direkt im Internet.
  • juist publish add nas docs --proxy gibt dem Dienst die Adresse des Clients in einem PROXY-Protokoll-v2-Header mit.
  • Mitglieder, die mit juist names on Namen eingeschaltet haben, erreichen einen auf 443 veröffentlichten Namen direkt durch den Tunnel, mit demselben Zertifikat (Namen).
  • juist publish listet die veröffentlichten Namen. juist publish remove nas docs nimmt einen zurück. juist publish serve --stop und juist ingress serve --stop machen die beiden serve-Schritte rückgängig.
  • Eine Ingress läuft vorerst nur unter Linux, und juists eigenes TLS auch. Ein Ziel unter FreeBSD beendet TLS im Dienst selbst.
  • Eine Ingress ist nie Voucher oder Exit-Node und routet kein Subnetz. Jedes Mitglied nimmt von ihr nur Verbindungen zu den Ports an, die es veröffentlicht und bedient, und den Log-Abgleich. Alles andere von ihr wird verworfen.
  • Die Ingress läuft als eigener Benutzer, juist-ingress, hält keinen Schlüssel des Netzes und darf juistd nur eins fragen: was veröffentlicht ist.
  • Eine Ingress mit veraltetem Stand des Netzes bedient nichts. Antwortet ihr juistd nicht mehr, sind die Namen binnen zehn Sekunden weg.
Achtung

Wer die Ingress kontrolliert, kann ein Zertifikat für deine Namen bekommen und öffentliche Clients abfangen. Mitglieder, die Namen eingeschaltet haben, betrifft das nicht, sie verbinden sich direkt mit dem Ziel. Ein CAA-Eintrag, ein DNS-Eintrag, der sagt, wer Zertifikate für die Domain ausstellen darf, würde das verhindern, wenn er an das ACME-Konto des Ziels gebunden ist. Diesen Eintrag kann juist dir noch nicht geben.

Wenn etwas nicht klappt

Du siehstWas zu tun ist
the network has no domain to publish underzuerst juist network domain example.org
auf nas, juist status: Published zeigt not served here: not agreed to on this device (juist publish serve)auf nas juist publish serve ausführen
auf vps, juist status: Ingress zeigt not running on this device (juist ingress serve)auf vps juist ingress serve ausführen
juist ingress auf vps: nothing to servenoch ist kein Name veröffentlicht und bedient; ein Hinweis sagt, wenn der Stand veraltet ist
the ingress does not answer on 443: …journalctl -u juist-ingress zeigt, warum
the terminator does not answer on …journalctl -u juist-serve zeigt, warum