VisualVM 穿越防火墙 - RMI 故障排除

发布于 2024-10-18 14:17:16 字数 1041 浏览 6 评论 0原文

很抱歉这个问题肯定已经被问过很多次了,但我无法成功解决我的问题。 我读过很多博客、网站、论坛......但没有找到适合我的情况的任何解决方案。

案例: 我需要将我的机器上的 VisualVM 连接到远程服务器(tomcat、weblogics)以进行性能/线程/内存监控。 这些服务器安装在受防火墙保护的(物理或虚拟)计算机上。 防火墙中开放了大间隔的端口并且可以使用,但并非所有端口。

测试

  • 我尝试过在 VisualVM 中通过 JMX 进行直接连接,在服务器启动时在服务器端使用以下 JVM 选项:
    -Djava.rmi.server.hostname=[主机名]
    -Dcom.sun.management.jmxremote
    -Dcom.sun.management.jmxremote.port=[端口]
    -Dcom.sun.management.jmxremote.ssl=false
    -Dcom.sun.management.jmxremote.authenticate=false
    

我已经精确了主机名,因为从我的网络来看,服务器的主机名和 IP 地址与来自远程服务器网络的主机名和 IP 地址不同。

没有成功,VisualVM 似乎总是在寻找未知的服务器。

  • 尝试在服务器端的可从我的盒子访问的端口(-p 选项)上启动 jstatd(此端口上的 telnet 有效),但是当使用 jstatd 端口在此主机上启动 VisualVM 时,它似乎仍在等待无法访问的内容.... 与连接到此远程主机的 jps 的行为相同。

  • 尝试在网络保护较少的服务器上使用相同的工具,并且它有效。所以我看到了我的盒子和服务器之间的连接,它们是在与我为 jstatd 指定的端口不同的端口上完成的。 我知道第一次通信(握手)需要此端口,而真正的通信是在其他端口上完成的,但不可预测(例如:60305、55197,...)。 不确定我是否非常了解 RMI 的工作原理。

请帮帮我,我快疯了!

Sorry for this question which must have been asked many times, but I can't succeed in resolving my problem.
I've read a lot of blogs, sites, forums, .... and didn't find any solution in my case.

Case :
I need to connect VisualVM on my box to distant servers (tomcats, weblogics) for performance / threads / memory monitoring.
Those servers are installed on (physical or virtual) machines which are protected by a firewall.
Large intervals of ports are open in the firewall and can be used, but not all ports.

Tests

  • I've tried direct connections through JMX in VisualVM, using following JVM options on the server-side at server startup :

    -Djava.rmi.server.hostname=[hostname]
    -Dcom.sun.management.jmxremote
    -Dcom.sun.management.jmxremote.port=[port]
    -Dcom.sun.management.jmxremote.ssl=false
    -Dcom.sun.management.jmxremote.authenticate=false
    

I've precised the hostname because from my network the hostname and the IP address of the server are not the same than those from the network of the remote server.

No success, VisualVM always seems searching for an unknown server.

  • tried starting jstatd on the server-side on a port accessible (-p option) from my box (telnet on this port works), but when launching visualVM on this host with the jstatd port, it still seems waiting for something unreachable.... Same behavior with jps connecting to this remote host.

  • tried using the same tools on a server with less network protection, and it works. So I have seen the connections between my box and the server and they are done on ports different from what I've specified to jstatd.
    I understand that this port is needed for first communication (kind of handshake) and real communications are done on other ports, but not predictible (ex: 60305, 55197, ...).
    Not sure I understand very well how RMI works.

Please, help me, I'm going crazy !

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

你没皮卡萌 2024-10-25 14:17:16

不幸的是,JMX 尝试打开您配置的端口以外的端口。就在昨天,我成功通过 JMX 连接到防火墙后面的 tomcat。这两个棘手的部分是:

  • 将一个名为 jmxremote.access 的文件放入 CATALINA_HOME/conf 中,其中包含以下几行:

    monitorRole 只读
    控制角色读写
    
  • in server.xml 通过特殊的 tomcat 监听器设置 jmx 将使用的端口(/lib 中需要 catalina-jmx-remote.jar):

    
    

