ビットの海

ゆるふわソフトウェアエンジニアしゃぜのブログ

踏み台経由のsshでsocks proxyをつくって、jmx接続して監視する話

やること

  • ローカルのMac上のVisualVMから、リモートのLinuxで動いているJVM(Javaアプリケーション)に接続する
  • sshは直接接続できなくて、踏み台経由

環境

ローカルMac OS version

sw_vers
ProductName:    Mac OS X
ProductVersion: 10.11.6
BuildVersion:   15G31

ローカルSSH version

 ssh -V
OpenSSH_6.9p1, LibreSSL 2.1.8

java version

java -version
java version "1.8.0_102"
Java(TM) SE Runtime Environment (build 1.8.0_102-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.102-b14, mixed mode)

Javaアプリケーションの設定

Javaアプリケーションの起動シェルはこんなかんじ

#!/bin/sh

JVM_OPS="-server -Xms128M -Xmx128M \
-Dcom.sun.management.jmxremote.rmi.port=18080 \
-Djava.rmi.server.hostname=10.x.x.x \
-Dcom.sun.management.jmxremote=true \
-Dcom.sun.management.jmxremote.port=18080 \
-Dcom.sun.management.jmxremote.authenticate=false \
-Dcom.sun.management.jmxremote.ssl=false"

java ${JVM_OPS} -jar foo.jar >/dev/null 2>&1 &

exit 0

これをたたく。

sshでsocks proxyをつくる

ssh configはこんなかんじ

Host fumidai
  HostName 10.x.x.x
  Port 22
  IdentityFile ~/.ssh/foo.pem
  User user

Host target
  HostName 10.x.x.x
  Port 22
  IdentityFile ~/.ssh/foo.pem
  User user
  ProxyCommand ssh -F ~/.ssh/config -W %h:%p fumidai
  DynamicForward 10000

sshコマンド実行、proxyつくる

ssh -F ~/.ssh/config target

これでproxyがつくられる

VisualVM or JConsoleで接続する

VisualVM

jvisualvm -J-DsocksProxyHost=localhost -J-DsocksProxyPort=10000 -J-DsocksNonProxyHosts=

VisualVMが起動したら、上の例だと、127.0.0.1:18080に対して、JMX接続を追加すればOK

JConsole

jconsole -J-DsocksProxyHost=localhost -J-DsocksProxyPort=10000 -J-DsocksNonProxyHosts=

ここまで至るの長かったわー