簡體   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