JConsole通过ssh本地端口转发

我希望能够远程连接到JMX公开的Java服务,但它被防火墙阻止。 我试图使用SSH本地端口转发,但连接失败。 看看wireshark,看起来当你尝试连接到jconsole时,它想要通过连接到端口9999后通过一些短暂的端口连接,这是由防火墙阻止。

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

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

是的,那篇文章是对的。

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

类似下面的东西应该可以运行你的应用程序,registry和服务器端口都设置为8000.详情请看这里 。

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

顺便说一下,我的SimpleJMX库允许您轻松地设置两个端口,并且可以将它们设置为相同的端口。

所以,一旦你知道了你需要转发的两个端口,你可以设置你的ssh命令。 例如,如果将registry和服务器端口configuration为8000,则可以执行以下操作:

 ssh -L 8000:localhost:8000 remote-host 

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

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

 -Djava.rmi.server.hostname=10.1.2.3 

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

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

    ssh -fN -D 7777 user @防火墙主机

  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=选项才能使其工作。

现在几乎所有的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 

然后我启动SSH连接

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

我可以从JConsole进行连接之后

远程过程: – > localhost:8090

和Java可视化VM

右键单击本地 – >添加JMX连接 – > localhost:8090

继续使用较新的java版本(大约8u66)的SSH socks方法,您还需要将socksNonProxyHosts设置为空,从而导致:

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