web-dev-qa-db-ja.com

なぜJavaはJMXが設定されているときに3つのポートを開くのですか?

Centos6でJDK7を使用してJavaプログラムを実行します。次のオプションを使用してJMXを有効にします。

Java_OPTS="${Java_OPTS} -Dcom.Sun.management.jmxremote -Dcom.Sun.management.jmxremote.port=9123 -Dcom.Sun.management.jmxremote.ssl=false -Dcom.Sun.management.jmxremote.authenticate=false -Dcom.Sun.management.jmxremote.local.only=true"

開いているポートを確認すると、さらに2つのランダムポートが見つかります。

netstat -plunt | grep Java
tcp        0      0 :::9123                     :::*                        LISTEN      13295/Java
tcp        0      0 :::59927                    :::*                        LISTEN      13295/Java
tcp        0      0 :::59928                    :::*                        LISTEN      13295/Java

再起動するたびに設定されたポート9123のみが同じであり、2つの追加ポートが値を変更することに注意してください。

netstat -plunt | grep Java
tcp        0      0 :::9123                     :::*                        LISTEN      13331/Java
tcp        0      0 :::59932                    :::*                        LISTEN      13331/Java
tcp        0      0 :::59933                    :::*                        LISTEN      13331/Java

2つの追加ポートとは何ですか?なぜそれらが開かれますか?

2つの追加のランダムポートを構成するにはどうすればよいですか?

JMXによって開かれたすべてのポートの前に::ffff:127.0.0.1が表示されるように設定するにはどうすればよいですか?

JConsoleで接続するときに1つのポートが使用されないのはなぜですか?

答えを明確にするために追加

残念ながら、追加のランダムポートはまだ開かれています。念のため、Centos 6を使用しています。Tomcatの設定は次のようになっています(Tomcatはアプリケーションをデプロイしません)。

CATALINA_OPTS="${CATALINA_OPTS}  -XX:+DisableAttachMechanism -Dcom.Sun.management.jmxremote -Dcom.Sun.management.jmxremote.ssl=false -Dcom.Sun.management.jmxremote.authenticate=false -Dcom.Sun.management.jmxremote.local.only=true -Djava.rmi.server.useLocalHostname=true -Djava.rmi.server.useCodebaseOnly=true -Dcom.Sun.management.jmxremote.port=9123 -Dcom.Sun.management.jmxremote.rmi.port=9123"

Tomcatプロセスは次のようになります。

/usr/Java/jdk1.7.0_51/bin/Java -Djava.util.logging.config.file=/usr/Tomcat-7.0.47/conf/logging.properties -Djava.util.logging.manager=org.Apache.juli.ClassLoaderLogManager -XX:+DisableAttachMechanism -Dcom.Sun.management.jmxremote -Dcom.Sun.management.jmxremote.ssl=false -Dcom.Sun.management.jmxremote.authenticate=false -Dcom.Sun.management.jmxremote.local.only=true -Djava.rmi.server.useLocalHostname=true -Djava.rmi.server.useCodebaseOnly=true -Dcom.Sun.management.jmxremote.port=9123 -Dcom.Sun.management.jmxremote.rmi.port=9123 -Djava.endorsed.dirs=/usr/Tomcat-7.0.47/endorsed -classpath /usr/Tomcat-7.0.47/bin/bootstrap.jar:/usr/Tomcat-7.0.47/bin/Tomcat-juli.jar -Dcatalina.base=/usr/Tomcat-7.0.47 -Dcatalina.home=/usr/Tomcat-7.0.47 -Djava.io.tmpdir=/usr/Tomcat-7.0.47/temp org.Apache.catalina.startup.Bootstrap start

残念ながら、追加のリスニングポートが表示されるたびに:

tcp        0      0 :::38830                    :::*                        LISTEN      790/Java
tcp        0      0 ::ffff:127.0.0.1:8080       :::*                        LISTEN      790/Java
tcp        0      0 :::9123                     :::*                        LISTEN      790/Java

追加の実行:

tcp        0      0 ::ffff:127.0.0.1:8080       :::*                        LISTEN      2348/Java
tcp        0      0 :::36252                    :::*                        LISTEN      2348/Java
tcp        0      0 :::9123                     :::*                        LISTEN      2348/Java

ところで、なぜRMIポートの前に::ffff:127.0.0.1が表示されないのですか?

コメントを明確にするために2回目の追加

Tomcatとは関係ありません。同様の設定でantを実行しようとしました。Antプロセスは次のようになります。