然后打开防火墙上的这两个端口。有用。但这仅适用于 tomcat。

另一种选择是使用 ssh 隧道。简而言之 - 您通过 SSH 连接并将其配置为将某些本地端口(运行 jmx 客户端的端口)转发到隧道另一侧的某些端口。

参考文献:

Unfortunately JMX tries to open ports other than the one you configure. Just yesterday I succeeded connecting to tomcat behind firewall via JMX. The two tricky parts are:

  • put a file called jmxremote.access in CATALINA_HOME/conf, which contains the following lines:

    monitorRole readonly
    controlRole readwrite
    
  • in server.xml set the ports that will be used by jmx, via a special tomcat listener (catalina-jmx-remote.jar required in /lib):

    <Listener className="org.apache.catalina.mbeans.JmxRemoteLifecycleListener" 
        rmiRegistryPortPlatform="9009" rmiServerPortPlatform="9010" />
    

Then open these two ports on the firewall. It works. But that's just for tomcat.

Another option is to use ssh tunnelling. In short - you connect via SSH and configure it to forward some local port (where the jmx client is running) to some ports on the other side of the tunnel.

References:

深海不蓝 2024-10-25 14:17:16

以下是执行此操作的步骤:

  1. 以这种方式在远程主机中启动 ejstatd (在 ejstatd 中)文件夹): mvn exec:java -Djava.rmi.server.hostname=[remote_host_name] -Dexec.args="-pr 1099 -ph 1100 -pv 1101" (用于“jstatd”类型连接)
  2. 使用这些附加 Java 参数启动 Java 应用程序: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun .management.jmxremote.port=1102 -Dcom.sun.management.jmxremote.rmi.port=1102 -Djava.rmi.server.hostname=[remote_host_name](用于“JMX”类型连接)(java.rmi.server.hostname 在这里是必需的,只是因为网络中的 IP 和主机名与服务器的角度不同)
  3. 打开远程主机上的这 4 个端口,并使它们可供本地使用机器:1099110011011102
  4. 启动 JVisualVM
    1. 右键单击“远程”> “添加远程主机...”并在“主机名”中输入您的远程主机名(如果您不使用端口1099,可以在“高级设置”中更改)
    2. 右键单击您刚刚创建的远程主机> “添加 JMX 连接...”并在“连接”输入中输入“[remote_host_name]:1102”,并选中“不需要 SSL 连接”
    3. 您的 Java 进程将出现两次:一次来自“jstatd”连接类型,另一次来自“JMX”连接类型。

免责声明:我是开源 ejstatd 工具的作者。

Here are the steps to do this:

  1. Launch an ejstatd in your remote host this way (in ejstatd folder): mvn exec:java -Djava.rmi.server.hostname=[remote_host_name] -Dexec.args="-pr 1099 -ph 1100 -pv 1101" (used for "jstatd" type connection)
  2. Launch your Java application with those additional Java parameters: -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.port=1102 -Dcom.sun.management.jmxremote.rmi.port=1102 -Djava.rmi.server.hostname=[remote_host_name] (used for "JMX" type connection) (java.rmi.server.hostname is required here only because the IP and hostname from your network is not the same as the server point of view)
  3. Open those 4 ports on your remote host and make them available to your local machine: 1099, 1100, 1101 and 1102
  4. Launch JVisualVM
    1. Right-click on "Remote" > "Add Remote Host..." and enter your remote host name in "Host name" (if you don't use the port 1099, you can change this in the "Advanced Settings")
    2. Right-click on the remote host you've just created > "Add JMX Connection..." and enter "[remote_host_name]:1102" in "Connection" input, and check "Do not require SSL connection"
    3. Your Java process will appear twice: one from the "jstatd" connection type, and one from the "JMX" connection type.

Disclaimer: I'm the author of the open source ejstatd tool.

乱了心跳 2024-10-25 14:17:16

在您的 [主机名] 上,仅为您的 IP 打开 [端口] 和 TCP 端口范围 40000-60000。
这对我来说相当有效。

On your [hostname], open up [port] and tcp port range 40000-60000 for your IP only.
This did the trick for me fairly well.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文