كيف يعمل بروتوكول WireGuard
WireGuard بروتوكول نفق يعمل في الطبقة الثالثة، أي على مستوى حزم IP، وينقلها مشفّرة داخل حزم UDP. يتعرّف كل طرف على الآخر بمفتاح عام طوله 32 بايتاً، ويتفقان على مفاتيح الجلسة في رحلة ذهاب وإياب واحدة. ويرتبط كل مفتاح عام بقائمة عناوين مسموح بها، وهذا الارتباط هو أساس التوجيه كله.
المفاتيح: هوية الطرفين
لكل جهاز في WireGuard مفتاح خاص يبقى عنده، ومفتاح عام يُشتق منه ويُعطى للطرف الآخر. المفتاحان من منحنى Curve25519، وطول العام 32 بايتاً، فيُكتب بترميز Base64 في 44 حرفاً. لا يوجد اسم مستخدم ولا شهادة: المفتاح العام هو هوية الجهاز.
ولا يحدد البروتوكول طريقة لتبادل المفاتيح العامة، فهذا متروك لمن يدير الشبكة، كما في مفاتيح SSH. على لينكس يُنشأ الزوج هكذا:
wg genkey | tee private.key | wg pubkey > public.key
هذه التفاصيل كلها من ورقة WireGuard التي كتبها مصمّمه.
المصافحة: رحلة واحدة ذهاباً وإياباً
تتبع المصافحة نمط IK من إطار Noise للبروتوكولات التشفيرية، واسم البناء الكامل في صفحة البروتوكول هو Noise_IKpsk2_25519_ChaChaPoly_BLAKE2s. الحرف K يعني أن البادئ يعرف المفتاح العام للمستجيب مسبقاً، والحرف I يعني أنه يرسل مفتاحه العام في الرسالة الأولى، مشفّراً.
- رسالة البدء. يولّد البادئ مفتاحاً مؤقتاً جديداً، ويرسل في رسالة واحدة: المفتاح المؤقت، ومفتاحه العام الدائم مشفّراً، وطابعاً زمنياً مشفّراً يمنع إعادة إرسال رسالة قديمة.
- رسالة الرد. يتحقق المستجيب من الرسالة، ويولّد مفتاحه المؤقت، ويرد برسالة تثبت أنه يملك المفتاح الخاص المقابل لمفتاحه العام.
- اشتقاق مفاتيح الجلسة. من تبادل Diffie-Hellman بين المفاتيح المؤقتة والدائمة يشتق الطرفان مفتاحين متماثلين: واحداً للإرسال وآخر للاستقبال.
- أول حزمة بيانات. يرسل البادئ أول حزمة مشفّرة. لا يبدأ المستجيب الإرسال قبل أن يستلمها، فهي تأكيد أن المصافحة اكتملت عند الطرفين.
الخوارزميات ثابتة لا يُتفاوض عليها: Curve25519 للاتفاق على المفاتيح، وChaCha20-Poly1305 لتشفير البيانات والتحقق منها، وBLAKE2s للتجزئة، وHKDF لاشتقاق المفاتيح. وغياب التفاوض مقصود، فهو يزيل طبقة كاملة من التعقيد ومن الهجمات التي تدفع الطرفين إلى خوارزمية أضعف. وإن ظهر ضعف في إحداها، فالحل إصدار جديد يحدّثه الجميع.
والحرفان psk2 في الاسم يشيران إلى مفتاح مشترك مسبق اختياري (PresharedKey) يُخلط في المصافحة طبقةً إضافية فوق المفاتيح العامة.
تجديد المفاتيح والصمت
تُعاد المصافحة تلقائياً كل دقيقتين تقريباً ما دامت البيانات تمر، فتتجدد مفاتيح الجلسة. وبهذا تتحقق السرية الأمامية: من يحصل على مفتاح اليوم لا يفك به حركة الأمس. وتحدد الورقة ثوابت التوقيت: 120 ثانية لبدء مصافحة جديدة، و180 ثانية حداً لا تُقبل بعده أي حزمة بمفتاح قديم.
ولا يرد WireGuard على أي حزمة لا تحمل إثباتاً صحيحاً، ولا يحفظ عنها أي حالة. فمن يفحص المنفذ دون مفتاح صحيح لا يتلقى جواباً. وحين يقع الخادم تحت ضغط، يطلب من البادئ «كعكة» مرتبطة بعنوانه قبل أن ينفّذ الحسابات المكلفة، وهي آلية لصد هجمات الإغراق.
وإن استلم طرف بيانات ولم يكن عنده ما يرسله خلال 10 ثوانٍ، أرسل حزمة فارغة مشفّرة ليؤكد أن الجلسة حية. وحين لا تمر بيانات في أي اتجاه يصمت الخط تماماً. لذلك يتيح الخيار PersistentKeepalive إرسال حزمة دورية لمن يحتاج إبقاء مدخل NAT مفتوحاً.
توجيه المفاتيح وAllowedIPs
تسمي الورقة الفكرة الأساسية «توجيه المفاتيح» (cryptokey routing): لكل طرف مفتاح عام وقائمة عناوين في الحقل AllowedIPs. والقائمة الواحدة تعمل في الاتجاهين:
- عند الإرسال يبحث WireGuard عن عنوان وجهة الحزمة في القوائم، فيعرف الطرف الذي ستذهب إليه والمفتاح الذي يشفّرها به. إن لم يطابق أي طرف أُسقطت الحزمة.
- عند الاستقبال يفك تشفير الحزمة، ثم يتحقق أن عنوان مصدرها الداخلي يقع في قائمة الطرف نفسه الذي شُفّرت بمفتاحه. إن لم يقع أُسقطت.
فكل حزمة تخرج من واجهة WireGuard تحمل عنوان مصدر موثوقاً، ويكفي جدار حماية بسيط للتمييز بين الأطراف. وهذا ملف إعداد نموذجي لجهاز يرسل كل حركته عبر خادم واحد:
[Interface]
PrivateKey = <client-private-key>
Address = 10.8.0.2/32
DNS = 10.8.0.1
[Peer]
PublicKey = <server-public-key>
Endpoint = vpn.example.net:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
القيمة 0.0.0.0/0, ::/0 تعني كل عناوين IPv4 وIPv6، أي أن النفق يحمل الحركة كلها. وتضيف أداة wg-quick مسارات النظام من هذه القائمة. أما المسار الافتراضي فتعالجه بقواعد توجيه خاصة كي لا تدخل حزم النفق نفسها في النفق، كما يشرح دليل wg-quick.
أما السطر DNS فخيار في هذه الأداة، لا جزء من البروتوكول. وتضييق القائمة إلى شبكات بعينها هو ما يُسمى النفق المنقسم.
والحقل Endpoint اختياري في أحد الطرفين. فالخادم يتعلم عنوان العميل من آخر حزمة صحيحة وصلته منه. لهذا ينتقل الهاتف من Wi-Fi إلى بيانات الجوال دون أن ينقطع النفق.
مقارنة عامة بـ IPsec وOpenVPN
| WireGuard | IPsec مع IKEv2 | OpenVPN | |
|---|---|---|---|
| الطبقة | الثالثة فقط | الثالثة | الثالثة أو الثانية |
| النقل | UDP فقط | UDP على المنفذين 500 و4500 | UDP أو TCP |
| الاتفاق على المفاتيح | رسالتان وفق Noise IK | أربع رسائل في الحالة المعتادة | مصافحة TLS |
| الخوارزميات | ثابتة | يُتفاوض عليها | يُتفاوض عليها |
| مكان التشغيل | نواة لينكس، وتطبيقات لبقية الأنظمة | مدمج في كثير من أنظمة التشغيل | برنامج في مساحة المستخدم |
بروتوكول IKEv2 معيار إنترنت كامل في RFC 7296، يتفق فيه الطرفان عبر تبادلين هما IKE_SA_INIT وIKE_AUTH على ارتباطات أمان تحمي حركة IPsec. ومرونته في الخوارزميات وطرق التحقق تجعله مناسباً للشركات، وتجعل إعداده أصعب.
أما OpenVPN فيبني على TLS ويعمل خارج النواة، وتذكر ورقة WireGuard أن ذلك يكلّفه نسخ الحزم مرات بين النواة والبرنامج. ميزته العملية أنه يستطيع العمل فوق TCP.
كيف تفحص نفق WireGuard
على لينكس يعرض هذا الأمر حالة كل طرف:
sudo wg show
latest handshake: إن غاب هذا السطر فلم تكتمل أي مصافحة. الأسباب المعتادة مفتاح عام خاطئ، أوEndpointخاطئ، أو منفذ UDP محجوب في الطريق.transfer: إن زاد المُرسل وبقي المستلَم صفراً، فالحزم تخرج ولا يعود منها رد.
بعد ذلك تحقق من العنوان الظاهر في أداة عنوانك. وفي تطبيقات WireGuard الرسمية للأنظمة الأخرى تظهر المعلومات نفسها في تفاصيل النفق.
نصائح عامة للاستخدام
- اجعل لكل جهاز مفتاحه الخاص. لا تنسخ ملفاً واحداً إلى جهازين، ولا ترسل المفتاح الخاص في رسالة أو بريد.
- إن احتجت الحركة كلها في النفق، فتأكد أن
AllowedIPsيشمل::/0أيضاً، أو أن IPv6 معطّل، وإلا قد تخرج حركة IPv6 خارجه. - WireGuard لا يحاول إخفاء أنه WireGuard. شكل حزمه معروف، وبعض الشبكات تحجب UDP أو تقيّده.
WireGuard في syriaproxy
نقدّم WireGuard لآيفون وآيباد وماك والراوتر: تنشئ في حسابك ملفاً لكل جهاز وتستورده في التطبيق الرسمي. يخرج الاتصال من شبكة سيريتل للجيل الرابع داخل سوريا، وIPv6 محجوب داخل النفق لأن الشبكة IPv4 فقط. الخطوات في إعداد WireGuard.
أسئلة شائعة
هل يعمل WireGuard فوق TCP؟
لا. البروتوكول يستخدم UDP وحده. إن كانت الشبكة تحجب UDP، فلن يعمل النفق دون أداة خارجية تغلّفه.
لماذا يظهر النفق «مفعّلاً» مع أن الإنترنت لا يعمل؟
لأن WireGuard لا يملك حالة «متصل». تفعيل النفق يضيف الواجهة والمسارات فقط، والمصافحة تحدث عند أول حزمة. افحص سطر latest handshake لتعرف إن وصل الخادم فعلاً.
ماذا يحدث إن استخدمت الملف نفسه على جهازين؟
يرى الخادم مفتاحاً واحداً، فيرسل الرد إلى الجهاز الذي وصلته منه آخر حزمة. ينقطع الاتصال على الجهازين بالتناوب.
هل WireGuard أكثر أماناً من OpenVPN؟
كلاهما آمن حين يُضبط جيداً. ميزة WireGuard أن شيفرته صغيرة وخوارزمياته ثابتة، فمراجعته أسهل وأخطاء الإعداد فيه أقل.
افحص نفقك الآن بأداة فحص تسريب DNS المجانية.