السلام عليكم ورحمة الله وبركاته،
اليوم أبي أعرفكم على مشروع سعودي مفتوح المصدر اسمه قناة، المشروع حل مشكلة كانت تضايقني وأكيد كثير منكم واجهوها.
المشكلة اللي حلّها قناة
لو حاولت تربط جهازين ببعض عبر WireGuard وأنت ورا CGNAT أو جدار ناري ما تتحكم فيه، تعرف الألم. تحتاج IP عام، أو تفتح بورت، أو تشغّل سيرفر وسيط. قناة جاء عشان يلغي كل هالخطوات.
وش هو قناة؟
قناة هو VPN ندّي (P2P) مفتوح المصدر، مكتوب بـ Rust، متاح على:
الفكرة بسيطة وذكية في نفس الوقت:
- يقرأ ملف WireGuard العادي اللي عندك
- بدل ما يرسل الحزم عبر UDP مباشرة، يغلّفها ويرسلها فوق WebRTC Data Channel
- WebRTC يتولى اختراق الـ NAT تلقائياً عبر ICE/STUN/TURN
- كل الحزم مشفرة بـ ChaCha20-Poly1305 ومفاتيح X25519
النتيجة؟ اتصال مشفر ومباشر بين جهازين، ولو الاثنين ورا NAT وما عندهم IP عام.
المميزات الرئيسية
أمان قوي
تشفير ChaCha20-Poly1305 مع تبادل مفاتيح X25519، مستوحى من نفس آليات WireGuard، مع مفاتيح مشتقة منفصلة لكل اتجاه.
اختراق NAT تلقائي
يستخدم WebRTC مع STUN/TURN عشان يربط الأجهزة حتى ورا CGNAT، بدون ما تفتح بورت أو تغيّر إعدادات الراوتر.
شبكة مش كاملة
يدعم أكثر من قرين في نفس الوقت. ولو ما في اتصال مباشر لوجهة معينة، يمرر الحزمة عبر قرين وسيط في hop واحد بس.
أداء وأمان بـ Rust
مكتوب بلغة Rust، ما تخاف من مشاكل الذاكرة، وأداء عالي. متاح كـ crate على crates.io للتكامل مع مشاريع أخرى.
يقدم
Signaling مرن
افتراضياً يستخدم MQTT (عبر broker.emqx.io) عشان الأقران يكتشفون بعض تلقائياً. ولو تبي تتحكم يدوياً، في وضع offer/answer.
حالات الاستخدام
| الحالة | التفاصيل |
|---|---|
| وصول لـ home lab أو NAS ورا CGNAT بدون خادم مركزي | |
| شبكة مش لـ SSH/RDP بين أفراد الفريق | |
| يمشي فوق WebRTC على منافذ قياسية لو UDP محجوب | |
| ربط شبكتين فوق HTTPS أو MQTT في بيئات مقيّدة | |
| نفق سريع لـ pair programming أو دعم تقني | |
| اختبار 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
كيف يشتغل من الداخل؟
- يقرأ ملف
.confويستخرج المفاتيح والعناوين - يشتق أسرار مشتركة من X25519
- يتبادل signaling عبر MQTT أو يدوياً
- ينشئ WebRTC connection مع ICE/STUN/TURN
- يبني TUN device ويفتح data channel
vpn-tunnel - يشفّر كل الحزم بـ ChaCha20-Poly1305
- يرسل عبر relay في hop واحد لو ما في طريق مباشر
المتطلبات
- نظام Linux مع صلاحيات root (لإنشاء TUN device) او Windows (راح تحتاج wintun) او MAC OS
- اتصال مشترك بـ STUN server واحد على الأقل
المشروع مرخص بـ GPLv2، وأي مساهمة أو ملاحظة تكون حلوة على GitHub.
وش رأيكم؟ جربوه وقولوا لي وين وصلتوا! ![]()