
पीयर-टू-पीयर एन्क्रिप्टेड मैसेंजर, Rust में, Noise IK और UDP NAT होल पंचिंग के साथ।
एंड-टू-एंड एन्क्रिप्टेड पीयर-टू-पीयर चैट UDP पर। कोई खाता नहीं, कोई केंद्रीय सर्वर संदेशों को रिले/स्टोर नहीं करता, कोई बीच का व्यक्ति नहीं। बस दो पीयर, एक सीधा कनेक्शन, और नॉइज़ प्रोटोकॉल एन्क्रिप्शन।
https://github.com/user-attachments/assets/939e96d3-45e3-4484-9a27-28c3a0457b05
दो लोग अपनी मशीनों पर punchline connect <peer> चलाते हैं। Punchline उनके NAT के माध्यम से छेद करता है, एक एन्क्रिप्टेड हैंडशेक करता है, और उन्हें एक निजी चैट में डाल देता है - यह सब कुछ मिलीसेकंड में। शामिल STUN और सिग्नल सर्वर खोज को संभालते हैं, फिर रास्ते से हट जाते हैं।

cargo build --release
सर्वर शुरू करें (एक मशीन पर जहां दोनों पीयर पहुंच सकते हैं), या मेरे सार्वजनिक सर्वरों का उपयोग करें जो 64.225.107.28 पर होस्ट किए गए हैं (STUN: पोर्ट 3478, सिग्नलिंग: पोर्ट 8743):
punchline-stund # STUN सर्वर - पीयर को उनका सार्वजनिक IP बताता है
punchline-signald # सिग्नल सर्वर - उन पीयर को मिलाता है जो बात करना चाहते हैं
प्रत्येक पीयर की मशीन पर:
# अपनी पहचान उत्पन्न करें (X25519 कुंजी जोड़ी)
punchline keygen
# अपनी सार्वजनिक कुंजी अपने पीयर के साथ साझा करें
punchline pubkey
# उनकी कुंजी सहेजें
punchline peers add alice a1b2c3d4...64_hex_chars
# कनेक्ट करें (दोनों पीयर यह चलाते हैं, एक-दूसरे को लक्षित करते हुए)
punchline connect alice --stun <server>:3478 --signal <server>:8743
TUI लाइव कनेक्शन प्रगति दृश्य के साथ लॉन्च होता है:
STUN खोज - punchline-stund के माध्यम से आपका बाहरी पता हल करना
सिग्नल सर्वर - punchline-signald से कनेक्ट होना
पीयर की प्रतीक्षा - सिग्नल सर्वर दोनों पीयर को मिलाता है
होल पंच - सीधा UDP पथ स्थापित करना
नॉइज़ हैंडशेक - एन्क्रिप्टेड कुंजी विनिमय
एक बार पूरा होने पर, आप चैट में हैं। टाइप करें और Enter दबाएँ। बाहर निकलने के लिए Esc दबाएँ।
पूरी प्रणाली तीन बाइनरी से मिलकर बनी है, सभी इसी रिपॉजिटरी में शामिल हैं:
| बाइनरी | भूमिका | कब उपयोग किया जाता है |
|---|---|---|
punchline-stund | STUN सर्वर (UDP) - क्लाइंट के बाहरी IP:port के साथ प्रतिक्रिया करता है | केवल सेटअप के दौरान |
punchline-signald | सिग्नल सर्वर (WebSocket) - पीयर को मिलाता है और पतों का आदान-प्रदान करता है | केवल सेटअप के दौरान |
punchline | स्वयं मैसेंजर - CLI, TUI, क्रिप्टो, होल पंचिंग | हमेशा |
प्रारंभिक सेटअप के बाद, STUN और सिग्नल सर्वर से अब संपर्क नहीं किया जाता है। सब कुछ सीधे पीयर-टू-पीयर प्रवाहित होता है।
punchline| कमांड | विवरण |
|---|---|
keygen [--force] [-i path] | एक नई X25519 पहचान कुंजी जोड़ी उत्पन्न करें। बिना पूछे अधिलेखित करने के लिए --force का उपयोग करें। आउटपुट पथ निर्दिष्ट करने के लिए -i का उपयोग करें। |
pubkey [-i path] | अपनी सार्वजनिक कुंजी प्रिंट करें (64 हेक्स अक्षर)। किसी विशिष्ट कुंजी फ़ाइल से व्युत्पन्न करने के लिए -i का उपयोग करें। |
connect <peer> [-i path] [--stun addr] [--signal addr] | उपनाम या कच्ची हेक्स कुंजी द्वारा किसी पीयर से कनेक्ट करें। पहचान कुंजी निर्दिष्ट करने के लिए -i का उपयोग करें। TUI लॉन्च करता है। |
peers | सभी ज्ञात पीयर की सूची बनाएं। |
peers add <name> <key> | किसी पीयर की सार्वजनिक कुंजी को उपनाम के अंतर्गत सहेजें। |
peers remove <name> | उपनाम द्वारा किसी पीयर को हटाएं। |
config path | कॉन्फ़िग फ़ाइल पथ प्रिंट करें। |
config show | वर्तमान कॉन्फ़िगरेशन मान दिखाएं। |
status | पहचान, कॉन्फ़िग, सर्वर पहुँच क्षमता और पीयर संख्या दिखाएं। |
completions <shell> | शेल पूर्णता उत्पन्न करें (bash, zsh, या fish). |
वैश्विक फ़्लैग:
| फ़्लैग | विवरण |
|---|---|
-v | लॉग वर्बोसिटी बढ़ाएं (-v = डीबग, -vv = ट्रेस). |
-q, --quiet | सभी लॉग आउटपुट दबाएं। |
punchline-stund| फ़्लैग | विवरण |
|---|---|
--address <addr> | बाइंड पता (डिफ़ॉल्ट: 0.0.0.0). |
--port <port> | बाइंड पोर्ट (डिफ़ॉल्ट: 3478). |
-v / -vv | डीबग / ट्रेस लॉगिंग। |
-q | मौन मोड। |
punchline-signald| फ़्लैग | विवरण |
|---|---|
--address <addr> | बाइंड पता (डिफ़ॉल्ट: 0.0.0.0). |
--port <port> | बाइंड पोर्ट (डिफ़ॉल्ट: 8743). |
-v / -vv | डीबग / ट्रेस लॉगिंग। |
-q | मौन मोड। |
हर बार --stun और --signal पास करने के बजाय, ~/.config/punchline/config.toml बनाएँ:
stun_server = "203.0.113.10:3478"
signal_server = "203.0.113.10:8743"
punchline peers # सभी सूचीबद्ध करें
punchline peers add alice a1b2c3d4... # जोड़ें
punchline peers remove alice # हटाएं
उपनाम ~/.punchline/known_peers.toml में संग्रहीत किए जाते हैं। आप सीधे 64-अक्षर हेक्स कुंजी के साथ भी कनेक्ट कर सकते हैं।
punchline status
आपकी पहचान, कॉन्फ़िग, सर्वर पहुँच क्षमता (एक वास्तविक STUN जांच और TCP कनेक्ट भेजता है), और पीयर संख्या दिखाता है।
दोनों सर्वर -v (डीबग), -vv (ट्रेस), -q (मौन), --address, और --port का समर्थन करते हैं:
punchline-stund -v --port 3478
punchline-signald -v --port 8743
TUI को ~/.config/punchline/style.toml के माध्यम से अनुकूलित करें
वीडियो में उपयोग की गई शैलियाँ:
[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
सभी रंग हेक्स RGB हैं। यदि फ़ाइल अनुपस्थित है, तो टर्मिनल के डिफ़ॉल्ट रंगों का उपयोग किया जाता है।
punchline completions bash > ~/.local/share/bash-completion/completions/punchline
punchline completions zsh > ~/.zfunc/_punchline
punchline completions fish > ~/.config/fish/completions/punchline.fish
पूर्ण प्रोटोकॉल नाम: Noise_IK_25519_ChaChaPoly_SHA256
| घटक | भूमिका |
|---|---|
| Noise IK | हैंडशेक पैटर्न - आरंभकर्ता प्रतिक्रियाकर्ता की सार्वजनिक कुंजी जानता है। 2 संदेशों में पूरा होता है। |
| X25519 | एलिप्टिक-कर्व डिफी-हेलमैन कुंजी विनिमय (RFC 7748)। 128-बिट सुरक्षा, स्थिर-समय। |
| ChaCha20-Poly1305 | संदेश एन्क्रिप्शन के लिए AEAD सिफर (RFC 8439)। TLS 1.3 और WireGuard में उपयोग किया जाने वाला वही सिफर। |
| SHA-256 | कुंजी व्युत्पत्ति और हैंडशेक हैशिंग के लिए Noise द्वारा आंतरिक रूप से उपयोग किया जाता है। |