Jconsole over SSH local port forwarding

Chciałbym móc zdalnie połączyć się z usługą Java, która ma JMX narażone, jednak jest zablokowana przez firewall. Próbowałem użyć lokalnego przekierowania portów SSH, jednak połączenie nie powiodło się. Patrząc na wireshark, wydaje się, że podczas próby połączenia z jconsole, chce się połączyć przez niektóre efemeryczne porty po podłączeniu do portu 9999, które są blokowane przez firewall.

Czy Jest jakiś sposób, aby jconsole łączyło się tylko przez 9999 lub używało proxy? Czy Ten artykuł jest nadal najlepszym rozwiązaniem ? Czy coś przeoczyłem?

 66
Author: Community, 2013-02-26

4 answers

Czy jest jakiś sposób, aby jconsole łączyło się tylko przez 9999 lub używało proxy? Czy Ten artykuł nadal jest najlepszym rozwiązaniem? Czy coś przeoczyłem?

Tak, Ten artykuł ma rację.

Kiedy określisz port JMX na swoim serwerze (-Dcom.sun.management.jmxremote.port=####), w rzeczywistości podajesz tylko Port rejestru dla aplikacji. Po podłączeniu zapewnia dodatkowy port serwera, z którym jconsole faktycznie wykonuje całą swoją pracę. Aby uzyskać przekierowany do pracy, musisz znać zarówno porty rejestru i serwera.

Coś podobnego powinno działać, aby uruchomić aplikację z portami rejestru i serwera ustawionymi na 8000. Zobacz tutaj, aby uzyskać więcej szczegółów .

-Dcom.sun.management.jmxremote.port=8000
-Dcom.sun.management.jmxremote.rmi.port=8000
-Djava.rmi.server.hostname=127.0.0.1

Na marginesie, Moja Biblioteka SimpleJMX pozwala łatwo ustawić oba porty i można ustawić je oba jako ten sam port.

Więc, gdy już znasz oba porty, które musisz przesłać, możesz skonfigurować swoje ssh dowództwo. Na przykład, jeśli skonfigurujesz porty rejestru i serwera jako 8000, wykonasz:

ssh -L 8000:localhost:8000 remote-host

Tworzy lokalny port 8000, który przekierowuje do localhost: 8000 na zdalnym hoście. Możesz podać wiele argumentów -L, jeśli chcesz przesłać wiele portów. Następnie możesz podłączyć jconsole do localhost: 8000 i odpowiednio połączy się z hostem zdalnym.

Ponadto, jeśli twój serwer ma wiele interfejsów, może być konieczne ustawienie zmiennej java.rmi.server.hostname, aby powiązać z prawy interfejs.

-Djava.rmi.server.hostname=10.1.2.3
 38
Author: Gray,
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
2020-02-05 21:26:10

Jest jeszcze ładniejszy sposób, aby to zrobić używając tunelu SSH socks, ponieważ JConsole obsługuje SOCKS:

  1. Utwórz lokalnie serwer proxy SSH socks na jakimś wolnym porcie (np.]}

    SSH-fN-d 7777 user @ firewalled-host

  2. Uruchom JConsole przez podanie proxy SOCKS (np. localhost: 7777) i adresu serwera JMX (np. localhost:2147)

    Jconsole-J-DsocksProxyHost=localhost-J-DsocksProxyPort=7777 usługa: jmx:rmi:///jndi/rmi: / / localhost:2147 / jmxrmi-J-DsocksNonProxyHosts=

Jak wspomniano w jednej z poniższych odpowiedzi, od JDK 8u60+ musisz również mieć opcję -J-DsocksNonProxyHosts=, aby ją uruchomić.

 118
Author: Bogdan,
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-12-08 13:49:38

Z prawie wszystkimi aktualnymi wersjami JDK (7u25 lub nowszymi) można teraz dość łatwo używać JConsole i Visual JVM przez SSH ( ponieważ teraz można powiązać JMX z jednym portem ).

Używam następujących parametrów JVM

-Dcom.sun.management.jmxremote.port=8090
-Dcom.sun.management.jmxremote.rmi.port=8090
-Djava.rmi.server.hostname=127.0.0.1
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false

Następnie uruchamiam połączenie SSH

ssh my.javaserver.domain -L 8090:127.0.0.1:8090

Po podłączeniu z JConsole

Zdalny proces: - > localhost:8090

I Java Visual VM

Kliknij prawym przyciskiem myszy na Local - > Add JMX Connection - > localhost: 8090

 60
Author: Boris Treukhov,
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
2017-05-23 11:55:07

Kontynuując metodę SSH socks, w nowszych wersjach Javy (około 8u66) należy również ustawić socksnonproxyhosts empty w wyniku:

jconsole -J-DsocksProxyHost=localhost -J-DsocksProxyPort=7777 -J-DsocksNonProxyHosts=
 13
Author: Tristan Hill,
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
2015-08-26 15:41:06