踏み台の向こう側の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

以上


【参考サイト】

JConsole over ssh local port forwarding
I'd like to be able to remotely connect to a Java service that has JMX exposed, however it is blocked by a firewall. I have tried to use ssh local port forward...
JMX Management over SOCKS Proxy
Connecting to Cassandra’s JMX service through firewalls can be tricky. JMX connects you through one port (7199 by default), and then opens up a dynamic ...
リモートサーバのJavaプロセスをJConsoleで覗く | TECHSCORE BLOG
こんにちは。寺岡です。 この記事は TECHSCORE Advent Calendar 2016 の 13 日目の記事です。 JConsole 使ってますか? JConsoleを使うと、CPUやメモリのメトリクス、JMXのMBeanを使ったカスタムメトリクスの取得や管理系の操作を呼び出すことができます。 JMXはJSR...
ビットの海
ゆるふわソフトウェアエンジニアしゃぜのブログ
18080でJMX接続を待つ踏み台越しの複数のJavaApplicationサーバにローカルマシンから同時に接続する - Qiita
## 何の話? 踏み台越しだと面倒なJMX接続によるJVM監視の、さらに面倒くさい場合の設定例です。 NginxのTCP Proxy機能を使って、同時に接続します。 ## 構成の前提 * APサーバがn台(それぞれのホスト名は...

コメント