Ein Mesh-VPN ohne Koordinationsserver

WireGuard überträgt den Verkehr. Wer zum Netz gehört, steht in einem Log, das deine Admins signieren, und jedes Gerät prüft dieses Log selbst.

Installieren →
Kein Server in der Mitte
Geräte finden einander im LAN, über andere Mitglieder oder über den öffentlichen BitTorrent-DHT. Sie kommen durch NAT, und wo das nicht klappt, springt ein Relay ein, das auf einem deiner eigenen Geräte läuft.
Änderungen brauchen deine Admins
Um ein Gerät aufzunehmen oder zu entfernen, braucht es ein Quorum von Admins, jeder mit einem Schlüssel auf seinen eigenen Geräten. Die Schlüssel bleiben im Keystore, der Daemon bekommt sie nie.
Fail-closed
Hat ein Netz Voucher und haben sich 48 Stunden lang zu wenige für ein Gerät verbürgt, behält es nur Tunnel zu Vouchern. Ein entferntes Gerät bleibt so nicht verbunden.

Das erste Netz #

Auf dem ersten Gerät legst du mit juist create ein Netz an. juist invite gibt dann einen Code fürs LAN und einen Link für alle anderen Fälle aus, und das neue Gerät tritt mit einem von beiden bei. Anschließend zeigen beide Geräte vier Wörter. Erst wenn du sie verglichen hast, wird das Gerät aufgenommen.

laptop
$ juist create home
created network "home"
$ juist invite
invite to "home", expires in 1h; on the new device:

  juist join 'juist:Kx7q…@192.168.1.20:41642'

  juist join 42-drumbeat-tolerance-glucose  # same LAN

nas wants to join; compare with the words it shows:
  atlas-amulet-banjo-asteroid
same? [y/N] y
admitting nas (nid:fcRW83T_…)
admitted nas at 198.18.36.2
nas joined

Funktionen #

Gedacht für Netze mit bis zu etwa 100 Geräten und wenigen Admins. Ein Netz fasst höchstens 512 Geräte.

FunktionWas sie tut
Mesh und NAT-Traversal #WireGuard-Tunnel zwischen allen Geräten, direkt, wo das NAT es zulässt.→ Server ohne offenes SSH
Quantensicher #Jeder Handshake mischt einen Schlüssel ein, den ein Quantencomputer nicht herausfinden kann, jedes Gerätepaar hat seinen eigenen, und jede Änderung ist mit ML-DSA signiert.
Einladungen #Ein Code fürs LAN oder ein Link für überall. Beide Geräte zeigen vier Wörter, die du vergleichst.
Android #Ein Telefon mit Android 12 oder neuer tritt mit dem QR-Code oder dem Code der Einladung bei, erreicht die Mitglieder unter ihren Adressen und zeigt, wie es jedes erreicht.
Container nur Linux #Eine App im Container ist ein eigenes Gerät, über einen juist-Container, der sich ihren Netz-Namespace teilt.→ Eine App im Container
Admins und Quorum #Jede Änderung braucht k von n Admins. Fehlen Stimmen, landet sie auf den Geräten der übrigen Admins.
Zugriffsregeln #Welches Gerät was auf welchem öffnen und welchen Exit-Node oder welches Subnetz es nutzen darf. Alles andere wird abgewiesen.→ Eigene Dienste durch den Tunnel · Werkzeuge nur für Mitglieder · Server ohne offenes SSH
Mehrere Netze #Ein Gerät in mehreren Netzen, jedes mit eigenem Admin-Schlüssel.
Exit-Nodes #Internetverkehr und DNS eines Geräts über ein anderes Mitglied.→ Sicher im fremden WLAN
Subnet-Router #Das LAN hinter einem Mitglied, erreichbar für die anderen.→ Das Heimnetz von unterwegs
Multicast #Drucker, Medienserver und LAN-Spiele finden die Mitglieder per mDNS, SSDP oder eigenen Gruppen, wie in einem LAN.
UDP-Broadcast nur Linux #Eigene IPv4-UDP-Broadcasts einschließlich NetBIOS erreichen auch die Mitglieder, während die Originale im LAN bleiben; ohne Portkonfiguration.
Namen #Jedes Mitglied unter GERÄT.NETZ.juist, dazu öffentliche Namen, die auf Mitglieder verweisen.→ Eigene Dienste durch den Tunnel
Dienste veröffentlichen #Dienste auf Mitgliedern, über einen Ingress unter einem Namen aus dem Internet erreichbar.→ Das Homelab im Internet
HTTP/3 #Veröffentlichte Namen über QUIC durch den Ingress, für Browser, die es selbst entdecken oder per DNS davon erfahren.→ Das Homelab im Internet
Namen nur für Mitglieder #Ein veröffentlichter Name mit einem Zertifikat der CA, den das Internet nicht erreicht. Öffnen können ihn nur die Mitglieder, denen die Zugriffsregeln es erlauben.→ Werkzeuge nur für Mitglieder
TCP-Dienste #Ein Spieleserver oder jeder andere TCP-Dienst auf einem eigenen Port jedes Ingress, weitergereicht, ohne mitzulesen.→ Ein Spieleserver für Freunde
Teilen #Eine Datei, ein Verzeichnis oder einen Webserver sofort im Internet teilen, unter dem eigenen Namen des Geräts. Ein Verzeichnis lädt sich auch als ZIP.→ Vom Laptop aus teilen
Statusseite #Geräte, ihre Erreichbarkeit, veröffentlichte Namen und die Änderungen im Log auf einer Seite, für Mitglieder, und so viel davon für alle anderen, wie du willst.
Relays #Wo das NAT keine direkte Verbindung zulässt, läuft der Verkehr über ein Mitglied mit öffentlicher Adresse.→ Aus abgeschotteten Netzen
Nur HTTPS #Aus einem Netz, das nur HTTPS hinauslässt, zu jedem Mitglied über ein Relay auf Port 443, das des Ingress von selbst, und über den Proxy einer Firma.→ Aus abgeschotteten Netzen
Umbenennen und umnummerieren #Das Netz oder ein Gerät bekommt einen neuen Namen, die Geräte neue IPv4-Adressen, ohne dass etwas neu eingerichtet wird.
Schlüssel sichern #Ein Admin-Schlüssel als eine Zeile, für den Passwortmanager.
Break-glass #Ein Geheimnis, beim Anlegen einmal angezeigt und offline verwahrt, beendet das Netz endgültig, ganz ohne Admin.
Frische und Entfernen #Ein entferntes Gerät erfährt davon. Mit Vouchern behält ein Gerät, das 48 Stunden abgeschnitten ist, nur Tunnel zu Vouchern.

