مفتاح الإيقاف يحجب خادم VPN قبل أن يتدفق أي مرور
أي مرحلة يحجبها مفتاح الإيقاف: بحث نقطة النهاية، والمسار الخارجي، ومسار العودة، واستثناءات الأقران القديمة، مع عدادات بدلًا من التخمين.
تفشل مفاتيح الإيقاف في اتجاه لا يتوقعه الناس: فهي مبنية لحجب المرور أثناء تعطل النفق، والحزم التي تبني النفق هي نفسها مرور. هذا هو الخلل كله. مجموعة القواعد التي تُسقط كل ما لا يخرج عبر النفق تُسقط أيضًا المصافحة التي من شأنها أن ترفعه، فيعيد العميل المحاولة في حلقة، ويعود الخطأ إلى المرحلة التي تُفحص أولًا. قبل توسيع جدار حماية، اكتشف أي المراحل الثلاث يجري رفضه: بحث الاسم، أو الحزمة الخارجية إلى القرين، أو الرد العائد.
كيف يعتمد النفق على ناقله الخاص والعكس
اقرأ عميل VPN كحالتين شبكيتين تشتركان في مسار مقبس واحد. قبل أن يوجد النفق، يفتح العميل مقبسًا على المحول الفيزيائي ويرسل إطارات مشفرة إلى عنوان القرين ومنفذه. ولا ينشئ جهاز النفق ويثبت المسارات إلا بعد نجاح ذلك التبادل. ومفتاح الإيقاف سياسة تخص الحالة الثانية، كُتبت على نحو واسع حتى تنطبق على الحالتين.
القواعد المبنية على الواجهة هي الشكل المعتاد: اقبل ما يخرج عبر tun0 أو wg0، وأسقط بقية مسار الخروج. هذه الصيغة لا تستطيع استثناء اتصال العميل نفسه بالخادم، لذا يضيف التنفيذ الصحيح ذلك الاستثناء صراحةً، وهكذا تفعل أنت أيضًا عند كتابة القواعد يدويًا. قواعد كل تطبيق على Windows وmacOS تتفادى جزءًا من هذا بمطابقة عملية بدل واجهة، لكن العملية ما زالت بحاجة إلى الخروج قبل أن يوجد النفق.
ثلاث مراحل، بالترتيب الذي تحدث فيه
المرحلة الأولى هي التحليل. عندما يخزّن الملف الشخصي اسم مضيف بدلًا من عنوان حرفي، يحتاج العميل إلى إجابة DNS قبل أن يرسل أي شيء. والملف الذي يوجّه DNS إلى محلل النفق يخلق طريقًا مسدودًا: فلا يمكن الوصول إلى المحلل إلا عبر النفق الذي يُفترض أن يتيحه البحث. والتحليل خارج النفق، أو تثبيت نقطة النهاية على عنوان، يزيل هذا الالتباس.
المرحلة الثانية هي الحزمة الخارجية، التي يجب أن تصمد أمام التوجيه ثم أمام جدار الحماية، بهذا الترتيب. وتتولى wireguard-tools نصف التوجيه في هذا لـ WireGuard عبر تعليم حزمها وإضافة قاعدة سياسة حتى تتجاوز المسار الافتراضي الذي ثبته للتو؛ أما صفحة دليل wg-quick فتشرح تلك القاعدة والجدول الذي تستخدمه. أعد بناء ذلك التوجيه يدويًا، أو دع أداة ثانية تعيد كتابة القواعد، وقد تُعاد الحزم المعلّمة إلى النفق الذي يُفترض أن تنشئه.
المرحلة الثالثة هي مسار العودة. فمصافحة بلا رد ليست دليلًا على إسقاط صادر؛ وهي متسقة بالقدر نفسه مع قاعدة واردة على الخادم أو جهاز NAT نسي التعيين. افصل بين هذه وتلك قبل أن تلمس العميل.
| What you see | Stage | Where to look |
|---|---|---|
| The client log repeats a resolve step and no packets appear on the wire | 1, name lookup | Resolver path while the tunnel is down |
| The send counter on the physical adapter stays flat | 2, routing | Peer route and policy rules |
| The send counter rises and a firewall drop counter rises | 2, firewall | Rule order, mark, and interface match |
| Packets leave and nothing comes back | 3, return path | Server input rules, NAT, listening port |
تسجّل العملاء العَرَض الذي ترصده، لا المرحلة التي فشلت، لذا فالجدول عادةً أسرع من السجل.
العدادات تحسم أسرع من السجلات
على Linux، nft list ruleset أو iptables -vnL OUTPUT يطبع عداد حزم لكل قاعدة. اتصل مرة واحدة، ودعه يفشل، ثم اقرأ العدادات مرة أخرى. القاعدة التي تحرك عدادها هي قاعدة اصطدمت بها المصافحة؛ وإذا لم يتحرك شيء في أي موضع، فالحزمة لم تصل إلى جدار الحماية قط. لقد رأيت مجموعة قواعد تُسقط مصافحتها هي، ولم تقل ذلك إلا العدادات.
للفصل بين ما لم يصل إلى جدار الحماية قط وما لم يغادر المضيف قط، راقب الواجهة نفسها. ip -s link show dev wlan0 يبلّغ عن الحزم المرسلة، و tcpdump -ni wlan0 udp port 51820 يعرض الإطارات. وإذا بقي ثابتًا بينما يعيد العميل المحاولة، فالعطل أعلى من netfilter: مسار قرين مفقود، أو قاعدة سياسة تشير إلى جهاز لم يوجد بعد، أو خطأ مقبس يبتلعه العميل.
اختبر الاستثناءات على عناوين توثيقية مثل 203.0.113.10، حتى لا يتمكن زلق ما من فحص مضيف شخص آخر.
استثناء نقطة نهاية قديم يُقرأ كتعطل خادم
يظهر أكثر النسخ تضليلًا بعد تغيّر عنوان القرين: خدمة عنوان ديناميكي نقلته، أو أعيد بناء المضيف، أو اختلف عنوان الخروج في شبكتك. الاستثناء ما زال يذكر العنوان القديم، فتصطدم الحزم المتجهة إلى العنوان الجديد بقاعدة الإسقاط. وقد عملت التهيئة نفسها أمس، ولهذا يبدأ الناس باستكشاف الخادم.
اسم المضيف داخل قاعدة جدار حماية لا ينقذك. ففي nftables يُحلّ الاسم عند تحميل مجموعة القواعد، فيثبّت أي عنوان كان موجودًا في تلك اللحظة ويصبح قديمًا كالعنوان الحرفي. والإصلاح الدائم هو تحديث الاستثناء عندما تتغير نقطة النهاية وإبقاؤه ضيقًا: عنوان قرين واحد، ومنفذ نقل واحد. والنطاق العريض بما يكفي لتحمل تغيّر العنوان عريض أيضًا بما يكفي لإخراج مرور غير ذي صلة.
عندما يعمل مفتاح الإيقاف على مضيف الخادم
الاعتماد نفسه موجود في الطرف الآخر، ومن الأسهل تفويته هناك. فإذا كانت الآلة التي تعمل كخادم VPN لديك تشغّل أيضًا عميل سطح مكتب بمفتاح إيقاف، أو ملف جدار حماية منسوخًا من حاسوب محمول، فإن قواعد الإسقاط فيه تنطبق على الخدمة التي تُنهي الأنفاق. فتُسقط الردود على مصافحة العميل، فيفشل كل عميل في الاتصال بينما يبدو الخادم سليمًا وواجهة نفقه جالسة دون استخدام.
يحتاج ذلك المضيف إلى ثلاثة قبولات ضيقة قبل الإسقاط: منفذ الاستماع على الواجهة الفيزيائية، وواجهة النفق للمرور المفكوك التشفير، والتحويل من النفق نحو ما يُفترض أن يصل إليه العملاء. اقرأ المجموعة المثبتة باستخدام nft list ruleset، iptables -S، أو pfctl -sr قبل تغيير أي شيء، وتذكّر أن مجموعة قواعد محفوظة تنجو من إعادة التشغيل، فالخطأ هناك يعيش أطول من العملية التي ارتكبته.
ترتيب استعادة يبقي الآلة مغلقة
اعمل من الملف الشخصي نحو الخارج. اقرأ عنوان القرين ومنفذه الذي يستخدمه العميل، وتأكد من أن اسم المضيف يُحلّ دون النفق، ثم أضف استثناءً واحدًا لذلك العنوان والمنفذ على المحول الفيزيائي فقط. أعد الاتصال وراقب عداد الإرسال؛ فالمصافحة المكتملة هي الإشارة إلى أن المرحلة الثانية أصبحت سليمة.
اترك بقية سياسة الإسقاط في مكانها أثناء الاختبار. والفحص غير الضار هو محاولة اتصال بعنوان توثيقي غير ذي صلة والتأكد من أنه ما زال ينتهي بمهلة، وهذا يُظهر أن مفتاح الإيقاف يعمل لا أنه مُطفأ. شدّد الاستثناء بمجرد أن يستقر النفق، ولا تترك سماحًا دائمًا للكل لبرنامج العميل لأنه مريح.
إذا نهض النفق وظل التطبيق يفشل، فالمراحل المتبقية ليست هذه: فـ DNS المنقسم، وMTU، والتوجيه لكل تطبيق، كلها تنتج نفقًا متصلًا بمرور معطوب، ولكل منها فحص أول مختلف.