JConsole通过ssh本地端口转发

blo*_*her 59 java ssh jmx

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

有没有办法让jconsole只通过9999连接或使用代理?是这篇文章仍然是最好的解决办法?或者,我错过了什么?

Bog*_*dan 108

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

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

    ssh -fN -D 7777用户@firewalled-host

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

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

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


Bor*_*hov 54

对于几乎所有当前的JDK版本(7u25或更高版本),现在可以非常轻松地通过SSH使用JConsole和Visual JVM(因为现在您可以将JMX绑定到单个端口).

我使用以下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
Run Code Online (Sandbox Code Playgroud)

然后我启动SSH连接

ssh my.javaserver.domain -L 8090:127.0.0.1:8090
Run Code Online (Sandbox Code Playgroud)

我可以从JConsole连接后

远程进程: - > localhost:8090

和Java Visual VM

右键单击Local - > Add JMX Connection - > localhost:8090

  • 真棒,正是我想要的.以下是我与VisualVM一起使用时的个人观察:`java.rmi.server.hostname = localhost`(而不是IP地址)也可以正常工作....还有:属性`com.sun.management.jmxremote.port`和` com.sun.management.jmxremote.rmi.port`必须具有**相同的**值. (4认同)

Gra*_*ray 32

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

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

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

类似下面的内容应该可以在注册表和服务器端口都设置为8000的情况下运行您的应用程序.有关详细信息,请参阅此处.

-Dcom.sun.management.jmxremote.port=8000
-Dcom.sun.management.jmxremote.rmi.port=8000
Run Code Online (Sandbox Code Playgroud)

另外,我的SimpleJMX库允许您轻松设置两个端口,您可以将它们设置为相同的端口.

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

ssh -L 8000:localhost:8000 remote-host
Run Code Online (Sandbox Code Playgroud)

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

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

-Djava.rmi.server.hostname=10.1.2.3
Run Code Online (Sandbox Code Playgroud)


Tri*_*ill 12

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

jconsole -J-DsocksProxyHost=localhost -J-DsocksProxyPort=7777 -J-DsocksNonProxyHosts=
Run Code Online (Sandbox Code Playgroud)

  • '-J-DsocksNonProxyHosts ='为我带来了不同! (2认同)