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:
Cree el calcetín SSH proxy localmente en algún puerto libre (por ejemplo, 7777):
ssh -fN -D 7777 usuario @ firewall-host
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.