JMXが公開されているJavaサービスにリモートで接続できるようにしたいが、ファイアウォールによってブロックされている。sshローカルポート転送を使用しようとしたが、接続が失敗する。Wiresharkを見ると、jconsoleで接続しようとすると、ポート9999に接続した後、ファイアウォールによってブロックされている一時的なポートを介して接続したいようです。
Jconsoleを9999経由でのみ接続する方法やプロキシを使用する方法はありますか? この記事は今でも最良の解決策です ?または、私は何かが欠けていますか?
Jconsoleを9999経由でのみ接続する方法、またはプロキシを使用する方法はありますか? この記事 は依然として最善の解決策ですか?または、何かが足りませんか?
はい、その記事はほぼ正しいです。
サーバーのJMXポート(-Dcom.Sun.management.jmxremote.port=####
)を指定すると、実際にはアプリケーションのレジストリポートをjustに指定しています。接続すると、jconsoleが実際にすべての作業を行う追加のサーバーポートが提供されます。動作するように転送するには、レジストリポートとサーバーポートをboth知る必要があります。
レジストリとサーバーの両方のポートを8000に設定してアプリケーションを実行するには、次のようなものが機能するはずです。 詳細はこちら を参照してください。
-Dcom.Sun.management.jmxremote.port=8000
-Dcom.Sun.management.jmxremote.rmi.port=8000
余談ですが、my SimpleJMX library を使用すると、両方のポートを簡単に設定でき、両方を同じポートに設定できます。
したがって、転送する必要のあるポートが両方ともわかったら、ssh
コマンドを設定できます。たとえば、レジストリおよびサーバーのポートを8000として構成する場合、次のようにします。
ssh -L 8000:localhost:8000 remote-Host
これにより、リモートホストのlocalhost:8000に転送するローカルポート8000が作成されます。複数のポートを転送する必要がある場合は、複数の-L
引数を指定できます。その後、jconsoleをlocalhost:8000に接続すると、リモートホストに適切に接続されます。
また、サーバーに複数のインターフェイスがある場合は、次の変数の両方を設定して、適切なインターフェイスにバインドするレジストリとサーバーポートを取得する必要があります。
-Djava.rmi.server.hostname=10.1.2.3
JConsoleはSOCKSをサポートしているため、SSHソックストンネルを使用してこれを実行するさらに良い方法があります。
空きポート(7777など)でローカルにSSHソックスプロキシを作成します。
ssh -fN -D 7777 user @ firewalled-Host
SOCKSプロキシ(localhost:7777など)とJMXサーバーのアドレス(localhost:2147など)を指定してJConsoleを実行します。
jconsole -J-DsocksProxyHost = localhost -J-DsocksProxyPort = 7777 service:jmx:rmi:/// jndi/rmi:// localhost:2147/jmxrmi -J-DsocksNonProxyHosts =
以下の回答の1つで述べたように、JDK 8u60 +からは-J-DsocksNonProxyHosts=
オプションを使用して動作させる。
現在のほぼすべての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
そしてJava Visual VM
[ローカル]-> [JMX接続の追加]-> localhost:8090を右クリックします。
新しいJavaバージョン(約8u66)でSSHソックスメソッドを継続すると、socksNonProxyHostsを空に設定する必要があります。
jconsole -J-DsocksProxyHost=localhost -J-DsocksProxyPort=7777 -J-DsocksNonProxyHosts=