/usr/bin/Java -XX:+DisableAttachMechanism -Dcom.Sun.management.jmxremote -Dcom.Sun.management.jmxremote.ssl=false -Dcom.Sun.management.jmxremote.authenticate=false -Dcom.Sun.management.jmxremote.local.only=true -Djava.rmi.server.useLocalHostname=true -Djava.rmi.server.useCodebaseOnly=true -Dcom.Sun.management.jmxremote.port=9123 -Dcom.Sun.management.jmxremote.rmi.port=9123 -classpath /usr/Apache-ant-1.9.2/lib/ant-launcher.jar -Dant.home=/usr/Apache-ant-1.9.2 -Dant.library.dir=/usr/Apache-ant-1.9.2/lib org.Apache.tools.ant.launch.Launcher -cp  sleep

残念ながら、追加のリスニングポートが表示されるたびに:

tcp        0      0 :::41200                    :::*                        LISTEN      13597/Java
tcp        0      0 :::9123                     :::*                        LISTEN      13597/Java

追加の実行:

tcp        0      0 :::58356                    :::*                        LISTEN      13629/Java
tcp        0      0 :::9123                     :::*                        LISTEN      13629/Java

回答:それはJavaのバグです

Javaでバグを開くことに成功しました: http://bugs.Java.com/bugdatabase/view_bug.do?bug_id=8035404

47
Michael

一般的な考えに反して、JMX/RMIはこれらすべてのポートを開く必要はありません。実際にそれらを同じにすることができます。つまり、1日の終わりに、ファイアウォールに1つの穴を開けるだけで済みます(ファイアウォールが懸念される場合)。

システムプロパティを設定してみてください。

com.Sun.management.jmxremote.port
com.Sun.management.jmxremote.rmi.port

同じ値に!!

これらを明示的に設定すると、RMIはランダムなポートを選択しなくなります。それらを同じ値に設定すると、リッスンするポートが少なくなります。

これは、Java 7 update 25以降で機能します。

3番目のポートは何ですか?

アプリケーションによって開かれた3番目のポート(または上記のアドバイスに従った場合は2番目のポート)は、Java Attach APIによって使用されます。 JConsoleが「ローカルプロセス」に接続するために使用するものです。 Java Attach API機能は、com.Sun.management.jmxremoteプロパティに関係なくJava 6以降デフォルトで有効になっています。この機能はランダムなポートを使用しますが、この機能はホスト自体からの接続のみを許可するため、実際には問題ではありません。この機能が本当に嫌いな場合は、-XX:+DisableAttachMechanismをコマンドラインに追加して、Java Attach API機能を無効にすることができます。その後、ランダムポートでリッスンするJavaプロセス(この場合はTomcat)が表示されなくなります。

JMXがループバックインターフェイスのみでリッスンするようにする方法

カスタムメイドのアプリケーションでは RMIServerSocketFactory を使用しますが、これはTomcatであるため、Tomcatの JMX Remote Lifecycle Listener を使用して実行する必要があります。

一方、Java 7以降はcom.Sun.management.jmxremote.local.onlyプロパティを持っていることは重要ではありません。ホスト自体からの接続のみが許可されるようにします。 JMXライブラリはループバックインターフェースにバインドすることでこれを達成しないことに注意してください。これは確実にone方法ですが、ホストには潜在的にいくつかのループバックインターフェースがあるため、わずかに不正確です。

実際、全般的に(JDK wrt JMXに最近追加された)、TomcatのJMX Remote Lifecycle Listenerは、本当に奇妙なものにバインドしたい場合を除いて冗長になりましたネットワークインターフェース。

97
peterh

Oracleの使用Java SE 1.8.0_121。

Jmxremote.portとjmxremote.rmi.portを同じ値に設定することができます。1つ少ないポートが開かれます。また、jmxremote.Host = 127.0.0.1を設定して、そのポート(または、それらを別々に設定した場合はこれらの2つのポート)をループバックインターフェイスのみにバインドすることもできます。

ただし、別のポートはまだ動的に割り当てられており、0.0.0.0にバインドされます。 -XX + DisableAttachMechanismを使用してこのポートを防ぐことはできませんでした。また、0.0.0.0以外のものにバインドすることもできませんでした。

4
user2679436

Jmxはrmiにカプセル化されているため、非常にファイアウォールであり、NATには不向きです。可能な場合は避けてください。jmxmpと呼ばれる代替のカプセル化があります。

あなたを助けるかもしれないを見てください: http://blog.markfeeney.com/2010/10/jmx-through-ssh-tunnel.htmlhttp:// jrds。 fr/sourcetype/jmx/start#jmx_protocols

3
fbacchella