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.
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.orgist. 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
ingressgegeben 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.
- browserüberall
Fragt nach docs.example.org.
- TLSvpsIngress
Liest den Namen im TLS-ClientHello und reicht die Verbindung weiter.
- WireGuardnasZiel
Beendet TLS, mit einem Zertifikat von Let's Encrypt.
- HTTP127.0.0.1:8080Dienst
Bekommt die unverschlüsselte Verbindung.
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
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 docsdocs 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).
*.example.org auf die öffentliche Adresse des VPS zeigen lassen, für alle
Namen auf einmal, oder nur docs.example.org.
juist ingress serveEs fragt einmal nach sudo, startet den Dienst juist-ingress und öffnet die
Ports 443 und 80. Port 80 leitet nur auf https weiter.
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:8080juist 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
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 immichDann 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, nichta.docs.example.orgund nichtexample.org. Die Domain selbst zu veröffentlichen ist geplant. - Ohne
=ADDR, also mitjuist publish serve, beendet der Dienst TLS selbst und hat sein eigenes Zertifikat, wie direkt im Internet. juist publish add nas docs --proxygibt dem Dienst die Adresse des Clients in einem PROXY-Protokoll-v2-Header mit.- Mitglieder, die mit
juist names onNamen eingeschaltet haben, erreichen einen auf 443 veröffentlichten Namen direkt durch den Tunnel, mit demselben Zertifikat (Namen). juist publishlistet die veröffentlichten Namen.juist publish remove nas docsnimmt einen zurück.juist publish serve --stopundjuist ingress serve --stopmachen 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.
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 siehst | Was zu tun ist |
|---|---|
the network has no domain to publish under | zuerst 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 serve | noch 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 |