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.
Pakete für Debian, Ubuntu, Fedora und FreeBSD →- 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 von ihnen für ein Gerät verbürgt, behält es nur noch Tunnel zu Vouchern. So hält es keine Verbindung zu einem Gerät, das längst entfernt wurde.
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.
$ 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 #
Für Netze mit 25 bis 100 Geräten und wenigen Admins.
| Funktion | Was sie tut |
|---|---|
| Mesh und NAT-Traversal # | WireGuard-Tunnel zwischen allen Geräten, direkt, wo das NAT es zulässt. |
| Quantensichere Tunnel # | Jeder Handshake mischt einen Schlüssel ein, den ein Quantencomputer nicht herausfinden kann, einen, den je zwei Geräte allein haben. |
| 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 tritt per QR-Code oder Code der Einladung bei, erreicht die Mitglieder unter ihren Adressen und zeigt, wie jedes erreicht wird. |
| 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. |
| 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. |
| Subnet-Router # | Das LAN hinter einem Mitglied, erreichbar für die anderen. |
| Namen** # | Jedes Mitglied unter GERÄT.NETZ.juist, dazu öffentliche Namen, die auf Mitglieder verweisen. |
| Dienste veröffentlichen # | Dienste auf Mitgliedern, über eine Ingress unter einem Namen aus dem Internet erreichbar. |
| HTTP/3 # | Veröffentlichte Namen über QUIC, durch die Ingress, für Browser, die es finden oder per DNS davon erfahren. |
| Namen nur für Mitglieder*** # | Ein veröffentlichter Name mit dem Zertifikat der CA, den das Internet nicht erreicht, geöffnet von den Mitgliedern, für die ihn die Zugriffsregeln nennen. |
| TCP-Dienste # | Ein Spieleserver oder jeder andere TCP-Dienst auf einem eigenen Port jeder Ingress, ungelesen weitergereicht. |
| 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. |
| 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. |
| Nur HTTPS # | Aus einem Netz, das nichts als HTTPS hinauslässt, über Relays auf 443 unter öffentlichen Namen und den Proxy einer Firma. |
| Umbenennen und umnummerieren # | Das Netz oder ein Gerät bekommt einen anderen Namen, die Geräte andere IPv4-Adressen. Nichts wird neu eingerichtet. |
| 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, die App unter Android. * Unter Android 12 oder neuer, als Mitglied ohne Namen, Rollen und Subnetze. ** Nur unter Linux mit systemd-resolved. *** Erreichbar von Linux mit systemd-resolved.
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, die Ingress, liest den Namen, den der Client anfragt, und reicht die Verbindung durch den Tunnel weiter. TLS endet erst beim Mitglied, die Ingress bekommt den Inhalt also nie zu sehen.
- browserüberall
Ruft docs.example.org auf.
- TLSvpsIngress
Liest den Namen aus dem TLS-ClientHello und leitet die Verbindung weiter.
- WireGuardnasZiel
Entschlüsselt TLS mit einem Zertifikat von Let's Encrypt.
- HTTP127.0.0.1:8080Dienst
Bekommt die entschlüsselte Verbindung.
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 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
relaygeben.
Ö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
- Bis zwei Geräte einen eigenen Schlüssel haben, einen Log-Abgleich nachdem ihr Tunnel steht, 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.
juist statussagt, welche Tunnel den Schlüssel der Gruppe nutzen.