كيف تُخرج خادم VPN من الخدمة دون أن تترك وصولًا خلفه
سِر من تطبيق العميل إلى الخارج: أبطِل المفاتيح والحسابات، وأغلق المستمع، ثم أثبت أن لا ملف تعريف ولا سجل DNS ولا نسخة احتياطية يمكنها الوصول إليه.
لا يزال عميلك يتصل في اليوم الذي تُفتح فيه تذكرة الإيقاف. يوجد ملف تعريف في التطبيق، فيتفاوض، ويصعد النفق كأن شيئًا لم يتغير. هذه هي اللحظة للعمل في الاتجاه المعاكس لطريقة بنائك للخدمة: ابدأ من قائمة العملاء، ثم اتجه للخارج نحو المستمع، ثم إلى الجدار الناري، وانتهِ ببيانات الاعتماد التي تعيش أطول من كل ذلك. إيقاف تشغيل الآلة الافتراضية هو الخطوة الأخيرة، لا الأولى. يفترض هذا الدليل أن لديك وصولًا إلى وحدة التحكم على المضيف وصلاحية تعديل سجلات العملاء وDNS.
ابدأ بقائمة العملاء
افتح أي شيء يوزّع ملفات التعريف لديك واقرأ القائمة قبل أن تلمس الخادم. كل مُدخل هو جهاز يظن أن لديه وصولًا: هواتف، حواسيب محمولة، موجّه فرعي، حاوية تتزامن كل ليلة. صدّر تلك القائمة إلى التذكرة، لأنه بمجرد اختفاء المضيف لن يوجد wg show ليخبرك من كان متصلًا.
صنّف كل جهاز إلى نقطة نهاية بديلة، أو لم تعد مطلوبة، أو غير معروفة. دلو المجهول هو المهم، لأنها ملفات التعريف التي سيجدها أحدهم في درج بعد أشهر ويجرّبها. أرسل الإشعار على القناة نفسها التي تستخدمها لطلبات الوصول، وضع فيه تاريخًا لتوقف نقطة النهاية القديمة عن الرد.
أبطِل الهوية، لا الملف وحده
هناك إجراءان مختلفان يُسمّى كلاهما إبطالًا. في WireGuard، لا يُصرَّح للنظير إلا بمفتاحه العام الظاهر في قسم نظير مع مُدخل AllowedIPs، لذا حذف ملف الإعداد من الحاسوب المحمول لا يغيّر شيئًا على الخادم. أزل كتلة النظير وأعد تطبيق الملف دون إسقاط النظراء الذين تحتفظ بهم، كما يصف دليل wg(8):
wg show
wg set wg0 peer <CLIENT_PUBLIC_KEY> remove
wg syncconf wg0 <(wg-quick strip wg0)wg syncconf هو الجزء الذي يوفّر عليك نافذة صيانة. إنه يعيد بناء الواجهة من الملف في مكانها، لذا إزالة نظير واحد لا تهدم النفق الذي يستخدمه الجميع. إذا كنت تُوقف المضيف كله لا نظيرًا واحدًا، فالترتيب ما زال مهمًا، لأن تلك المفاتيح قد تكون موثوقة في مكان آخر.
مع إعداد X.509 تكون خطوة الإبطال هي الشهادة، لا الملف: openssl ca -revoke client.crt ثم openssl ca -gencrl -out crl.pem. لذلك أثر فقط حيث يقرأه المدقّق، ما يعني خادم OpenVPN مع crl-verify مُهيَّأ ثم أُعيد تحميله بعد ذلك. إذا كانت هذه البوابة المستهلك الوحيد لتلك الجهة المصدرة، تتوقف قائمة الإبطال عن الأهمية يوم تموت؛ وإذا كانت الجهة نفسها توقّع لبوابة ثانية، فشهادة لم تُبطلها قط تظل تعمل هناك.
الحسابات هي الحالة الثالثة والأكثر إغفالًا. عندما كانت البوابة تصادق ضد RADIUS أو LDAP أو مزوّد هوية مستضاف، يعيش الحساب خارج الـ VPN. عطّله في الدليل. حذف مقطع مستخدم على الخادم يترك بيانات اعتماد صالحة ستقبلها نقطة النهاية البديلة لحظة توجّهها إلى الدليل نفسه.
أغلق المستمعين والمسارات المؤدية إليهم
أوقف الخدمة بطريقة تصمد أمام إعادة التشغيل، ثم أكّد بقائمة مقابس لا بحالة الوحدة. systemctl disable --now wg-quick@wg0 يوقف الواجهة ويزيل المسارات والقواعد التي أضافها wg-quick؛ systemctl disable --now openvpn-server@server يفعل الشيء نفسه لنسخة OpenVPN قالبية. أتبع أيًّا منهما بـ ss -lunp وss -ltnp. النتيجة الفارغة للمنفذ القديم هي الدليل الوحيد الذي يُعتد به.
ما أضافه wg-quick يزيله wg-quick. أما ما أضفته يدويًا فيبقى: قاعدة NAT دائمة، وسماح في الجدار الناري، وتحويل منفذ في الموجّه، وقاعدة دخول في مجموعة أمان سحابية، ومستمع موازن تحميل. هذه تحتاج إزالة صريحة، وكذلك سجل DNS، أي سجل A وAAAA وأي CNAME يشير إلى الاسم. الاسم الذي يُحلّ إلى مضيف ميت يفشل بشكل مختلف عن اسم لا يُحلّ، وهذا الفرق سيكلّف أحدهم بعد الظهر.
النسخة التي تنساها هي المستنسخة. لقطة أو آلة افتراضية مستعادة من نسخة احتياطية ما زالت تحمل مفاتيح المضيف وقائمة النظراء القديمة، وإذا أعادها شيء إلى العنوان نفسه، يعيد العملاء الاتصال بخدمة تظنها متوقفة. ضع على مجموعة النسخ الاحتياطية وسم أنها تخص خدمة مُخرَجة من الخدمة وأبقِها خارج مسارات الاستعادة التلقائية.
تابع ما لا يزال يشير إلى نقطة النهاية القديمة
ملفات التعريف المخزّنة تتجاوز DNS. الإعداد المحفوظ بعنوان رقمي يستمر في الاتصال بعد زوال السجل، والعميل الدائم يعيد المحاولة عند كل تغيير شبكة. هذا ضجيج لا وصول، لأن المستمع مغلق، لكن معرفة أي الحالتين تنظر إليه تحدّد كيف ترد على التذكرة.
ثم امسح الاعتماديات التي لا يضعها أحد تحت VPN: فحوصات الجهوزية التي تتحسس المنفذ، ومهام النسخ الاحتياطي التي سحبت إعدادات من المضيف، وبيانات اعتماد الأتمتة المستخدمة لدفع مُدخلات النظراء، وحسابات الاستعادة التي أُنشئت لهذه النهاية وحدها. كل منها مسار وصول بعمره ومالكه، لذا كل واحد يأخذ قرارًا بدل حذف صامت.
تحقّق، ثم اكتبه
ينتهي الإيقاف عندما يفشل اختبار من الخارج بالطريقة التي تتوقعها. من شبكة لا تتحكم بها، اتصل بالعنوان والمنفذ القديمين. النتيجة المُرشّحة أو المرفوضة هي حالة النجاح. في تطبيق العميل، أكّد أن ملف التعريف أُزيل لا أُطفئ، وأن لا ملف تعريف إدارة يعيد إضافته بهدوء.
ثم سجّل ما فعلت: نقطة النهاية، والتاريخ، والمفاتيح والشهادات المُبطلة، والحسابات المعطّلة، وأين تعيش النسخ الاحتياطية. من يجد إعدادًا قديمًا لاحقًا يحتاج إلى جواب هل أُبطل أم حُذف فقط، دون تخمين، وجدول قصير في التذكرة يفعل ذلك.
قبل إغلاق التذكرة:
- ملفات تعريف العملاء أُزيلت أو استُبدلت، والأجهزة المجهولة حُسمت
- النظراء أُزيلوا وأُعيد تطبيق الإعداد، أو الشهادات أُبطلت ونُشرت قائمة الإبطال
- حسابات الدليل عُطّلت، لا حُذفت الملفات المحلية فقط
- الخدمة عُطّلت، ولا مستمع بقي على المنفذ القديم
- الجدار الناري وتحويل المنفذ ومجموعة الأمان وسجلات DNS أُزيلت
- النسخ الاحتياطية موسومة، واللقطة مستبعدة من مسارات الاستعادة
- بيانات اعتماد المراقبة والأتمتة أُوقفت
تحقّق من البديل بشكل منفصل، من عميل لم يحمل الملف القديم قط. ذلك الاختبار الواحد يخبرك هل أوقفت خدمة أم أعدت تسمية المشكلة فقط.