JConsole під'єднується до реєстру, а потім RMI надсилає її в інше місце
Те, що порт реєстру відповідає, — лише перший крок. Віддалений сервер JMX може оголосити інший вузол та інший порт конектора, і тунель має діставати до обох.
Під'єднайтеся до порту реєстру через тунель, поспостерігайте за початком рукостискання і потім побачте, що JConsole усе одно завершується за тайм-аутом. Так відбувається тому, що перше TCP-з'єднання — не керуюче з'єднання, а пошук. Реєстр RMI відповідає посиланням, у якому вказано вузол і другий порт, і JConsole потім іде туди, куди їй сказали. Якщо тунель дістає лише до першого порту сервера або посилання вказує на адресу, що існує тільки в локальній мережі самого сервера, клієнт зависає після удаваного успіху.
Міф: один відкритий порт — це одне з'єднання
Віддалений JMX через RMI задіює щонайменше дві кінцеві точки, і їх вибирають різні частини системи. Порт реєстру — це те, що ви вводите в клієнті, і він існує, щоб видати заглушку, яка описує справжній конектор. Якщо брати перший успішний сокет за доказ того, що шлях керування відкритий, діагностика на дві хвилини перетворюється на цілий день заявок до firewall.
Дивіться на помилку самого клієнта, а не на список слухачів сервера. Збій після початку рукостискання каже про те, що не завершилося друге з'єднання, а не перше.
Що повертає реєстр
Заглушка містить адресу й порт, серіалізовані в момент створення конектора. На сервері з кількома інтерфейсами стек міг вибрати адресу, доступну з локальної мережі й недоступну з вашої. Клієнт не знає різниці; він просто набирає отримане значення, і пакет іде маршрутом, що існує для цієї адреси, а на VPN-клієнті його часто немає взагалі. Саме в цей момент робиться друга спроба з'єднання.
Саме тому збій проявляється нестабільно в різних середовищах: той самий сервер може поводитися по-різному для користувача в локальній мережі й для користувача в тунелі, хоча конфігурація JMX не змінюється взагалі.
Два порти й дві властивості, що їх фіксують
Порт реєстру задається в com.sun.management.jmxremote.port, а конектор можна зафіксувати за допомогою com.sun.management.jmxremote.rmi.port, а не залишати на розсуд стека. Задайте обидва явно, якщо між клієнтом і сервером є міжмережевий екран або група безпеки, бо непередбачуваний другий порт не можна дозволити заздалегідь, а широкий діапазон, відкритий заради нього, гірший за один фіксований порт.
Потім перевірте за допомогою ss -ltn або netstat -an на сервері, що обидва порти слухаються і на яких адресах. Слухач, прив'язаний до loopback, правильний для розгортання лише на локальній машині й марний для цього випадку.
Коли оголошене ім'я хибне
Ім'я вузла у віддаленому посиланні задається java.rmi.server.hostname. Воно впливає на те, що оголошує заглушка; саме по собі воно не наказує прив'язати кожного слухача до одного інтерфейсу, тому його встановлення не завжди дає очікувану поведінку з одним портом. Задайте його, перезапустіть процес і потім перевірте, що заглушка справді містить. Виберіть ім'я або адресу, яку клієнт може розв'язати й досягти через тунель, і перезапустіть процес, щоб заглушку було побудовано заново.
Мережі контейнерів погіршують це, бо адреса, яку бачить процес, може бути внутрішньою й недосяжною за маршрутом ззовні контейнера. Публікуйте потрібне ім'я вузла явно, а не дозволяйте платформі вибирати.
Якщо ви будуєте тунель через SSH, а не VPN, та сама проблема постає в іншій подобі: переадресація лише порту реєстру залишає другу кінцеву точку такою, що вказує на адресу, якої ваш клієнт не може досягти. Переадресуйте обидва порти й доберіться, щоб оголошене ім'я розв'язувалося в щось, доступне клієнтові локально.
Не вимикайте безпеку керування заради простоти
Фрагменти, що вимикають автентифікацію й TLS, легко знайти, і вони змушують з'єднання працювати так, що потім доведеться все скасовувати. Віддалений JMX — це інтерфейс керування з тими самими правами, що й процес, який він перевіряє; зберігайте його засоби контролю доступу, а якщо клієнт не може пред'явити облікові дані, виправляйте саме це.
Коли кінцеві точки правильні, збережіть наступну помилку, яку побачите. Відмова сховища довіри або облікового запису — це пізніший етап, ніж недосяжний конектор, і вона означає, що роботу з мережею завершено.