قناة: شبكة وهمية (VPN) مثل WireGuard لكن ندّية (P2P) وتتجاوز CGNAT دون فتح منافذ

السلام عليكم ورحمة الله وبركاته،

اليوم أبي أعرفكم على مشروع سعودي مفتوح المصدر اسمه قناة، المشروع حل مشكلة كانت تضايقني وأكيد كثير منكم واجهوها.


المشكلة اللي حلّها قناة

لو حاولت تربط جهازين ببعض عبر WireGuard وأنت ورا CGNAT أو جدار ناري ما تتحكم فيه، تعرف الألم. تحتاج IP عام، أو تفتح بورت، أو تشغّل سيرفر وسيط. قناة جاء عشان يلغي كل هالخطوات.


وش هو قناة؟

قناة هو VPN ندّي (P2P) مفتوح المصدر، مكتوب بـ Rust، متاح على:

الفكرة بسيطة وذكية في نفس الوقت:

  • يقرأ ملف WireGuard العادي اللي عندك
  • بدل ما يرسل الحزم عبر UDP مباشرة، يغلّفها ويرسلها فوق WebRTC Data Channel
  • WebRTC يتولى اختراق الـ NAT تلقائياً عبر ICE/STUN/TURN
  • كل الحزم مشفرة بـ ChaCha20-Poly1305 ومفاتيح X25519

النتيجة؟ اتصال مشفر ومباشر بين جهازين، ولو الاثنين ورا NAT وما عندهم IP عام.


المميزات الرئيسية

:locked: أمان قوي
تشفير ChaCha20-Poly1305 مع تبادل مفاتيح X25519، مستوحى من نفس آليات WireGuard، مع مفاتيح مشتقة منفصلة لكل اتجاه.

:globe_with_meridians: اختراق NAT تلقائي
يستخدم WebRTC مع STUN/TURN عشان يربط الأجهزة حتى ورا CGNAT، بدون ما تفتح بورت أو تغيّر إعدادات الراوتر.

:spider_web: شبكة مش كاملة
يدعم أكثر من قرين في نفس الوقت. ولو ما في اتصال مباشر لوجهة معينة، يمرر الحزمة عبر قرين وسيط في hop واحد بس.

:high_voltage: أداء وأمان بـ Rust
مكتوب بلغة Rust، ما تخاف من مشاكل الذاكرة، وأداء عالي. متاح كـ crate على crates.io للتكامل مع مشاريع أخرى.

يقدم :satellite_antenna: Signaling مرن
افتراضياً يستخدم MQTT (عبر broker.emqx.io) عشان الأقران يكتشفون بعض تلقائياً. ولو تبي تتحكم يدوياً، في وضع offer/answer.


حالات الاستخدام

الحالة التفاصيل
:house: وصول عن بعد وصول لـ home lab أو NAS ورا CGNAT بدون خادم مركزي
:busts_in_silhouette: فريق صغير شبكة مش لـ SSH/RDP بين أفراد الفريق
:prohibited: WireGuard محجوب يمشي فوق WebRTC على منافذ قياسية لو UDP محجوب
:office_building: Site-to-Site ربط شبكتين فوق HTTPS أو MQTT في بيئات مقيّدة
:high_voltage: جلسات مؤقتة نفق سريع لـ pair programming أو دعم تقني
:test_tube: تطوير واختبار اختبار routing وrelaying في CI أو محلياً

كيف تشغّله؟

البناء

bash

cargo build --release

التشغيل التلقائي (الأسهل)

bash

# على كل جهاز
sudo ./target/release/qanah --config peer.conf

الأجهزة تتصل ببعض تلقائياً عبر MQTT.

التشغيل اليدوي

bash

# الجهاز الأول (Initiator)
sudo ./target/release/qanah --config peer1.conf offer
# انسخ الـ OFFER وأرسله للطرف الثاني

# الجهاز الثاني (Responder)
sudo ./target/release/qanah --config peer2.conf answer
# الصق الـ OFFER، انسخ الـ ANSWER وأرسله للأول

التحقق من الاتصال

bash

ping 10.0.0.2    # IPv4
ping6 fd00::2    # IPv6

خيارات CLI المهمة

خيار الوصف الافتراضي
--config مسار ملف WireGuard مطلوب
--stun STUN servers Google STUN
--turn-url TURN relay server
--signal-server MQTT broker broker.emqx.io:1883
--no-relay إيقاف الـ relay مفعّل

مثال ملف الإعداد

text

[Interface]
PrivateKey = <base64-private-key>
Address    = 10.0.0.1/24, fd00::1/64
MTU        = 1400

[Peer]
PublicKey  = <peer2-public-key>
AllowedIPs = 10.0.0.2/32, fd00::2/128

[Peer]
PublicKey  = <peer3-public-key>
AllowedIPs = 10.0.0.3/32, fd00::3/128

كيف يشتغل من الداخل؟

  1. يقرأ ملف .conf ويستخرج المفاتيح والعناوين
  2. يشتق أسرار مشتركة من X25519
  3. يتبادل signaling عبر MQTT أو يدوياً
  4. ينشئ WebRTC connection مع ICE/STUN/TURN
  5. يبني TUN device ويفتح data channel vpn-tunnel
  6. يشفّر كل الحزم بـ ChaCha20-Poly1305
  7. يرسل عبر relay في hop واحد لو ما في طريق مباشر

المتطلبات

  • نظام Linux مع صلاحيات root (لإنشاء TUN device) او Windows (راح تحتاج wintun) او MAC OS
  • اتصال مشترك بـ STUN server واحد على الأقل

المشروع مرخص بـ GPLv2، وأي مساهمة أو ملاحظة تكون حلوة على GitHub.

وش رأيكم؟ جربوه وقولوا لي وين وصلتوا! :rocket:

إعجابَين (2)