web-dev-qa-db-ja.com

VisualVMを使用してファイアウォール経由でリモートjstatdインスタンスに接続する

可能性のある複製:
VisualVM over ssh

今日この問題を解決するのに数時間を費やし、ここで見つけた答えがうまくいかなかったので、この質問を書いて答えています。うまくいけば、これは他の人のために役立ちます。私が使用したソリューション以外のソリューションがある場合は、質問にもお気軽に回答してください。あなたの方がいいなら、代わりにあなたのものを受け入れます。

問題:VisualVMとjstatdを使用して、FreeBSDサーバー上のいくつかの自家製Java=アプリケーション(これはLinuxサーバーにも適用されるはずです)を監視しようとしていますが、VisualVMを取得できませんファイアウォールで割り当て済みのランダムなjstatdポートを転送した後でもサーバー上のプロセスを一覧表示すると、sockstatを使用して接続が行われていることがわかります。

18
Ben Baron

Jstatdを実行するたびにファイアウォールルールを作成するのではなく(毎回新しいランダムポートが不愉快に選択されるため)、SSHトンネルで機能するようになりました。

まず、サーバーでjstatdを実行して、トンネリングに必要なポートを見つけました。これは(私の場合)最初にtools.policyというポリシーファイルを作成し、次の内容で行います。

grant codebase "file:${Java.home}/../lib/tools.jar" {
    permission Java.security.AllPermission;
};

次に、次のコマンドを実行します:jstatd -J-Djava.security.policy=tools.policy

次に、sockstat | grep jstatを実行して、jstatdが使用しているランダムなポートを特定しました(Linuxでは代わりにnetstatを使用する必要があるかもしれませんが、わかりません)。

次に、ランダムポートが55663であるとしましょう。ローカルマシンに2つのSSHトンネルを作成しました。1つは標準のjstatdポート1099用、もう1つは55663用で、2つのターミナルウィンドウで次のコマンドを実行します(Windowsでは実行していませんが、 PuTTYがそれを実行できると私はかなり確信しています):

ssh -L 1099:localhost:1099 login_name@Host_name

ssh -L 55663:localhost:55663 login_name@Host_name

2つのトンネルが開いたら、VisualVMを開き、左側の「ローカル」マシンを右クリックして、「jstatd接続の追加」を選択しました。右側の「Add Default」ボタンをクリックして、ポートが1099に設定されていることを確認しました。「OK」ボタンをクリックして保存すると、すぐにリモートが表示されましたJavaプロセスが表示される「ローカル」セクション。

34
Ben Baron

別のソリューションについては、この「 SOCKSを使用したsshトンネルを介したVisualVMの実行 」を参照してください。

3
Tomas Hurka