繁体   English   中英

无法远程连接到 jmx 端口

[英]unable to connect to jmx port remotely

我正在尝试远程连接到 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:*                           -   

这是/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

我已经在服务器上下载了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)]

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

$>open 10.137.2.166:29406
#Connection to 10.137.2.166:29406 is opened
$>

很想知道为什么当我在服务器上运行它时 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=

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

telnet 10.137.2.166 29406
Trying 10.137.2.166...
Connected to 10.137.2.166.
Escape character is '^]'.

成功的 JMX 握手

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

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

服务器仅在 10.137.2.166 侦听。 当您尝试使用 localhost 域创建新套接字时,您的应用程序将建立 127.0.0.1 地址,但您的应用程序并未侦听此 IP。

如果你想连接 localhost 域,你有几个解决方案。

  1. 更改您的服务器配置以同时侦听 127.0.0.1 和 10.137.2.166。
  2. 更改您的服务器配置以侦听0.0.0.0

    出于安全原因,不建议在0.0.0.0收听。

  3. 使用 iptables 转发端口。 需要root权限。

sysctl net.ipv4.ip_forward=1
iptables -t nat -A PREROUTING -p tcp -i lo --dport 29406 -j DNAT --to-destination 10.137.2.166:29406
iptables -A FORWARD -p tcp -d 10.137.2.166 --dport 29406 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
  1. 如果您没有 root 权限,则可以使用 socat。
socat TCP-LISTEN:29406,fork,bind=127.0.0.1 TCP:10.137.2.166:29406

我只将 jmx 用于visualvm 连接,在这种情况下,它们是两个可用的端口:com.sun.management.jmxremote.port=9010 com.sun.management.jmxremote.rmi.port=9011

此外, java.rmi.server.hostname需要相应地设置为正确的网络接口,因为端口将仅绑定在该接口上。

一旦端口从您的客户端可用,您就可以在jmxremote.port端口上使用 jmx 连接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM