VisualVM 穿越防火墙 - RMI 故障排除
很抱歉这个问题肯定已经被问过很多次了,但我无法成功解决我的问题。 我读过很多博客、网站、论坛......但没有找到适合我的情况的任何解决方案。
案例: 我需要将我的机器上的 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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
不幸的是,JMX 尝试打开您配置的端口以外的端口。就在昨天,我成功通过 JMX 连接到防火墙后面的 tomcat。这两个棘手的部分是:
将一个名为
jmxremote.access
的文件放入CATALINA_HOME/conf
中,其中包含以下几行: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
inCATALINA_HOME/conf
, which contains the following lines:in
server.xml
set the ports that will be used by jmx, via a special tomcat listener (catalina-jmx-remote.jar required in /lib):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:
以下是执行此操作的步骤:
mvn exec:java -Djava.rmi.server.hostname=[remote_host_name] -Dexec.args="-pr 1099 -ph 1100 -pv 1101"
(用于“jstatd”类型连接)-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 和主机名与服务器的角度不同)1099
、1100
、1101
和1102
1099
,可以在“高级设置”中更改)[remote_host_name]:1102
”,并选中“不需要 SSL 连接”免责声明:我是开源 ejstatd 工具的作者。
Here are the steps to do this:
mvn exec:java -Djava.rmi.server.hostname=[remote_host_name] -Dexec.args="-pr 1099 -ph 1100 -pv 1101"
(used for "jstatd" type connection)-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)1099
,1100
,1101
and1102
1099
, you can change this in the "Advanced Settings")[remote_host_name]:1102
" in "Connection" input, and check "Do not require SSL connection"Disclaimer: I'm the author of the open source ejstatd tool.
在您的 [主机名] 上,仅为您的 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.