【问题标题】:I cannot get Java JMX server to bind to 127.0.0.1 only!我无法让 Java JMX 服务器仅绑定到 127.0.0.1!
【发布时间】:2012-09-26 00:29:01
【问题描述】:

我有一个 java 服务器。我希望能够使用 JMX 客户端连接到它。 我这样做:

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

这行得通。我可以启动 JConsole 并连接到我机器上的 JMX_PORT 并显示漂亮的图表。

有问题。这会导致 JMX 服务器绑定到所有接口上的 JMX_PORT。我只想让它绑定到 127.0.0.1。否则,这对我来说是一个安全问题。

根据文档,JMXServiceURL jmxUrl = new JMXServiceURL(null,null,config.getJmxRemotePort()); 应该使用默认协议 (jmxmp) 和 localhost 创建一个 JMXServiceURL。我试过明确地给它“127.0.0.1”作为绑定地址,但它也不起作用。

Java 的 JMX 服务器绑定到所有 IP 地址,并且拒绝只绑定到 127.0.0.1。

【问题讨论】:

  • 只是为了让大家知道,我的所有研究都让我相信不可能将 JMX 绑定到一个特定的 IP 地址。它绑定到他们所有人。
  • 似乎 -Djmx.remote.server.address.wildcard=false 可能会强制它绑定到一个 IP 地址:blog.markfeeney.com/2010/10/jmx-through-ssh-tunnel.html
  • 如果您使用 RMI 作为您的协议,请参考此 URL:dev.303.se/development/95/limiting-rmi-to-127-0-0-1
  • 这不是正确的答案。 -Djmx.remote.server.address.wildcard=false 使 JMX 只绑定到它给定的地址。
  • 这是 JVM 的哪个版本,在哪个平台上?这在未来可能会非常有用。

标签: java jmx


【解决方案1】:

运行此代码:

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();
  }
}

如果您将null 作为主机参数传递,该类将使用InetAddress.getLocalHost().getHostName()。对我来说,至少它不返回“127.0.0.1”,它使用我机器的名称,根据描述,这实际上似乎是错误的(这不是我的环回地址)。该地址可供其他机器使用。尝试时会发生什么:

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

或:

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

如果未提供,协议默认为“jmxmp”。

【讨论】:

  • @cletus - 我对InetAddress.getLocalHost() 的javadoc 的解读是,该方法正常返回本地机器的主机名/IP,并且仅在安全管理器说“不!”时才返回环回IP。
  • @Stephen:这也是我的阅读,但运行我上面粘贴的小程序。它返回的是机器的名称和 DHCP 地址,而不是环回地址。
  • 你误会我了。我是说我不希望它返回环回地址......通常!否则,为什么 javadoc 会包含关于环回地址的最后一句话?
  • 我不认为这是问题所在,因为将“127.0.0.1”作为 JMXServiceURL 构造函数的第二个参数提供也会导致 JMX 绑定到所有可用接口。我已经在 iptables 中减轻了对端口的过滤,但如果 JMX 没有首先绑定到公共接口上的端口,我会感觉更舒服。
猜你喜欢
  • 2021-05-30
  • 1970-01-01
  • 1970-01-01
  • 2012-10-30
  • 2011-08-09
  • 1970-01-01
  • 2012-02-08
相关资源
最近更新 更多