Dlaczego Java otwiera 3 porty, gdy JMX jest skonfigurowany?

Uruchamiam mój program Java z JDK7 na Centos6. Włączam JMX używając następujących opcji:

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"

Kiedy sprawdzam jakie porty są otwarte, odkrywam 2 dodatkowe losowe porty:

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

Należy pamiętać, że każdy restart tylko skonfigurowany port 9123 pozostaje taki sam, a dwa dodatkowe porty zmieniają wartości.

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

Co to są 2 dodatkowe porty i dlaczego są otwierane?

Jak skonfigurować 2 dodatkowe losowe porty?

Jak skonfigurować ::ffff:127.0.0.1 będzie pojawiają się przed otwarciem wszystkich portów przez JMX?

Dlaczego jeden port nie jest używany podczas łączenia z JConsole?

Dodano w celu wyjaśnienia odpowiedzi

Niestety, dodatkowy losowy port jest nadal otwarty Przypominam, że używam Centos 6. Moje Ustawienia Tomcat wyglądają tak (Tomcat nie wdraża żadnych aplikacji):

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"

Proces Tomcat wygląda tak:

/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

Niestety, za każdym razem widzę dodatkowe słuchanie port:

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

Dodatkowy bieg:

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

BTW, dlaczego nie widzę ::ffff:127.0.0.1 przed portami RMI?

Dodano po raz drugi w celu wyjaśnienia komentarza

Nie jest związany z Tomcat. Próbowałem uruchomić ant z podobnymi ustawieniami: Proces Ant wygląda tak:

/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

Niestety za każdym razem widzę dodatkowy port odsłuchowy:

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

Dodatkowy bieg:

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

Odpowiedź: to błąd Javy

Udało mi się otworzyć bug na Javie: http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8035404

 39
Author: Michael, 2014-01-02

4 answers

Wbrew powszechnemu przekonaniu JMX / RMI nie musi otwierać wszystkich tych portów. Możesz wymusić, aby były takie same, co oznacza, że pod koniec dnia będziesz musiał tylko wybić jedną dziurę w zaporze (jeśli firewall jest Twoim problemem).

Spróbuj ustawić właściwości systemu:

com.sun.management.jmxremote.port
com.sun.management.jmxremote.rmi.port

Do tej samej wartości!!

Jawne ich ustawienie powstrzyma RMI od wybierania losowych portów. Ustawienie ich na tę samą wartość sprawi, że otworzy mniej portów do nasłuchu.

To będzie działać w Java 7 update 25 lub nowszej wersji.

Jaki jest trzeci port?

Trzeci port, który widzisz otwarty przez Twoją aplikację (lub drugi, jeśli zastosowałeś się do mojej rady powyżej), jest używany przez Java Attach API. To jest to, czego używa JConsole do łączenia się z "procesem lokalnym". Funkcja dołączania interfejsu API Java jest domyślnie włączona od wersji Java 6 niezależnie od właściwości com.sun.management.jmxremote. Ta funkcja będzie używać portu losowego, ale to naprawdę nie ma znaczenia, ponieważ funkcja pozwala tylko połączenia z samego hosta. Jeśli naprawdę nie podoba Ci się Ta funkcja, możesz dodać -XX:+DisableAttachMechanism do wiersza poleceń, aby wyłączyć funkcję Dołącz API Java. Wtedy proces java (w tym przypadku Tomcat) nie będzie już nasłuchiwał na przypadkowym porcie.

Jak sprawić, by JMX nasłuchiwał tylko na interfejsie loopback

Z niestandardową aplikacją używasz RMIServerSocketFactory Ale To jest Tomcat, więc musisz to zrobić za pomocą Tomcat ' s JMX Remote Lifecycle Listener .

Z drugiej strony nie ma znaczenia, że posiadasz właściwość com.sun.management.jmxremote.local.only od Java 7. Zapewnia, że tylko połączenia z samego hosta są dozwolone. Zauważ, że biblioteka JMX nie osiąga tego poprzez powiązanie z interfejsem loopback, co z pewnością byłoby jednym sposobem na to, ale także lekką niedokładnością, ponieważ host może potencjalnie mieć kilka interfejsów loopback.

W zasadzie (z najnowszymi dodatkami do JDK wrt JMX) chciałbym powiedzmy, że Tomcat ' s JMX Remote Lifecycle Listener {[18] } jest teraz redundantny, chyba że chcesz połączyć się z jakimś naprawdę dziwnym interfejsem sieciowym.

 88
Author: peterh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-13 14:51:32

Ponieważ jmx jest zamknięty w rmi, który jest bardzo nieprzyjazny dla Firewalla i nat. Unikaj tego, jeśli możesz, istnieje alternatywna enkapsulacja o nazwie jmxmp.

Spójrz, to może Ci pomóc : http://blog.markfeeney.com/2010/10/jmx-through-ssh-tunnel.html http://jrds.fr/sourcetype/jmx/start#jmx_protocols

 2
Author: fbacchella,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-02 16:14:55

Using Oracle Java SE 1.8.0_121.

Można ustawić jmxremote.port i jmxremote.rmi.port do tej samej wartości, to jeden otwarty port mniej. Możliwe jest również ustawienie jmxremote.host=127.0.0.1, aby mieć ten port (lub te dwa porty, jeśli ustawisz je inaczej) wiąże się tylko z interfejsem loopback.

Inny port jest nadal dynamicznie przypisywany i będzie wiązał się z 0.0.0.0. Nie byłem w stanie zapobiec temu portowi za pomocą-XX+Disableattachmechanizm, a także nie byłem w stanie zrobić wiąże się z czymkolwiek innym niż 0.0.0.0.

 1
Author: user2679436,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-04-11 23:43:17

Jak na problem, który Michael otworzył to wydaje się być oczekiwanym zachowaniem https://bugs.openjdk.java.net/browse/JDK-8035404

 0
Author: Pushkar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-21 14:29:17