تخيل متصفحًا يحمل صفحة HTTPS بينما يصل عميل SSH إلى خادم آخر ويجيب مُحلِّل على استعلام، كل ذلك عبر جلسة OpenVPN واحدة. على الواجهة الفيزيائية ترى محادثة واحدة؛ وداخل النفق ترى ثلاثًا. كلا المنظورين صحيح، ومعرفة السبب هي الفرق بين التقاط مفيد وآخر مربك. تتبَّع تدفقًا داخليًا واحدًا من المقبس حتى السلك، فتتوقف الطبقات عن كونها مجردة.

محادثة خارجية واحدة وتدفقات داخلية كثيرة

كل تطبيق يفتح مقبسه الخاص، ويمنحه النواة مجموعة من خمسة عناصر: عنوان المصدر ومنفذ المصدر وعنوان الوجهة ومنفذ الوجهة والبروتوكول. هذه المجموعات موجودة قبل أن يدخل أي نفق في الأمر. ثم يقرر التوجيه أن جميعها تخرج عبر جهاز النفق، لذا فإن الحزمة التي تُسلَّم إلى OpenVPN ما زالت تحمل الترويسات الأصلية بداخلها. يشفّر OpenVPN تلك الحزمة الداخلية ويلف النتيجة في محادثة UDP أو TCP خارجية واحدة مع الطرف المقابل. لذلك تكون المحادثة الخارجية واحدة، بينما التدفقات بداخلها بعدد ما فتحته التطبيقات.

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

المنفذ الذي يبقى ثابتًا

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

المنافذ الداخلية هي ما تهتم به نقاط الطرف. يحتفظ تدفق HTTPS بمنفذ الوجهة 443 داخل النفق مع أن النقل الخارجي يجلس على المنفذ الذي هيأه المشغل. ولا تعرف نقاط طرف التطبيق شيئًا عن المنفذ الخارجي.

ما الذي يغيّره فك التغليف عند الطرف البعيد

عند الطرف المقابل تُزال الطبقة الخارجية، وتبقى الحزمة الداخلية. ومن هناك ينطبق التمرير وسياسة الوصول على الوجهة والبروتوكول الداخليين. ما زال خادم الويب يستقبل اتصال HTTPS، وما زال عفريت SSH يستقبل SSH، وما زال المُحلِّل يستقبل استعلامًا.

لهذا فإن قاعدة تسمح بالنقل الخارجي ليست القاعدة نفسها التي تسمح بخدمة داخلية. الأولى تصف مسارًا؛ والثانية تصف تخويلًا.

TCP في الخارج يعني تيارًا واحدًا لا اتصالًا واحدًا

حين يكون النقل الخارجي UDP، يكون مصير كل تدفق داخلي مستقلًا: حزمة بيانات ضائعة تؤثر في نقل واحد حتى إعادة إرساله. وحين يكون النقل الخارجي TCP، تتشارك كل التدفقات الداخلية تيار بايت موثوقًا واحدًا.

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

صِف إعدادك أنت بدقة

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

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

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