Geräte einladen

Mit einer Einladung tritt genau ein neues Gerät dem Netz bei. Du startest sie auf dem Gerät eines Admins, und das neue Gerät tritt mit dem Code oder dem Link bei, den sie ausgibt.

Worum es geht

Eine Einladung ist ein kurzlebiges Geheimnis, mit dem ein neues Gerät dem Netz beitritt. juist invite gibt sie in zwei Formen aus, als Code und als Link, und wartet. Das neue Gerät ruft sudo juist join mit einem davon auf.

Einladen kann nur das Gerät eines Admins, denn ein Gerät aufzunehmen ist eine Änderung am Netz, die ein Admin signiert. Ein Admin ist ein Mensch mit einem Schlüssel, der Änderungen signiert; siehe So funktioniert juist.

Bevor irgendetwas signiert wird, zeigen beide Geräte vier Wörter, und du vergleichst sie. Daran erkennst du, dass das fragende Gerät das eingeladene ist.

CodeLink
Sieht so aus42-drumbeat-tolerance-glucose'juist:Kx7…@192.168.1.20:41642'
Funktioniertnur im selben LANüberall
Ein falscher Versuchmacht den Code ungültigmacht nichts ungültig

Der Code besteht aus einer Zahl und drei Wörtern, kurz genug zum Vorlesen oder Abtippen. Die Zahl unterscheidet Einladungen voneinander und ist nicht geheim; die drei Wörter sind es. Das neue Gerät findet das einladende, indem es im LAN fragt. Das einladende Gerät nimmt es auf TCP-Port 41642 an, den eine Firewall dort vielleicht hereinlassen muss; juist invite gibt dann den Befehl aus, der ihn öffnet, etwa hint: the firewall may block the device: sudo ufw allow 41642/tcp.

Der Code erlaubt genau einen Versuch. Nach einem falschen meldet das einladende Gerät warning: code voided: wrong guess from … und lehnt auch den richtigen Code ab. Der Link funktioniert dann weiter.

Der Link enthält ein 128-Bit-Geheimnis, die Adressen des einladenden Geräts und den Schlüssel des einladenden Admins, der das neue Gerät an dessen Signatur bindet. Kopiere ihn vollständig, mit den Anführungszeichen, denn er enthält Zeichen, die eine Shell sonst verändern würde.

Beide enden, wenn ein Gerät beitritt oder die Einladung abläuft. Eine Einladung gilt eine Stunde, außer du gibst --expires an, etwa --expires 2h; am längsten geht 7d.

Ein Gerät einladen

1auf dem Gerät eines Admins

Die Einladung starten. Gib dem neuen Gerät hier einen Namen, wenn es nicht seinen eigenen behalten soll:

juist invite nas

Ohne Namen behält das Gerät seinen Rechnernamen. Einen Namen, den schon ein anderes Mitglied trägt, ergänzt juist um eine Zahl.

2auf nas, das neue Gerät

Im selben LAN mit dem Code beitreten, von überall sonst mit dem Link:

sudo juist join 42-drumbeat-tolerance-glucose

Das neue Gerät zeigt vier Wörter: tell the inviting admin these words:.

3auf dem Gerät eines Admins

Vergleiche sie mit den Wörtern, die die Einladung zeigt, und antworte:

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

Die vier Wörter

Die Wörter decken die Identität des neuen Geräts und jeden seiner Schlüssel ab. Hat sich ein anderes Gerät dazwischengeschaltet, zeigt es andere Wörter. Jede Seite legt ihren Teil der Wörter fest, bevor sie den der anderen kennt; ein Gerät dazwischen kann deshalb nicht nach passenden Wörtern suchen.

Sind die Wörter verschieden, antworte mit n. Die Einladung signiert dann nichts: juist: words not confirmed; nothing signed. Starte eine neue Einladung und finde heraus, welches Gerät gefragt hat.

