
مراسل مشفر نظير لنظير مكتوب بلغة Rust مع Noise IK و UDP NAT hole punching
محادثة ند-لند مشفرة من طرف إلى طرف عبر UDP. لا حسابات، ولا خادم مركزي يقوم بتوجيه/تخزين الرسائل، ولا وسيط. فقط نظيران، اتصال مباشر، وتشفير بروتوكول Noise.
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
انتظار النظير - خادم الإشارة يطابق كلا النظيرين
اختراق NAT - إنشاء مسار UDP المباشر
مصافحة Noise - تبادل المفاتيح المشفر
بمجرد الاكتمال، تكون في المحادثة. اكتب ثم اضغط Enter. اضغط Esc للخروج.
يتكون النظام بأكمله من ثلاثة ملفات تنفيذية، كلها مضمنة في هذا المستودع:
| الملف التنفيذي | الدور | متى يُستخدم |
|---|---|---|
punchline-stund | خادم STUN (UDP) - يرد بعنوان IP العام للعميل:المنفذ | أثناء الإعداد فقط |
punchline-signald | خادم الإشارة (WebSocket) - يطابق النظائر ويتبادل العناوين | أثناء الإعداد فقط |
punchline | برنامج المراسلة نفسه - CLI، TUI، تشفير، اختراق NAT | دائمًا |
بعد الإعداد الأولي، لا يتم الاتصال بخوادم 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> | إنشاء إكمالات أوامر 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 | نمط المصافحة - يعرف البادئ المفتاح العام للمستجيب. يكتمل في رسالتين. |
| X25519 | تبادل مفاتيح Diffie-Hellman على المنحنى الإهليلجي (RFC 7748). أمان 128 بت، وقت ثابت. |
| ChaCha20-Poly1305 | تشفير AEAD لتشفير الرسائل (RFC 8439). نفس التشفير المستخدم في TLS 1.3 و WireGuard. |
| SHA-256 | يُستخدم داخليًا بواسطة Noise لاستخلاص المفاتيح وتجزئة المصافحة. |
يعني نمط IK أن البادئ يعرف المفتاح العام الثابت للمستجيب قبل بدء المصافحة. كلا النظيرين لديهما بالفعل مفاتيح بعضهما البعض (تم تبادلها خارج النطاق أو عبر سجل النظائر)، لذا لا حاجة إلى الثقة عند أول استخدام.
يحدد Punchline البادئ بشكل حتمي بمقارنة أول 8 بايتات من المفتاح العام لكل نظير كعدد صحيح u64 كبير النهاية. النظير ذو القيمة الأصغر يصبح البادئ. يقوم كلا الجانبين بحساب هذا بشكل مستقل.