JConsole su ssh port forwarding locale

Mi piacerebbe essere in grado di connettersi da remoto a un servizio Java con JMX esposto, ma è bloccato da un firewall. Ho provato a utilizzare ssh port forwarding locale, tuttavia la connessione non riesce. Guardando wireshark, sembra che quando si tenta di connettersi con jconsole, vuole connettersi tramite alcune porte effimere dopo la connessione alla porta 9999, che sono bloccati dal firewall.

C’è un modo per far sì che jconsole si connetta solo tramite 9999 o usi un proxy? Questo articolo è ancora la soluzione migliore ? O mi sta sfuggendo qualcosa?

C’è un modo per far sì che jconsole si connetta solo tramite 9999 o usi un proxy? Questo articolo è ancora la soluzione migliore? O mi sta sfuggendo qualcosa?

Sì, quell’articolo è giusto.

Quando si specifica la porta JMX sul proprio server ( -Dcom.sun.management.jmxremote.port=#### ), si sta effettivamente specificando solo la porta del registro per l’applicazione. Quando ti connetti, fornisce una porta server aggiuntiva a cui jconsole fa tutto il suo lavoro. Per essere inoltrati al lavoro, è necessario conoscere sia le porte del registro che quelle del server.

Qualcosa come il seguente dovrebbe funzionare per eseguire l’applicazione con entrambe le porte del registro e del server impostate su 8000. Vedi qui per maggiori dettagli .

 -Dcom.sun.management.jmxremote.port=8000 -Dcom.sun.management.jmxremote.rmi.port=8000 

Per inciso , la mia libreria SimpleJMX ti permette di impostare facilmente entrambe le porte e puoi impostarle entrambe per essere la stessa porta.

Quindi, una volta che si conoscono entrambe le porte che è necessario inoltrare, è ansible impostare il comando ssh . Ad esempio, se si configurano le porte del registro e del server come 8000, si dovrebbe:

 ssh -L 8000:localhost:8000 remote-host 

Questo crea una porta locale 8000 che inoltra a localhost: 8000 sull’host remoto. È ansible specificare più argomenti -L se è necessario inoltrare più porte. Quindi è ansible connettere jconsole a localhost: 8000 e si collegherà all’host remoto in modo appropriato.

Inoltre, se il tuo server ha più interfacce, potrebbe essere necessario impostare entrambe le seguenti variabili per fare in modo che le porte del registro e del server si colleghino all’interfaccia corretta:

 -Djava.rmi.server.hostname=10.1.2.3 

C’è un modo ancora più bello per farlo usando un tunnel SSH, dal momento che JConsole supporta SOCKS:

  1. Creare localmente il proxy SSH socks su una porta libera (ad es. 7777):

    ssh -fN -D 7777 utente @ firewalled-host

  2. Esegui JConsole specificando il proxy SOCKS (ad esempio localhost: 7777) e l’indirizzo per il server JMX (ad es. Localhost: 2147)

    jconsole -J-DsocksProxyHost = localhost -J-DsocksProxyPort = 7777 servizio: jmx: rmi: /// jndi / rmi: // localhost: 2147 / jmxrmi -J-DsocksNonProxyHosts =

Come menzionato in una delle risposte seguenti, da JDK 8u60 + è necessario avere l’opzione -J-DsocksNonProxyHosts= per farlo funzionare.

Con quasi tutte le attuali versioni JDK (7u25 o successive) è ora ansible utilizzare JConsole e Visual JVM su SSH abbastanza facilmente ( perché ora è ansible associare JMX a una singola porta ).

Io uso i seguenti parametri 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 

Quindi lancio la connessione SSH

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

Dopo posso collegarmi da JConsole

Processo remoto: -> localhost: 8090

E Java Visual VM

Fare clic con il tasto destro su Locale -> Aggiungi connessione JMX -> localhost: 8090

Continuando il metodo SSH socks, con le versioni java più recenti (circa 8u66) è anche necessario impostare socksNonProxyHosts vuoto risultante in:

 jconsole -J-DsocksProxyHost=localhost -J-DsocksProxyPort=7777 -J-DsocksNonProxyHosts=