远程访问JMX遇到连接不上的问题(JConsole和VisualVM工具类似)
java.rmi.ConnectException: Connection refused to host: 10.88.112.165; nested exception is:
java.net.ConnectException: Connection timed out: connect
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:129)
at javax.management.remote.rmi.RMIServerImpl_Stub.newClient(Unknown Source)
at javax.management.remote.rmi.RMIConnector.getConnection(RMIConnector.java:2373)
at javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:297)
at javax.management.remote.JMXConnectorFactory.connect(JMXConnectorFactory.java:268)
at com.rf.emq.product.jmx.JmxProxy.initConn(JmxProxy.java:84)
at com.rf.emq.product.jmx.JmxProxy.getBrokerOperation(JmxProxy.java:102)
at com.rf.emq.product.jmx.JmxProxy.main(JmxProxy.java:318)
Caused by: java.net.ConnectException: Connection timed out: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)
at java.net.Socket.connect(Socket.java:528)
at java.net.Socket.<init>(Socket.java:425)
at java.net.Socket.<init>(Socket.java:208)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:147)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
... 10 more
java.rmi.ConnectException: Connection refused to host: 10.88.112.165; nested exception is:
java.net.ConnectException: Connection timed out: connect
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:129)
at javax.management.remote.rmi.RMIServerImpl_Stub.newClient(Unknown Source)
at javax.management.remote.rmi.RMIConnector.getConnection(RMIConnector.java:2373)
at javax.management.remote.rmi.RMIConnector.connect(RMIConnector.java:297)
at javax.management.remote.JMXConnectorFactory.connect(JMXConnectorFactory.java:268)
at com.rf.emq.product.jmx.JmxProxy.initConn(JmxProxy.java:84)
at com.rf.emq.product.jmx.JmxProxy.getBrokerMbeanName(JmxProxy.java:274)
at com.rf.emq.product.jmx.JmxProxy.getBrokerOperation(JmxProxy.java:105)
at com.rf.emq.product.jmx.JmxProxy.main(JmxProxy.java:318)
Caused by: java.net.ConnectException: Connection timed out: connect
at java.net.DualStackPlainSocketImpl.connect0(Native Method)
at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182)
at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:579)
at java.net.Socket.connect(Socket.java:528)
at java.net.Socket.<init>(Socket.java:425)
at java.net.Socket.<init>(Socket.java:208)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:147)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
... 11 more
Exception in thread "main" java.lang.NullPointerException
at com.rf.emq.product.jmx.JmxProxy.getBrokerMbeanName(JmxProxy.java:278)
at com.rf.emq.product.jmx.JmxProxy.getBrokerOperation(JmxProxy.java:105)
at com.rf.emq.product.jmx.JmxProxy.main(JmxProxy.java:318)
**********************************************
【问题】
telnet 10.88.112.165 1100是ok的,但是远程通过客户端连接jmx时,访问不到,只有关闭防火墙,才可以访问到,
防火墙的配置规则,应该怎么配?==>
*********************
【分析】
问题状态:
1、通过netstat查看端口号,显示1100为LISTEN;监听是正常的;
2、iptables中已经将端口号1100置为开放的;
3、远程通过telnet <ip> <port>时,telnet是正常的;
4、(但是)通过jconsole <ip> <port>进行连接时,连接不上;
5、(如果)关闭firewall的话,第4步的方式是可以成功的;
***********************
【解答】
In addition to listening to the port you specified (1100) the JMX server also listens to a randomly chosen (ephemeral) port.
Check, e.g. with lsof -i|grep java if you are on linux/osx, which ports the java process listens to and make sure your firewall is open for the ephemeral port as well.
除了JMX server指定的监听端口号外,JMXserver还会监听一到两个随机端口号,
可以通过命令:lsof -i|grep java |grep <pid> 来查看当前java进程需要监听的随机端口号,
///////////begin////////
# netstat -tupln |grep 1101
tcp 0 0 0.0.0.0:1101 0.0.0.0:* LISTEN 13997/java
# lsof -i|grep 13997
java 13997 root 9u IPv4 132890 0t0 TCP *:37040 (LISTEN)
java 13997 root 70u IPv4 132891 0t0 TCP *:pt2-discover (LISTEN)
java 13997 root 72u IPv4 132892 0t0 TCP *:40085 (LISTEN)
java 13997 root 76u IPv4 146976 0t0 TCP hotnamea:61618->10.88.146.205:49165 (ESTABLISHED)
java 13997 root 84u IPv4 132904 0t0 TCP *:61618 (LISTEN)
java 13997 root 95u IPv4 132936 0t0 TCP *:8163 (LISTEN)
///////////end//////////
并且把这些端口号也放到iptable中,置为开放状态。
【小结】这也证明了尽管jmx server的主监听端口号【1100】已开放,但是远程连接时,还是访问不到,只有关闭firewall,才可以远程jmx连接上。
【建议】因为随机短口号是Java进程启动后,OS随机分配给jmxserver的,如果可以关闭firewall就选择关闭,否则,需要每次在server就绪后,监测到随机
端口号,并把它们配置到iptables中,置为开放状态。
【注意】每个Jmxserver还需要两个随机端口号。
*********************
相关推荐
JMX 连接工具 Eclipse 插件, 可实现 JMX 服务端的连接
tomcat开启远程jmx连接方式包括tomcat5 6 7 windows版本开启远程jmx连接监控
本文档主要介绍了jmx连接T远程监控tomcat的详细配置,文档包含了一些配置的详细图片和需要注意的内容
使用jconsole远程监控tomcat jmx 实验操作详细信息,本人实验实操
云服务上的tomcat监控使用到的jar包,需要的可以直接下载,注意tomcat的版本需要和jar包的版本对应
如果初次接触JConsole,应该会很有用的!
JDK1.5提供JMX remote的管理工具Jconsole,可以监控Java运行程序的内存使用情况、活动线程数量、类装载的数量、MBeans的状态、虚拟机的各种信息等,还可以执行MBean公开的方法或强制进行垃圾回收。只要应用服务器...
最主要的还是被用来做各种监控工具,比如文章开头提到的 Spring Boot Actuator、JConsole、VisualVM 等。 JMX 既是 Java 管理系统的一个标准,一个规范,也是一个接口,一个框架。有标准、有规范是为了让开发者可以...
使用RMI远程连接JVM.用JMX获取JVM的参数.
JConsole是一个基于JMX的GUI工具,用于连接正在运行的JVM,不过此JVM需要使用可管理的模式启动。如果要把一个应用以可管理的形式启动,可以在启动是设置com.sun.management.jmxremote。JConsole能够提供被监控虚拟机...
jconsole连接JMX在很多例子中采用RMI协议连接。 但是在实际生产环境下,RMI会受到来自防火墙的诸多限制,经常连接不上。 采用JMXMP协议是一个替换办法。 将解压后的几个jar全部拷贝到服务器端%JAVA_HOME%\jre\lib\...
jconsole源码 源码 jconsole jmx
NULL 博文链接:https://skyteam.iteye.com/blog/1924935
可以禁止或允许远程主机访问本地主机的某个端口和某些端口,也可禁止或允许本地主机访问远程主机的某个端口和某些端口。 对于近期通过135端口传播的病毒可以起到防护作用。 功能示例 一.禁止远程访问本地135端口 1...
tomcat9监控jar包,catalina-jmx-remote java-visualVM专用
tomcat8监控jar包,catalina-jmx-remote java-visualVM专用
tomcat7监控jar包,catalina-jmx-remote java-visualVM专用
java jmx agent不安全的配置漏洞如何改进(由浅入深代码范例和详细说明).docx
jmx_client 通过命令行获取的 JMX 统计信息(替代 JConsole)