踏み台の向こう側のJavaプロセス(Tomcat)にSSHとSOCKSプロキシでJMXでJConsoleする

IT

手元の端末からは直接接続できない、クラウド内部ネットワークに置かれたサーバ上のJavaプロセスに踏み台を経由してJMX接続を行う。
ポートフォワードで実現するのは難しい。SOCKSプロキシを使うのが吉。

構成

          ┃
   下界     ┃     雲の上の世界
          ┃
 ┏━━━━┓ ┏━┻━┓ ┏━━━━━━━━━┓
 ┃手元端末┃→┃踏み台┃→┃Java(Tomcat)サーバ┃
 ┗━━━━┛ ┗━┳━┛ ┗━━━━━━━━━┛
          ┃
          ┃
          ┃

Javaサーバ側の設定

javaコマンドのVM引数に以下のような設定を追加する。

-Dcom.sun.management.jmxremote.port=1099
-Dcom.sun.management.jmxremote.rmi.port=1099
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.local.only=false
-Djava.rmi.server.hostname=$(hostname)

注意点1:今回はTomcatなので、catalina.shの隣にsetenv.shを作成して以下のような形でCATALINA_OPTSにセットした。

export CATALINA_OPTS="-Dcom.sun… -Dcom.sun…"

注意点2:「com.sun.management.jmxremote」はJava6以降から不要である。
公式ドキュメントに「Java SE 6 プラットフォームでは、このシステムプロパティーの設定は必要ありません。」との記述がある。

JMX テクノロジを使用する監視と管理 - Java SE 監視および管理ガイド

注意点3:「java.rmi.server.hostname」は踏み台から認識できるホスト名を指定する。

手元端末側から接続する

SOCKSプロキシを作り

ssh -N -D 9999 {{ 踏み台サーバのホスト名 }}

jconsole実行

jconsole -J-DsocksProxyHost=localhost -J-DsocksProxyPort=9999 service:jmx:rmi:///jndi/rmi://{{ 踏み台から見たJavaサーバのホスト名 }}:1099/jmxrmi

以上


コメント