JConsole over ssh local port forwarding

2022-08-31 14:26:06

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

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


答案 1

使用SSH袜子隧道有一个更好的方法来做到这一点,因为JConsole支持SOCKS:

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

    ssh -fN -D 7777 user@firewalled主机

  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=

正如下面的答案之一中提到的,从JDK 8u60 +开始,您还需要有选择才能使其正常工作。-J-DsocksNonProxyHosts=


答案 2

对于几乎所有当前的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连接之后

远程进程: -> 本地主机:8090

和 Java Visual VM

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


推荐