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
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.
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
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.
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
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