java ssh jmx

java - JConsole sobre ssh reenvío de puerto local



jmx (4)

Me gustaría poder conectarme de forma remota a un servicio Java que tenga JMX expuesto, sin embargo, está bloqueado por un firewall. He intentado utilizar el reenvío de puerto local ssh, pero la conexión falla. En cuanto a wireshark, parece que cuando intenta conectarse con jconsole, quiere conectarse a través de algunos puertos efímeros después de conectarse al puerto 9999, que están bloqueados por el firewall.

¿Hay alguna manera de hacer que jconsole solo se conecte a través del 9999 o use un proxy? ¿ Este artículo sigue siendo la mejor solución ? ¿O me estoy perdiendo algo?


¿Hay alguna manera de hacer que jconsole solo se conecte a través del 9999 o use un proxy? ¿ Este artículo sigue siendo la mejor solución? ¿O me estoy perdiendo algo?

Sí, ese artículo es el correcto.

Cuando especifica el puerto JMX en su servidor ( -Dcom.sun.management.jmxremote.port=#### ), en realidad está especificando solo el puerto de registro para la aplicación. Cuando se conecta, proporciona un puerto de servidor adicional con el que jconsole realmente hace todo su trabajo. Para reenviarse al trabajo, necesita conocer los puertos de registro y servidor.

Algo similar a lo siguiente debería funcionar para ejecutar su aplicación con los puertos de registro y servidor establecidos en 8000. Consulte aquí para obtener más detalles .

-Dcom.sun.management.jmxremote.port=8000 -Dcom.sun.management.jmxremote.rmi.port=8000

Como un aparte, mi biblioteca SimpleJMX te permite establecer ambos puertos fácilmente y puedes configurarlos para que sean el mismo puerto.

Entonces, una vez que conoces los puertos que necesitas reenviar, puedes configurar tu comando ssh . Por ejemplo, si configura los puertos de registro y servidor como 8000, haría:

ssh -L 8000:localhost:8000 remote-host

Esto crea un puerto local 8000 que lo reenvía a localhost: 8000 en el host remoto. Puede especificar múltiples argumentos -L si necesita reenviar varios puertos. Luego puede conectar su jconsole a localhost: 8000 y se conectará al host remoto de manera apropiada.

Además, si su servidor tiene múltiples interfaces, es posible que deba establecer las dos variables siguientes para que el registro y los puertos del servidor se vinculen a la interfaz correcta:

-Djava.rmi.server.hostname=10.1.2.3


Con casi todas las versiones actuales de JDK (7u25 o posterior) ahora es posible usar JConsole y Visual JVM sobre SSH con bastante facilidad ( porque ahora puede vincular JMX a un solo puerto ).

Yo uso los siguientes parámetros de JVM

-Dcom.sun.management.jmxremote.port=8090 -Dcom.sun.management.jmxremote.rmi.port=8090 -Djava.rmi.server.hostname=127.0.0.1 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false

Luego lanzo una conexión SSH

ssh my.javaserver.domain -L 8090:127.0.0.1:8090

Después de que puedo conectarme desde JConsole

Proceso remoto: -> localhost: 8090

Y Java Visual VM

Haga clic derecho en Local -> Agregar conexión JMX -> localhost: 8090


Continuando con el método de calcetines SSH, con las versiones más nuevas de java (alrededor de 8u66) también debe configurar socksNonProxyHosts como resultado:

jconsole -J-DsocksProxyHost=localhost -J-DsocksProxyPort=7777 -J-DsocksNonProxyHosts=


Hay una manera aún más agradable de hacerlo utilizando un túnel de calcetines SSH, ya que JConsole admite SOCKS:

  1. Cree el calcetín SSH proxy localmente en algún puerto libre (por ejemplo, 7777):

    ssh -fN -D 7777 usuario @ firewall-host

  2. Ejecute JConsole especificando el proxy SOCKS (por ejemplo, localhost: 7777) y la dirección del servidor JMX (por ejemplo, localhost: 2147)

    jconsole -J-DsocksProxyHost = localhost -J-DsocksProxyPort = 7777 servicio: jmx: rmi: /// jndi / rmi: // localhost: 2147 / jmxrmi -J-DsocksNonProxyHosts =

Como se menciona en una de las respuestas a continuación, desde JDK 8u60 + también debe tener la opción -J-DsocksNonProxyHosts= para que funcione.