JConsole يتصل بالسجل، ثم يرسله RMI إلى مكان آخر
استجابة منفذ السجل ليست سوى القفزة الأولى. قد يعلن خادم JMX بعيد مضيفًا آخر ومنفذ موصل آخر، وعلى النفق أن يصل إلى الاثنين.
اتصل بمنفذ السجل عبر النفق، وراقب بداية المصافحة، ثم راقب JConsole وهو ينتهي بمهلة على أي حال. يحدث ذلك لأن اتصال TCP الأول ليس اتصال الإدارة: إنه بحث. يجيب سجل RMI بمرجع يسمّي مضيفًا ومنفذًا ثانيًا، ثم يذهب JConsole إلى حيث أُخبر. إذا كان النفق يصل إلى المنفذ الأول للخادم فقط، أو كان المرجع يسمّي عنوانًا موجودًا فقط في الشبكة المحلية للخادم نفسه، يتوقف العميل بعد نجاح ظاهري.
الأسطورة: منفذ مفتوح واحد يعني اتصالًا واحدًا
يتضمن JMX البعيد عبر RMI نقطتي نهاية على الأقل، ويختارهما جزءان مختلفان من النظام. منفذ السجل هو ما تكتبه في العميل، وموجود لتسليم الـ stub الذي يصف الموصل الفعلي. اعتبار أول مقبس ناجح دليلًا على أن مسار الإدارة مفتوح هو ما يحوّل تشخيصًا مدته دقيقتان إلى بعد ظهر كامل من تذاكر جدار الحماية.
انظر إلى خطأ العميل نفسه لا إلى قائمة المستمعين على الخادم. فشل بعد بدء المصافحة يخبرك بأن الاتصال الثاني، لا الأول، لم يكتمل.
ما يعيده السجل
يحتوي الـ stub على عنوان ومنفذ، مُسلسلين في اللحظة التي أُنشئ فيها الموصل. على خادم بعدة واجهات، ربما اختارت الحزمة عنوانًا يمكن الوصول إليه من الشبكة المحلية ولا يمكن الوصول إليه من شبكتك. لا يعرف العميل الفرق؛ إنه ببساطة يطلب القيمة التي أُعطيت له، وتتبع الحزمة المسار الموجود لذلك العنوان، وهو على عميل VPN غالبًا غير موجود إطلاقًا. تلك هي اللحظة التي يُحاول فيها الاتصال الثاني.
ولهذا أيضًا يكون الفشل متقطعًا بين البيئات: قد يتصرف الخادم نفسه بشكل مختلف لمستخدم على الشبكة المحلية ولمستخدم على النفق، دون أي تغيير في تهيئة JMX.
منفذان وخاصيتان تثبّتانهما
يأتي منفذ السجل من com.sun.management.jmxremote.port، ويمكن تثبيت الموصل بـ com.sun.management.jmxremote.rmi.port بدلًا من تركه لما تخصصه الحزمة. اضبط الاثنين صراحةً عندما يكون بين العميل والخادم جدار حماية أو مجموعة أمان، لأن منفذًا ثانيًا غير متوقع لا يمكن السماح به مسبقًا، ونطاق واسع يُفتح لاستيعابه أسوأ من تثبيت قيمة واحدة.
ثم أكّد باستخدام ss -ltn أو netstat -an على الخادم أن المنفذين يستمعان وعلى أي عناوين. المستمع المربوط بـ loopback صحيح لنشر محلي بالكامل وغير مفيد لهذا الغرض.
عندما يكون الاسم المعلن خاطئًا
يُضبط اسم المضيف الظاهر في المرجع البعيد بواسطة java.rmi.server.hostname. يؤثر في ما يعلنه الـ stub؛ وهو بحد ذاته ليس تعليمًا بربط كل مستمع بواجهة واحدة، ولهذا لا ينتج ضبطه دائمًا سلوك المنفذ الواحد المتوقع. اضبطه، ثم أعد تشغيل العملية، ثم تحقق مما يحتويه الـ stub فعليًا. اختر اسمًا أو عنوانًا يستطيع العميل تحليله والوصول إليه عبر النفق، وأعد تشغيل العملية كي يُعاد بناء الـ stub.
تزيد شبكات الحاويات الأمر سوءًا، لأن العنوان الذي تراه العملية قد يكون داخليًا لا يمكن لأي شيء خارج الحاوية توجيهه. انشر اسم المضيف المقصود صراحةً بدلًا من ترك المنصة تختار.
إذا كنت تنفق عبر SSH بدلًا من VPN، تظهر المشكلة نفسها بزيّ مختلف: إعادة توجيه منفذ السجل وحده تترك نقطة النهاية الثانية تشير إلى عنوان لا يستطيع عميلك الوصول إليه. أعد توجيه المنفذين معًا واجعل الاسم المعلن يُحلّ إلى شيء يستطيع العميل الوصول إليه محليًا.
لا تُعطّل أمان الإدارة للتبسيط
من السهل العثور على المقاطع التي تُعطّل المصادقة وTLS، وهي تجعل الاتصال يعمل بطريقة سيتعين عليك التراجع عنها لاحقًا. JMX البعيد واجهة إدارة لها الامتيازات نفسها التي يتمتع بها التابع الذي تفحصه؛ احتفظ بضوابط الوصول الخاصة بها، وإذا لم يستطع العميل تقديم بيانات اعتماد، فأصلح ذلك بدلًا من ذلك.
بعد أن تصبح نقاط النهاية صحيحة، احفظ الخطأ التالي الذي تراه. رفض مخزن الثقة أو الحساب مرحلة لاحقة من موصل غير قابل للوصول، ويعني أن عمل الشبكة قد انتهى.