
Messenger peer-to-peer crittografato in Rust con Noise IK e UDP NAT hole punching
Chat peer-to-peer crittografata end-to-end su UDP. Niente account, nessun server centrale che inoltra/memorizza messaggi, nessun intermediario. Solo due peer, una connessione diretta e crittografia con il protocollo Noise.
https://github.com/user-attachments/assets/939e96d3-45e3-4484-9a27-28c3a0457b05
Due persone eseguono punchline connect <peer> sulle loro macchine. Punchline buca i loro NAT, esegue un handshake crittografato e li porta in una chat privata – tutto in pochi millisecondi. I server STUN e di segnalazione inclusi gestiscono la scoperta, poi si mettono da parte.

cargo build --release
Avvia i server (su una macchina raggiungibile da entrambi i peer), oppure usa quelli pubblici che ospito su 64.225.107.28 (STUN: porta 3478, segnalazione: porta 8743):
punchline-stund # Server STUN – dice ai peer il loro IP pubblico
punchline-signald # Server di segnalazione – abbina i peer che vogliono parlare
Su ogni macchina peer:
# Genera la tua identità (coppia di chiavi X25519)
punchline keygen
# Condividi la tua chiave pubblica con il peer
punchline pubkey
# Salva la loro chiave
punchline peers add alice a1b2c3d4...64_caratteri_hex
# Connettiti (entrambi i peer eseguono questo, puntandosi l'un l'altro)
punchline connect alice --stun <server>:3478 --signal <server>:8743
La TUI si avvia con una vista dell'avanzamento della connessione in tempo reale:
Scoperta STUN – risoluzione del tuo indirizzo esterno tramite punchline-stund
Server di segnalazione – connessione a punchline-signald
Attesa del peer – il server di segnalazione abbina entrambi i peer
Hole punch – creazione del percorso UDP diretto
Handshake Noise – scambio di chiavi crittografato
Una volta completato, sei nella chat. Digita e premi Invio. Premi Esc per uscire.
L'intero sistema è composto da tre binari, tutti inclusi in questo repository:
| Binario | Ruolo | Quando viene usato |
|---|---|---|
punchline-stund | Server STUN (UDP) – risponde con l'IP:porta esterno del client | Solo durante la fase di configurazione |
punchline-signald | Server di segnalazione (WebSocket) – abbina i peer e scambia indirizzi | Solo durante la fase di configurazione |
punchline | Il messenger stesso – CLI, TUI, crittografia, hole punch | Sempre |
Dopo la configurazione iniziale, i server STUN e di segnalazione non vengono più contattati. Tutto fluisce direttamente peer-to-peer.
punchline| Comando | Descrizione |
|---|---|
keygen [--force] [-i path] | Genera una nuova coppia di chiavi identità X25519. Usa --force per sovrascrivere senza richiesta. Usa -i per specificare il percorso di output. |
pubkey [-i path] | Stampa la tua chiave pubblica (64 caratteri esadecimali). Usa -i per derivare da un file di chiave specifico. |
connect <peer> [-i path] [--stun addr] [--signal addr] | Connettiti a un peer tramite alias o chiave hex grezza. Usa -i per specificare la chiave identità. Avvia la TUI. |
peers | Elenca tutti i peer conosciuti. |
peers add <name> <key> | Salva la chiave pubblica di un peer sotto un soprannome. |
peers remove <name> | Rimuovi un peer tramite soprannome. |
config path | Stampa il percorso del file di configurazione. |
config show | Mostra i valori correnti di configurazione. |
status | Mostra identità, configurazione, raggiungibilità del server e numero di peer. |
completions <shell> | Genera i completamenti per shell (bash, zsh o fish). |
Flag globali:
| Flag | Descrizione |
|---|---|
-v | Aumenta la verbosità del log (-v = debug, -vv = trace). |
-q, --quiet | Sopprime tutto l'output dei log. |
punchline-stund| Flag | Descrizione |
|---|---|
--address <addr> | Indirizzo di bind (predefinito: 0.0.0.0). |
--port <port> | Porta di bind (predefinito: 3478). |
-v / -vv | Logging debug / trace. |
-q | Modalità silenziosa. |
punchline-signald| Flag | Descrizione |
|---|---|
--address <addr> | Indirizzo di bind (predefinito: 0.0.0.0). |
--port <port> | Porta di bind (predefinito: 8743). |
-v / -vv | Logging debug / trace. |
-q | Modalità silenziosa. |
Invece di passare --stun e --signal ogni volta, crea ~/.config/punchline/config.toml:
stun_server = "203.0.113.10:3478"
signal_server = "203.0.113.10:8743"
punchline peers # elenca tutti
punchline peers add alice a1b2c3d4... # aggiungi
punchline peers remove alice # rimuovi
Gli alias sono memorizzati in ~/.punchline/known_peers.toml. Puoi anche connetterti direttamente con una chiave hex di 64 caratteri.
punchline status
Mostra la tua identità, configurazione, raggiungibilità del server (invia una vera sonda STUN e una connessione TCP) e numero di peer.
Entrambi i server supportano -v (debug), -vv (trace), -q (silenzioso), --address e --port:
punchline-stund -v --port 3478
punchline-signald -v --port 8743
Personalizza la TUI tramite ~/.config/punchline/style.toml
Stili usati nel video:
[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
Tutti i colori sono RGB esadecimali. Se il file è assente, vengono usati i colori predefiniti del terminale.
punchline completions bash > ~/.local/share/bash-completion/completions/punchline
punchline completions zsh > ~/.zfunc/_punchline
punchline completions fish > ~/.config/fish/completions/punchline.fish
Nome completo del protocollo: Noise_IK_25519_ChaChaPoly_SHA256