5

さまざまなファイアウォールやトンネリング スキームを介して JMX を公開する方法に関するドキュメントがいくつかあるようですが、私は逆の方法を望んでいます。JMX がローカル マシンからのみアクセスできるようにしたいと考えています。残念ながら、「すぐに使える」管理オプションでは、ポートをローカル インターフェイスに制限することはできず、netstat はポートがいずれかまたはすべてのインターフェイスでリッスンしていることを示しています。

http://java.sun.com/javase/6/docs/technotes/guides/management/agent.html#gdevf

JMX の間接的な層、RMI レジストリ、コネクタ、アダプタなどに当惑していることを認めざるを得ません。

それを世界に公開してから、骨の折れる余分なユーザー管理とセキュリティ構成を実行する必要があるのではなく、電源を入れてからSSHを介してトンネリングしたいと思います。組み込みの RMI レジストリーを使用でき、外部レジストリーを実行する必要がないことは素晴らしいことです。

4

4 に答える 4

3

ローカル ホストからアクセスしている場合は、JConsole と JVisualVM がこの場合に行うことを実行できます。つまり、Attach API を使用して、サーバーのローカル専用アドレスを見つけます (- Dcom.sun.management.jmxremote ではなく -Dcom.sun.management.jmxremote.port=N) に接続します。別の回答では、Thraidh は、こ​​の場合でもリモート アクセス可能なポートが開かれていると述べています。これは、以前のバージョンでは当てはまりましたが、ここ数年はそうではありませんでした。

Fredrik のソリューションは機能しますが、やり過ぎです。RMISocketFactory (クライアントとサーバーの両方を定義する) ではなく、RMIServerSocketFactory のみを定義する必要があります。これにより、クライアントを特別に構成する必要がなくなります。http://vafer.org/blog/20061010091658のコードは正しいように見えます。

-Dcom.sun.management.jmxremote などのコマンドライン プロパティで構築された「すぐに使用できる」管理では、JMX API 自体でプログラミングを開始する必要があるまでしか進めません。私たちは通常、すぐに使える管理を完全な並列 API に進化させることに消極的でした。そのため、このような問題は手の届かないところにあります。ここでは、一方から他方へ移動する方法を説明します。

Éamonn McManus、JMX 仕様リード

于 2009-12-31T14:03:05.620 に答える
2

少し遅い答えですが、それでもあなた(または他の誰か)にとって問題がある場合は、これでうまくいくと思います:

import java.io.IOException;
import java.lang.management.ManagementFactory;
import java.net.*;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.RMISocketFactory;

import javax.management.MBeanServer;
import javax.management.remote.*;

public class LocalJMXPort {
    public static void main(String[] args) {
        try {
            int port = 12468;
            // Create an instance of our own socket factory (see below)
            RMISocketFactory factory = new LocalHostSocketFactory();

            // Set it as default
            RMISocketFactory.setSocketFactory(factory);

            // Create our registry
            LocateRegistry.createRegistry(port);

          // Get the MBeanServer and setup a JMXConnectorServer
            MBeanServer mbs = ManagementFactory.getPlatformMBeanServer();
            JMXServiceURL url = new JMXServiceURL("service:jmx:rmi://127.0.0.1:"+port+"/jndi/rmi://127.0.0.1:"+port+"/jmxrmi");
            JMXConnectorServer rmiServer = JMXConnectorServerFactory.newJMXConnectorServer(url, null, mbs);
            rmiServer.start();

            // Say something
            System.out.println("Connect your jconsole to localhost:"+port+". Press a key to exit");

            // Wait for a key press
            int in = System.in.read();
            //Exit
            System.out.println("Exiting");
            System.exit(0);
        } catch(Exception ex) {
            ex.printStackTrace();
        }
    }

    static private class LocalHostSocketFactory extends RMISocketFactory {
        public ServerSocket createServerSocket(int port) throws IOException {
            ServerSocket ret = new ServerSocket();
            ret.bind(new InetSocketAddress("localhost", port));
            return ret;
        }

        public Socket createSocket(String host, int port) throws IOException {
            return new Socket(host, port);
        }
    }
}

私はそれをまとめただけで、私の唯一の目的は*:portではなくlocalhost:portにバインドすることであり、その部分は機能しているように見えるため、本当に愚かなことをした可能性があります。

改善できることがあるか、単に愚かであることがあれば、遠慮なくコメントしてください。

于 2009-03-18T22:59:15.927 に答える
1

残念ながら、現在それを行う方法はありません。

Sun のドキュメントによると、唯一の -Dcom.sun.management.jmxremote はローカル ポートのみを開く必要がありますが、-Dcom.sun.management.jmxremote.port= はリモートからアクセス可能なポートを開きます。

どちらの方法でも、リモートからアクセスできる追加のランダム ポートを開きます。

-Dcom.sun.management.jmxremote.host= を見たことがありますが、効果がないようです。

仕方がないという結論に達し、ローカル ファイアウォールを使用してサーバーをシールドしました。

于 2009-02-18T15:40:40.230 に答える
1

それを行う太陽の方法を助けることはできません。jmx アダプターが jdk (6 だと思いますか?) に付属し始めた後でも、アダプターのセットアップを最小限に抑えるために mx4j を使用し続けました。127.0.0.1 または内部専用インターフェイスで mx4j http アダプターを起動するのは簡単です。次に、SOP は、ポート転送で SSH 接続するか、wget コマンドでスクリプトを使用する必要がありました。

http://mx4j.sourceforge.net/

于 2008-12-07T01:39:06.993 に答える