2010-02-22 11 views
0

J'ai un serveur Java. Je veux pouvoir me connecter avec un client JMX. Je fais ceci:Je ne peux pas obtenir le serveur Java JMX à lier à 127.0.0.1 seulement!

JMXServiceURL jmxUrl = new JMXServiceURL(null,null,JMX_PORT); 
JMXConnectorServer jmxRemoteServer; 
jmxRemoteServer=JMXConnectorServerFactory.newJMXConnectorServer(jmxUrl, jmxEnvironment, server); 
jmxRemoteServer.start(); 

Cela fonctionne. Je peux lancer JConsole et me connecter à JMX_PORT sur ma machine et de jolis graphes apparaissent.

Il y a un problème. Cela provoque le serveur JMX à lier à JMX_PORT sur toutes les interfaces. Je veux l'avoir lié à 127.0.0.1 seulement. Sinon, c'est un problème de sécurité pour moi.

Selon la documentation, JMXServiceURL jmxUrl = new JMXServiceURL(null,null,config.getJmxRemotePort()); doit créer un JMXServiceURL avec le protocole par défaut (jmxmp) et localhost. J'ai essayé de lui donner "127.0.0.1" explicitement comme une adresse à lier, et cela n'a pas fonctionné non plus.

Le serveur JMX Java se lie à toutes les adresses IP et refuse de se lier à 127.0.0.1 uniquement.

+0

Semble que -Djmx.remote.server.address.wildcard = false pourrait faire l'affaire pour le forcer à se lier à une adresse IP: http://blog.markfeeney.com/2010/10/jmx-through-ssh -tunnel.html – user589545

+0

Juste pour que tout le monde le sache, toutes mes recherches m'ont amené à croire qu'il n'est pas possible de lier JMX à une seule adresse IP particulière. Cela les lie tous. –

+0

Si vous utilisez RMI comme protocole, veuillez vous référer à cette URL: http://dev.303.se/development/95/limiting-rmi-to-127-0-0-1/ – avis

Répondre

0

Exécuter ce code:

public static void main(String args[]) { 
    try { 
    InetAddress local = InetAddress.getLocalHost(); 
    System.out.println("Host address: " + local.getHostAddress()); 
    System.out.println("Host name: " + local.getHostName()); 
    System.out.println("Canonical host name: " + local.getCanonicalHostName()); 
    System.out.println("Address: " + local.getAddress()); 
    } catch (UnknownHostException e) { 
    e.printStackTrace(); 
    } 
} 

Si vous passez null comme argument hôte utilise la classe InetAddress.getLocalHost().getHostName(). Pour moi au moins il ne retourne pas "127.0.0.1", il utilise le nom de ma machine, ce qui me semble faux en raison de la description (ce n'est pas mon adresse de bouclage). Cette adresse est utilisable par d'autres machines. Qu'est-ce qui se passe lorsque vous essayez:

JMXServiceURL jmxUrl = new JMXServiceURL("http","127.0.0.1",JMX_PORT); 

ou:

JMXServiceURL jmxUrl = new JMXServiceURL(null,"127.0.0.1",JMX_PORT); 

Si non fournis, les paramètres par défaut du protocole à "jmxmp".

+0

@cletus - ma lecture du javadoc pour 'InetAddress.getLocalHost()' est que la méthode renvoie normalement le nom d'hôte/IP de la machine locale et ne renvoie que l'adresse IP de bouclage si le gestionnaire de sécurité dit "Non!". –

+0

@Stephen: ce serait ma lecture aussi, mais exécutez le petit programme que j'ai collé ci-dessus. Il retourne le nom de la machine et l'adresse DHCP et non l'adresse de bouclage. – cletus

+0

vous vous méprenez. Je dis que je ne m'attendrais pas à ce qu'il renvoie l'adresse de bouclage ... normalement! Sinon, pourquoi le javadoc inclurait-il la dernière phrase sur l'adresse de bouclage? –