我位于开发人员网络中,要使用 JVisualVM 监控的 JBoss 位于单独网络中的客户端防火墙后面。 JBoss 通过 NAT 暴露给我们。当从我们的开发者网络使用 telnet 时,暴露的 JMX 端口可以工作,但 JVisualVM 仍然找不到远程 JMX。显然,这可能是由于两件事造成的:1) 需要访问一个或多个动态 RMI 套接字,或者 2) 未定义“java.rmi.server.hostname”。我的问题可能是第 1 点和第 2 点,但显然由于我们有 SSH 访问权限,因此可以根据此站点解决此问题:
http://rafaelsteil.com/setting-up-jmx-for-jconsole-visualvm-on-ec2-plus-jetty-configuration/
“java.rmi.server.hostname”是服务器的公共(public)主机名(例如 example.com),不带 HTTP 或其他任何内容。您不能使用内部地址,否则您将无法远程访问该服务。
但是,我对“java.rmi.server.hostname”有一个疑问,定义的 IP 地址应该是服务器内部 IP 还是公开暴露给我们开发者网络的 NAT IP?
最佳答案
实际上我自己刚刚解决了这个问题并解决了。
我敢打赌问题出在 RMI 连接上 - 您无法预测它将使用哪些端口,因此您无法让它与防火墙一起工作。
解决方法是使用 SSH 代理:
通过 SSH 连接到运行应用程序的机器,但使用 -D 选项,如下所示:
ssh user@remoteHost -D 9999
这将在您的本地计算机上的端口 9999 上启动 socks 代理。
打开 JVisualVM,并在首选项中的“网络”下将其配置为在本地主机的端口 9999 上使用 socks 代理。
如果您执行上述操作,您应该能够正常连接到远程计算机,并且由于所有 RMI 流量现在都通过 SSH 代理进行,因此它可以穿透防火墙并正常工作。
祝你好运:-)
关于java - 当目标位于 NAT 之后时 VisualVM 远程工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26054075/