web-dev-qa-db-fra.com

JConsole sur la redirection de port local ssh

J'aimerais pouvoir me connecter à distance à un service Java qui a JMX exposé, mais il est bloqué par un pare-feu. J'ai essayé d'utiliser la redirection de port local ssh, mais la connexion échoue En regardant Wireshark, il semble que lorsque vous essayez de vous connecter avec jconsole, il souhaite se connecter via certains ports éphémères après la connexion au port 9999, qui sont bloqués par le pare-feu.

Existe-t-il un moyen de faire en sorte que jconsole se connecte uniquement via 9999 ou utilise un proxy? cet article est-il toujours la meilleure solution ? Ou est-ce que je manque quelque chose?

58
blockcipher

Existe-t-il un moyen de faire en sorte que jconsole se connecte uniquement via 9999 ou utilise un proxy? cet article est-il toujours la meilleure solution? Ou est-ce que je manque quelque chose?

Oui, cet article est à peu près juste.

Lorsque vous spécifiez le port JMX sur votre serveur (-Dcom.Sun.management.jmxremote.port=####), vous spécifiez uniquement le port de registre pour l'application. Lorsque vous vous connectez, il fournit un port de serveur supplémentaire avec lequel la jconsole fait tout son travail. Pour être transféré au travail, vous devez connaître à la fois les ports de registre et de serveur.

Quelque chose comme ce qui suit devrait fonctionner pour exécuter votre application avec les ports de registre et de serveur définis sur 8000. Voir ici pour plus de détails .

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

En passant, ma bibliothèque SimpleJMX vous permet de définir facilement les deux ports et vous pouvez les définir comme étant le même port.

Ainsi, une fois que vous connaissez les ports que vous devez transférer, vous pouvez configurer votre commande ssh. Par exemple, si vous configurez le registre et les ports du serveur sur 8000, vous feriez:

ssh -L 8000:localhost:8000 remote-Host

Cela crée un port local 8000 qui transmet à localhost: 8000 sur l'hôte distant. Vous pouvez spécifier plusieurs -L arguments si vous devez transférer plusieurs ports. Ensuite, vous pouvez connecter votre jconsole à localhost: 8000 et elle se connectera à l'hôte distant de manière appropriée.

De plus, si votre serveur possède plusieurs interfaces, vous devrez peut-être définir à la fois la variable suivante pour que les ports de registre et de serveur se lient à la bonne interface:

-Djava.rmi.server.hostname=10.1.2.3
32
Gray

Il existe une façon encore plus agréable de le faire en utilisant un tunnel de chaussettes SSH, car JConsole prend en charge SOCKS:

  1. Créez le proxy SSH socks localement sur un port libre (par exemple 7777):

    ssh -fN -D 7777 utilisateur @ hôte pare-feu

  2. Exécutez JConsole en spécifiant le proxy SOCKS (par exemple localhost: 7777) et l'adresse du serveur JMX (par exemple localhost: 2147)

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

Comme mentionné dans l'une des réponses ci-dessous, à partir de JDK 8u60 +, vous devez également avoir le -J-DsocksNonProxyHosts= option pour le faire fonctionner.

106
Bogdan

Avec presque toutes les versions JDK actuelles (7u25 ou ultérieur), il est désormais possible d'utiliser JConsole et Visual JVM sur SSH assez facilement ( car vous pouvez désormais lier JMX à un seul port ).

J'utilise les paramètres JVM suivants

-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

Ensuite, je lance la connexion SSH

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

Une fois que je peux me connecter depuis JConsole

Processus distant: -> localhost: 8090

Et Java Visual VM

Clic droit sur Local -> Ajouter une connexion JMX -> localhost: 8090

51
Boris Treukhov

Poursuivant la méthode SSH socks, avec les nouvelles versions Java (environ 8u66)), vous devez également définir socksNonProxyHosts vide, ce qui entraîne:

jconsole -J-DsocksProxyHost=localhost -J-DsocksProxyPort=7777 -J-DsocksNonProxyHosts=
12
Tristan Hill