يعود النفق، ويقول العميل إنه متصل، بينما ما زال المتصفح يدور على صفحة كان يحمّلها قبل الانقطاع. إعادة اتصال VPN تستعيد مسارًا، ولا تستعيد حالة الاتصال التي جمعتها التطبيقات والطرف البعيد على المسار القديم. هذان أمران مختلفان في الإصلاح، والخلط بينهما يعيدك إلى إعدادات VPN بلا سبب.

اختبار واحد يفصل بينهما بوضوح، ولا يستغرق سوى عشر ثوان. أرسل طلبًا جديدًا إلى الوجهة نفسها بينما الطلب القديم معلّق.

ما ينجو من إعادة الاتصال وما لا ينجو

النفق مجموعة من المسارات والمفاتيح والعناوين، وإعادة الاتصال قد تستعيد الثلاثة كلها بينما يبقى كل تدفق قائم ميتًا. يُبقي نظام التشغيل مقبسًا مفتوحًا لأن التطبيق طلب ذلك، وقد تكون مهلة ذلك المقبس دقائق أو ساعات. وفي العمق، نسي الطرف المقابل التدفق، أو انتهت صلاحية إدخال ترجمة، أو أن المسار يمر الآن عبر نقطة نهاية لم ترَ المصافحة قط. لا شيء في تسلسل إعادة الاتصال يمر على مقابس التطبيق ويصلحها.

بعض العملاء يضيفون خطافًا يُسقط الاتصالات القديمة عند إعادة الاتصال، ومعظمهم لا يفعل. يختلف السلوك هنا بحسب العميل والنظام الأساسي والإصدار.

الطرف البعيد نسيك أنت أيضًا

يحتفظ الطرف البعيد بحالة خاصة به: جلسة TLS، وكتلة تحكم TCP، وربما إدخال تعيين يربط عنوانك ومنفذك بالتدفق. ويمكن لجهاز ترجمة على المسار أن يُنهي صلاحية ذلك التعيين خلال الفجوة حتى لو عاد النفق سريعًا. وبمجرد اختفاء التعيين، تصل الحزم لتدفق لم يعد الخادم يتعرف عليه، وقد يكون الرد إعادة تعيين لا يُظهرها العميل أبدًا. تُبلّغ التطبيقات عن ذلك كتوقف لا كخطأ، لأنها ما زالت تنتظر مقبسًا لن يجيب أبدًا.

مهلات الخمول على جانب الخادم تفعل الشيء نفسه وفق جدولها الخاص، ولهذا قد تموت جلسة دون أي حدث شبكي على الإطلاق. الاتصال الذي ظل خاملًا أطول مما يتوقعه الخادم يكون قد ذهب قبل أن تلاحظ تحرك النفق.

الطلب الجديد هو الاختبار الذي يفصل بينهما

أرسل طلبًا جديدًا إلى المضيف نفسه بينما الطلب القديم ما زال معلّقًا، وراقب الاثنين. إذا نجح الطلب الجديد، فالنفق والمسار وتحليل الأسماء كلها تعمل، والعطل محصور في التدفق القديم. وإذا فشل الطلب الجديد أيضًا، فلديك مشكلة في المسار وحالة جلسة التطبيق مجرد تضليل.

أبقِ أي حظر لحركة المرور المباشرة قائمًا أثناء الاختبار. الطلب الذي ينجح عبر مسار احتياطي عارض لا يثبت شيئًا عن النفق.

أكّد باتصال جديد، لا بالقديم

تعرض الأوامر أدناه المقابس التي ما زالت مفتوحة، وتبدأ طلبًا جديدًا واحدًا، وتتحقق مما إذا كان جدول الجلسات ما زال يحتفظ بإدخال للتدفق. شغّل الأمر الأول قبل إعادة الاتصال وبعدها ليظهر الفرق. استبدل المضيف والمنفذ بخدمتك أنت.

ss -tanp | grep -E ':(443|8443)'
curl -sS -o /dev/null -w '%{http_code} %{time_connect}\n' --max-time 8 https://intranet.example.com/
conntrack -L 2>/dev/null | grep 8443
dig +short intranet.example.com

المقبس القائم الذي لا تتحرك فيه أي حركة هو السمة التي تبحث عنها، والطلب الجديد الذي يعيد رمز حالة يبيّن أن المسار حي. ويجيب جدول الاتصالات عمّا إذا كان شيء ما ما زال يعيّن التدفق، وهو الجزء الذي لا يستطيع العميل رؤيته. ويغطي استعلام المُحلّل النصف الآخر من تحميل الصفحة، لأن فشل الاسم واتصالًا متوقفًا يبدوان متطابقين في المتصفح. ومعًا، تفصل هذه المخرجات الأربعة بين جلسة قديمة ونفق معطوب.

سجّل وقت الانقطاع، ووقت إعادة الاتصال، والفرق بين الطلب القديم والجديد. هذا السجل يحوّل شكوى غامضة إلى تقرير يمكن لشخص أن يتصرف بناءً عليه.

مقالات ذات صلة