Alle Funktionen laufen unter Linux und FreeBSD, sofern nicht anders vermerkt; die Android-App tritt als Mitglied bei.

Dienste veröffentlichen #

Dienste auf deinen Mitgliedern, etwa auf dem NAS zu Hause, kannst du unter einem Namen im Internet erreichbar machen. Ein Gerät mit öffentlicher Adresse, der Ingress, liest den Namen, den der Client anfragt, und reicht die Verbindung durch den Tunnel weiter. TLS endet erst beim Mitglied, der Ingress bekommt den Inhalt also nie zu sehen.

  1. browserüberall

    Ruft docs.example.org auf.

  2. TLSvpsIngress

    Liest den Namen aus dem TLS-ClientHello und leitet die Verbindung weiter.

  3. WireGuardnasZiel

    Entschlüsselt TLS mit einem Zertifikat von Let's Encrypt.

  4. HTTP127.0.0.1:8080Dienst

    Bekommt die entschlüsselte Verbindung.

Der Ingress sieht den Namen, die Adresse des Clients, Datenmengen und Zeitpunkte, aber nicht den Inhalt.

Wie du das einrichtest, steht im Handbuch.

Trade-offs #

Ohne Server in der Mitte ist manches schwächer als mit einem. Zu jedem Punkt steht hier, was passieren kann, warum juist das in Kauf nimmt und was du dagegen tun kannst. Die vollständige Liste steht in 02-threat-model.md.

Mitgliedschaft #

Entfernen wirkt nicht überall sofort #

juist admins vouchers M

Was passiert
Ist ein Gerät vom Netz abgeschnitten, hält es Tunnel zu einem entfernten Gerät, bis es davon erfährt.
Warum juist das hinnimmt
Es gibt keinen Server, den jedes Gerät fragen könnte. Die Frische setzt dem eine Grenze: Hat sich 48 Stunden lang kein Voucher für ein Gerät verbürgt, behält es nur noch Tunnel zu Vouchern.
Was du tun kannst
Geräte, die ständig laufen, zu Vouchern machen und M von ihnen verlangen. Dann hält die Grenze auch, wenn M − 1 von ihnen lügen. Ein neues Netz hat keine Voucher und damit keine Grenze.

Ein verlorenes Quorum ist endgültig #

mehr Admins, als das Quorum braucht

Was passiert
Bleiben weniger als k Admin-Schlüssel übrig, lässt sich keine Änderung mehr signieren, nie wieder.
Warum juist das hinnimmt
Jeder Weg am Quorum vorbei stünde auch Angreifern offen.
Was du tun kannst
Mehr Admins einsetzen, als das Quorum braucht, jeden mit eigenen Geräten.

Erreichbarkeit #

Symmetrisches NAT überall braucht ein Relay #

juist grant vps relay

Was passiert
Stehen alle Geräte hinter symmetrischem NAT, kommt kein direkter Tunnel zustande.
Warum juist das hinnimmt
Das Relay ist eines deiner eigenen Mitglieder und sieht nur verschlüsselten WireGuard-Verkehr.
Was du tun kannst
Einem Gerät mit öffentlicher Adresse die Rolle relay geben.

Öffentliche Helfer sehen Adressen #

--no-dht --no-stun

Was passiert
Der öffentliche BitTorrent-DHT und die STUN-Server sehen die Adressen der Geräte, die sie nutzen.
Warum juist das hinnimmt
juist vertraut nichts, was sie liefern. Ein kompromittierter Helfer kann Verbindungen verzögern, aber nicht ändern, wer zum Netz gehört.
Was du tun kannst
juistd ohne sie betreiben und den Geräten selbst Adressen mitgeben, unter denen sie sich erreichen.

Kryptographie #

Ein Tunnel beginnt mit dem Schlüssel der Gruppe #

keine Einstellung

Was passiert
Zwei Geräte bekommen ihren eigenen Schlüssel einen Log-Abgleich nach dem Aufbau ihres Tunnels. Bis dahin schützt ihren Verkehr ein Schlüssel, den jedes Mitglied ableiten könnte.
Warum juist das hinnimmt
Gegen alle außerhalb des Netzes ist er von Anfang an quantensicher. Nur ein Mitglied oder ein seither entferntes Gerät mit einem Quantencomputer könnte diese ersten Sekunden lesen.
Was du tun kannst
Nichts; es dauert bis zum nächsten Log-Abgleich der beiden.