juist invite --yes nimmt auf, ohne zu vergleichen. Nimm das nur, wo du ohnehin nicht vergleichen könntest, etwa in einem Skript, denn damit fällt diese Prüfung weg.

Mit einer Rolle einladen

Eine Rolle gibt einem Gerät eine zusätzliche Aufgabe im Netz. Eine Einladung kann das neue Gerät gleich mit einer aufnehmen:

OptionDas neue Gerät wird
--relayein Relay, das Verkehr für Geräte weiterleitet, die sich nicht erreichen (Relays)
--voucherein Voucher, der stündlich bestätigt, dass der Stand des Netzes aktuell ist (Frische)
--ingresseine Ingress, die Verbindungen aus dem Internet für veröffentlichte Namen annimmt (Dienste veröffentlichen)

Für einen VPS, der die Ingress des Netzes werden soll:

$ juist invite vps --ingress
invite to "home" as ingress, expires in 1h; on the new device:

Eine Ingress kann kein Voucher sein, --ingress und --voucher gehen also nicht zusammen. Andere Rollen, etwa exit, gibst du nach dem Beitritt mit juist grant.

Über NAT hinweg

Der Link funktioniert, wenn beide Geräte an verschiedenen Orten hinter NAT stehen. Das neue Gerät versucht zuerst die Adressen im Link. Erreicht es sie nicht, treffen sich beide über den öffentlichen BitTorrent-DHT, und das neue Gerät meldet no direct answer; meeting through the DHT (up to a minute). Die meiste Zeit davon braucht der Beitritt zum DHT.

Hat das Netz ein Relay, wartet eine Einladung auf einem Gerät hinter NAT auch dort, und der Link nennt es. juist invite meldet dann meets through relay 203.0.113.7:41645 where this device is unreachable. Das Geheimnis der Einladung erreicht das Relay nie.

Das Treffen scheitert, wenn beide NATs symmetrisch sind, also für jedes Ziel einen neuen Port wählen. Dann hast du zwei Wege:

  • über einen Internetanschluss beitreten, der das einladende Gerät erreicht;
  • dem Netz zuerst ein Relay geben und dann neu einladen.

Gut zu wissen

  • Eine Einladung nimmt ein Gerät auf. Für das nächste rufst du juist invite noch einmal auf.
  • --no-lan gibt keinen Code aus, nur den Link. --no-dht hält die Einladung vom öffentlichen DHT fern. --port wählt einen anderen TCP-Port als 41642.
  • sudo juist join macht den Benutzer, der sudo aufgerufen hat, zum Operator des Geräts, dem lokalen Benutzer, der es ohne sudo verwaltet, außer --operator nennt einen anderen. --name gibt den Namen an, unter dem das Gerät beitritt.
  • Braucht das Netz die Stimmen mehrerer Admins, wartet die Einladung auf die anderen, und das neue Gerät zeigt waiting for approval (1 of 2 votes). Die Wartezeit zählt zur Laufzeit der Einladung.
  • Auf einem Gerät in mehreren Netzen sagst du, welches gemeint ist: juist invite work.

Wenn etwas nicht klappt

Was du siehstWas zu tun ist
juist: no admin key of this network hereVom Gerät eines Admins einladen.
warning: code not announced on the LAN (…); use the linkMit dem Link beitreten.
warning: code voided: …Mit dem Link beitreten. War das nicht dein Gerät, kennt jemand anderes die Einladung.
juist: invite expiredEine neue Einladung starten, mit längerem --expires, wenn auf andere Admins gewartet wurde.
juist: cannot reach the inviting device, …Prüfen, ob die Einladung noch läuft. Stehen beide Geräte hinter NAT, über einen Internetanschluss beitreten, der das einladende Gerät erreicht, oder zuerst ein Relay einrichten.
juist: comparing the device's words needs a terminal; pass --yes to skipjuist invite in einem Terminal aufrufen, oder --yes angeben, wo du nicht vergleichen kannst.