Подключитесь к порту реестра через туннель, понаблюдайте за началом рукопожатия и затем увидьте, что 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 — это интерфейс управления с теми же правами, что и процесс, который он проверяет; сохраняйте его средства контроля доступа, а если клиент не может предъявить учётные данные, исправляйте именно это.

Когда конечные точки верны, сохраните следующую ошибку, которую увидите. Отказ хранилища доверия или учётной записи — это более поздний этап, чем недостижимый коннектор, и он означает, что работа с сетью закончена.

Похожие статьи