Найдите, какой класс открывает порт

#java

Вопрос:

У нас есть несколько java-приложений, запущенных на узлах кластера. Они либо используют tomcat, либо jetty, и мы настраиваем их на использование определенных портов. Мы также настраиваем JMX для использования определенных портов, как com.sun.management.jmxremote.port и com.sun.management.jmxremote.rmi.port (мы даже ограничиваем их определенным сетевым интерфейсом), поэтому на типичном сервере должно быть открыто 3 порта (http, https и jmx).

Мы обнаруживаем, что все наши сервисы имеют 4 открытых порта, и, запустив их в strace режиме confims, кто-то открывает порт ramdom на всех интерфейсах:

 bind(210, {sa_family=AF_INET, sin_port=htons(0), sin_addr=inet_addr("0.0.0.0")}, 16) = 0
 

Я попытался подключиться с помощью jconsole к этому порту, но получил сообщение об ошибке:

 error during JRMP connection establishment; nested exception is java.net.SocketException: Connection reset[...]
 

и остальная часть ошибки улетает от границы окна подключения jconsole 🙁

Поэтому мой вопрос в том, есть ли способ найти класс или трассировку стека, которая указывала бы на класс, открывающий этот сокет?

Комментарии:

1. (1) Установите точки останова на ServerSocketFactory ? Если у вас нет подходящего отладчика, jdb вы можете справиться с чем-то таким простым. (2) В качестве другого подхода вместо jconsole подключения к более базовому инструменту, такому как telnet netcat socat или cat </dev/tcp/$addr/$port (в зависимости от ОС или bash), и посмотрите, что он выводит, если вообще что-то выводит.

2. Вы можете попытаться определить поток , ожидающий «accept()» в этом сокете, запустив jstack $pid его, и проанализировать трассировку стека.

3. @dave_thompson_085 я попробовал с jdb и stop in java.net.Socket.bind , но почему-то на этом не остановился. То, что я вижу, есть RMI TCP Accept-19084 и RMI TCP Accept-0 в списке тем, так что, может быть, это так?

4. Может быть, вы можете посмотреть, что обычно работает на этом порту? Порт 210, похоже, Z39.50 .

5. Это не порт 210, это файловый дескриптор 210. Порт является случайным, на основе sin_port=htons(0) .