[英]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 握手
jmx 服務器應該可以通過外部的主機名使用(也應該通過java.rmi.server.hostname
系統屬性在服務器 jvm 上聲明)
除了一個開放端口(可以通過com.sun.management.jmxremote.rmi.port
jvm 屬性明確聲明)之外,jmx 服務器會隨機選擇另一個用於新 jmx 連接的端口。 這是相當有問題的,因為您無法預見特定端口以將其排除在服務器的防火牆限制之外,因此隧道是必要的。
服務器僅在 10.137.2.166 偵聽。 當您嘗試使用 localhost 域創建新套接字時,您的應用程序將建立 127.0.0.1 地址,但您的應用程序並未偵聽此 IP。
如果你想連接 localhost 域,你有幾個解決方案。
更改您的服務器配置以偵聽0.0.0.0 。
出於安全原因,不建議在0.0.0.0收聽。
使用 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
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.