JConsole通过ssh本地端口转发

时间:2013-02-26 15:47:44

标签: java ssh jmx

我希望能够远程连接到暴露了JMX的Java服务,但是它被防火墙阻止了。我曾尝试使用ssh本地端口转发,但连接失败。看看wireshark,看来当你尝试连接jconsole时,它想要在连接到被防火墙阻止的端口9999后通过一些短暂的端口进行连接。

有没有办法让jconsole只通过9999连接或使用代理?是this article still the best solution吗?或者,我错过了什么?

4 个答案:

答案 0 :(得分:106)

使用SSH socks隧道有更好的方法,因为JConsole支持SOCKS:

  1. 在某个空闲端口(例如7777)上本地创建SSH socks代理:

      

    ssh -fN -D 7777 user @ firewalled-host

  2. 通过指定SOCKS代理(例如localhost:7777)和JMX服务器的地址(例如localhost:2147)运行JConsole

      

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

  3. 如下面的其中一个答案中所述,从JDK 8u60 +开始,您还需要-J-DsocksNonProxyHosts=选项才能使其正常运行。

答案 1 :(得分:50)

对于几乎所有当前的JDK版本(7u25或更高版本),现在可以非常轻松地通过SSH使用JConsole和Visual JVM(because now you can bind JMX to single port)。

我使用以下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

然后我启动SSH连接

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

我可以从JConsole连接

  

远程处理: - >本地主机:8090

和Java Visual VM

  

右键点击本地 - >添加JMX连接 - >本地主机:8090

答案 2 :(得分:29)

  

有没有办法让jconsole只通过9999连接或使用代理? this article仍然是最好的解决方案吗?或者,我错过了什么?

是的,那篇文章是正确的。

在服务器上指定JMX端口(-Dcom.sun.management.jmxremote.port=####)时,实际上是指定 应用程序的注册表端口。当你连接它时,它提供了一个额外的服务器端口,jconsole实际上完成了它的所有工作。要转发工作,您需要知道两者注册表和服务器端口。

以下内容应该可以在注册表和服务器端口都设置为8000的情况下运行您的应用程序。请参阅here for more details

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

另外,我的SimpleJMX library允许您轻松设置两个端口,并且可以将它们设置为同一个端口。

因此,一旦您知道需要转发的两个端口,就可以设置ssh命令。例如,如果将注册表和服务器端口配置为8000,则执行以下操作:

ssh -L 8000:localhost:8000 remote-host

这会创建一个本地端口8000,它会转发到远程主机上的localhost:8000。如果需要转发多个端口,可以指定多个-L参数。然后,您可以将jconsole连接到localhost:8000,它将适当地连接到远程主机。

此外,如果您的服务器有多个接口,您可能需要设置以下变量以使注册表和服务器端口绑定到正确的接口:

-Djava.rmi.server.hostname=10.1.2.3

答案 3 :(得分:12)

继续SSH socks方法,使用较新的java版本(大约8u66),你还需要将socksNonProxyHosts设置为空,结果是:

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