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

من يملك نطاق المنفذ

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

services:
  vpn:
    image: vpn-client-image
    cap_add: [NET_ADMIN]
    ports:
      - "127.0.0.1:8080:8080"
  app:
    network_mode: "service:vpn"

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

اجعل التطبيق يستمع حيث يتوقع النطاق

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

docker compose exec app ss -lntp
docker port vpn
curl -sS -o /dev/null -w '%{http_code}\n' http://127.0.0.1:8080/

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

اختر كيف يدخل مسار الإدارة

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

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

افتح منفذ الإدارة دون فتح كل شيء

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

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

تحقّق من جهاز الإدارة، ثم تحقّق مجددًا لاحقًا

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

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

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