68

JMXが公開されているJavaサービスにリモート接続できるようにしたいのですが、ファイアウォールによってブロックされています。sshローカルポートフォワーディングを使用しようとしましたが、接続に失敗します。wiresharkを見ると、jconsoleに接続しようとすると、ファイアウォールによってブロックされているポート9999に接続した後、いくつかのエフェメラルポートを介して接続したいようです。

jconsoleを9999経由でのみ接続するか、プロキシを使用する方法はありますか?この記事はまだ最良の解決策ですか?または、私は何かが欠けていますか?

4

4 に答える 4

118

JConsoleはSOCKSをサポートしているため、SSHソックストンネルを使用してこれを行うさらに良い方法があります。

  1. SSHソックスプロキシをいくつかの空きポート(例:7777)でローカルに作成します。

    ssh -fN -D 7777 user @ firewalled-host

  2. SOCKSプロキシ(例:localhost:7777)とJMXサーバーのアドレス(例:localhost:2147)を指定して、JConsoleを実行します。

    jconsole -J-DsocksProxyHost = localhost -J-DsocksProxyPort = 7777 service:jmx:rmi:/// jndi / rmi:// localhost:2147 / jmxrmi -J-DsocksNonProxyHosts =

-J-DsocksNonProxyHosts=以下の回答の1つに記載されているように、JDK 8u60 +からは、それを機能させるためのオプションも必要です。

于 2013-10-31T12:13:33.117 に答える
67

現在のほとんどすべてのJDKバージョン(7u25以降)では、SSH経由でJConsoleおよびVisual JVMを非常に簡単に使用できるようになりました(JMXを単一のポートにバインドできるようになったため)。

次のJVMパラメータを使用します

-Dcom.sun.management.jmxremote.port=8090
-Dcom.sun.management.jmxremote.rmi.port=8090
-Djava.rmi.server.hostname=127.0.0.1
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

次に、SSH接続を起動します

ssh my.javaserver.domain -L 8090:127.0.0.1:8090

JConsoleから接続できたら

リモートプロセス:-> localhost:8090

そしてJavaVisualVM

「ローカル」->「JMX接続の追加」->「localhost:8090」を右クリックします。

于 2015-09-06T00:11:35.277 に答える
42

jconsoleを9999経由でのみ接続するか、プロキシを使用する方法はありますか?この記事はまだ最良の解決策ですか?または、私は何かが欠けていますか?

はい、その記事はほぼ正しいです。

サーバーでJMXポートを指定する場合(-Dcom.sun.management.jmxremote.port=####)は、実際にはアプリケーションのレジストリポートのみを指定していることになります。接続すると、jconsoleが実際にすべての作業を行う追加のサーバーポートが提供されます。作業に転送するには、レジストリポートとサーバーポートの両方を知っている必要があります。

レジストリポートとサーバーポートの両方を8000に設定してアプリケーションを実行するには、次のようなものが機能するはずです。詳細については、ここを参照してください

-Dcom.sun.management.jmxremote.port=8000
-Dcom.sun.management.jmxremote.rmi.port=8000
-Djava.rmi.server.hostname=127.0.0.1

余談ですが、私のSimpleJMXライブラリでは、両方のポートを簡単に設定でき、両方を同じポートに設定できます。

したがって、転送する必要のある両方のポートがわかったら、sshコマンドを設定できます。たとえば、レジ​​ストリとサーバーのポートを8000として構成する場合は、次のようにします。

ssh -L 8000:localhost:8000 remote-host

これにより、リモートホスト上のlocalhost:8000に転送するローカルポート8000​​が作成されます。-L複数のポートを転送する必要がある場合は、複数の引数を指定できます。次に、jconsoleをlocalhost:8000に接続すると、リモートホストに適切に接続されます。

また、サーバーに複数のインターフェイスがある場合はjava.rmi.server.hostname、適切なインターフェイスにバインドするように変数を設定する必要があります。

-Djava.rmi.server.hostname=10.1.2.3
于 2013-02-26T16:11:51.190 に答える
13

新しいJavaバージョン(約8u66)でSSH socksメソッドを続行すると、socksNonProxyHostsを空に設定する必要があります。

jconsole -J-DsocksProxyHost=localhost -J-DsocksProxyPort=7777 -J-DsocksNonProxyHosts=
于 2015-08-26T15:22:58.613 に答える