无法远程连接到 jmx 端口

lig*_*ght 6 java linux

我正在尝试远程连接到 jmx 端口,但即使端口已打开,我似乎也无法连接到它。它是一个在服务器上的容器中运行的 java 进程,它是一个 Nomad 工作者。它在29406.

这是netstat显示的内容:

netstat -tulpn | grep 29406
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 10.137.2.166:29406      0.0.0.0:*               LISTEN      -               
udp        0      0 10.137.2.166:29406      0.0.0.0:*                           -   
Run Code Online (Sandbox Code Playgroud)

这是什么 /etc/hosts

cat /etc/hosts
127.0.0.1 localhost

# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
Run Code Online (Sandbox Code Playgroud)

我已经jmxterm在服务器上下载并尝试连接到它,并注意到一个有趣的行为。当我尝试使用localhost连接到端口时,我得到了这个:

#RuntimeIOException: Runtime IO exception: Failed to retrieve RMIServer stub: javax.naming.ServiceUnavailableException [Root exception is java.rmi.ConnectException: Connection refused to host: localhost; nested exception is: 
    java.net.ConnectException: Connection refused (Connection refused)]
Run Code Online (Sandbox Code Playgroud)

当我使用它自己的 IP 地址时,它似乎可以工作:

$>open 10.137.2.166:29406
#Connection to 10.137.2.166:29406 is opened
$>
Run Code Online (Sandbox Code Playgroud)

很想知道为什么当我在服务器上运行它时 localhost 不起作用......

我已经jconsole(在我的笔记本电脑上运行)连接到它的唯一方法是使用这样的 ssh 隧道:

ssh -Nf -D 7777 10.137.2.166
jconsole -J-DsocksProxyHost=localhost -J-DsocksProxyPort=7777 service:jmx:rmi:///jndi/rmi://10.137.2.166:29406/jmxrmi -J-DsocksNonProxyHosts=
Run Code Online (Sandbox Code Playgroud)

我觉得我应该能够在不创建隧道的情况下连接到它,但不确定为什么我不能。如果我从笔记本电脑本地运行 telnet 到主机,连接似乎打开了......

telnet 10.137.2.166 29406
Trying 10.137.2.166...
Connected to 10.137.2.166.
Escape character is '^]'.
Run Code Online (Sandbox Code Playgroud)

edw*_*giz 5

成功的 JMX 握手

  1. jmx 服务器应该可以通过外部主机名使用(还应该通过java.rmi.server.hostname系统属性在服务器 jvm 上声明)

  2. 除了一个开放端口(可以通过com.sun.management.jmxremote.rmi.portjvm 属性显式声明)之外,jmx 服务器还会随机选择另一个用于新 jmx 连接的端口。这是一个很大的问题,因为您无法预见特定端口以将其排除在服务器的防火墙限制之外,因此隧道是必要的。