
Peer-to-Peer-verschlüsselter Messenger in Rust mit Noise IK und UDP-NAT-Lochbohren
Ende-zu-Ende-verschlüsselter Peer-to-Peer-Chat über UDP. Keine Konten, kein zentraler Server, der Nachrichten weiterleitet/speichert, kein Mittelsmann. Nur zwei Peers, eine direkte Verbindung und Noise-Protokoll-Verschlüsselung.
https://github.com/user-attachments/assets/939e96d3-45e3-4484-9a27-28c3a0457b05
Zwei Personen führen punchline connect <peer> auf ihren Maschinen aus. Punchline durchbricht ihre NATs, führt einen verschlüsselten Handshake durch und bringt sie in einen privaten Chat – alles in wenigen Millisekunden. Die enthaltenen STUN- und Signal-Server übernehmen die Erkennung und verschwinden dann.

cargo build --release
Starte die Server (auf einer Maschine, die beide Peers erreichen können), oder verwende meine öffentlichen unter 64.225.107.28 (STUN: Port 3478, Signal: Port 8743):
punchline-stund # STUN server - tells peers their public IP
punchline-signald # Signal server - matches peers who want to talk
Auf jedem Peer-Computer:
# Generate your identity (X25519 keypair)
punchline keygen
# Share your public key with your peer
punchline pubkey
# Save their key
punchline peers add alice a1b2c3d4...64_hex_chars
# Connect (both peers run this, targeting each other)
punchline connect alice --stun <server>:3478 --signal <server>:8743
Die TUI startet mit einer Live-Ansicht des Verbindungsfortschritts:
STUN-Erkennung – Ermittlung deiner externen Adresse über punchline-stund
Signal-Server – Verbindung zu punchline-signald
Warten auf Peer – Der Signal-Server bringt beide Peers zusammen
Hole Punch – Herstellung des direkten UDP-Pfads
Noise-Handshake – Verschlüsselter Schlüsselaustausch
Sobald abgeschlossen, bist du im Chat. Tippe und drücke Enter. Drücke Esc, um zu beenden.
Das gesamte System besteht aus drei Binärdateien, die alle in diesem Repository enthalten sind:
| Binary | Rolle | Verwendung |
|---|---|---|
punchline-stund | STUN-Server (UDP) – antwortet mit der externen IP:Port des Clients | Nur während der Einrichtung |
punchline-signald | Signal-Server (WebSocket) – vermittelt Peers und tauscht Adressen aus | Nur während der Einrichtung |
punchline | Der Messenger selbst – CLI, TUI, Krypto, Hole Punching | Immer |
Nach der anfänglichen Einrichtung werden die STUN- und Signal-Server nicht mehr kontaktiert. Der gesamte Datenverkehr erfolgt direkt Peer-to-Peer.
punchline| Befehl | Beschreibung |
|---|---|
keygen [--force] [-i Pfad] | Neues X25519-Identitätsschlüsselpaar generieren. Verwende --force, um ohne Nachfrage zu überschreiben. Verwende -i, um den Ausgabepfad anzugeben. |
pubkey [-i Pfad] | Deinen öffentlichen Schlüssel (64 Hex-Zeichen) ausgeben. Verwende -i, um von einer bestimmten Schlüsseldatei abzuleiten. |
connect <peer> [-i Pfad] [--stun Adresse] [--signal Adresse] | Verbindung zu einem Peer per Alias oder rohem Hex-Schlüssel herstellen. Verwende -i, um den Identitätsschlüssel anzugeben. Startet die TUI. |
peers | Alle bekannten Peers auflisten. |
peers add <Name> <Schlüssel> | Öffentlichen Schlüssel eines Peers unter einem Spitznamen speichern. |
peers remove <Name> | Peer per Spitznamen entfernen. |
config path | Pfad der Konfigurationsdatei ausgeben. |
config show | Aktuelle Konfigurationswerte anzeigen. |
status | Identität, Konfiguration, Servererreichbarkeit und Anzahl der Peers anzeigen. |
completions <shell> | Shell-Vervollständigungen generieren (bash, zsh oder fish). |
Globale Flags:
| Flag | Beschreibung |
|---|---|
-v | Erhöht die Protokollausführlichkeit (-v = Debug, -vv = Trace). |
-q, --quiet | Unterdrückt die gesamte Protokollausgabe. |
punchline-stund| Flag | Beschreibung |
|---|---|
--address <Adresse> | Bindeadresse (Standard: 0.0.0.0). |
--port <Port> | Binde Port (Standard: 3478). |
-v / -vv | Debug / Trace Logging. |
-q | Lautlos-Modus. |
punchline-signald| Flag | Beschreibung |
|---|---|
--address <Adresse> | Bindeadresse (Standard: 0.0.0.0). |
--port <Port> | Binde Port (Standard: 8743). |
-v / -vv | Debug / Trace Logging. |
-q | Lautlos-Modus. |
Anstatt jedes Mal --stun und --signal zu übergeben, erstelle ~/.config/punchline/config.toml:
stun_server = "203.0.113.10:3478"
signal_server = "203.0.113.10:8743"
punchline peers # list all
punchline peers add alice a1b2c3d4... # add
punchline peers remove alice # remove
Die Aliase werden in ~/.punchline/known_peers.toml gespeichert. Du kannst auch direkt mit einem rohen 64-stelligen Hex-Schlüssel verbinden.
punchline status
Zeigt deine Identität, Konfiguration, Servererreichbarkeit (sendet eine echte STUN-Abfrage und TCP-Verbindung) und die Anzahl der Peers.
Beide Server unterstützen -v (Debug), -vv (Trace), -q (Lautlos), --address und --port:
punchline-stund -v --port 3478
punchline-signald -v --port 8743
Passe die TUI über ~/.config/punchline/style.toml an.
Im Video verwendete Stile:
[colors]
my_text = "#ebdbb2"
peer_text = "#bdae93"
input_text = "#ebdbb2"
border = "#ebdbb2"
sidebar_key = "#ebdbb2"
sidebar_value = "#bdae93"
[padding]
chat_horizontal = 2
chat_vertical = 1
Alle Farben sind hex RGB. Wenn die Datei fehlt, werden die Standardfarben des Terminals verwendet.
punchline completions bash > ~/.local/share/bash-completion/completions/punchline
punchline completions zsh > ~/.zfunc/_punchline
punchline completions fish > ~/.config/fish/completions/punchline.fish
Vollständiger Protokollname: Noise_IK_25519_ChaChaPoly_SHA256