gpt4 book ai didi

java - 如何将 JMX 配置为仅绑定(bind)到本地主机?

转载 作者:行者123 更新时间:2023-11-29 09:35:26 34 4
gpt4 key购买 nike

我在 Centos6 上使用 JDK8 运行 Tomcat8。我使用以下选项启用 JMX:

CATALINA_OPTS="${CATALINA_OPTS} -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9123 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.local.only=true"

不幸的是,当我检查打开了哪些端口时,我发现这些端口监听所有 IP:

netstat -plunt | grep java
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 :::60555 :::* LISTEN 22752/java
tcp 0 0 ::ffff:127.0.0.1:8080 :::* LISTEN 22752/java
tcp 0 0 :::9123 :::* LISTEN 22752/java
tcp 0 0 :::40867 :::* LISTEN 22752/java

我想如果我配置 -Dcom.sun.management.jmxremote.local.only=true 所有端口应该只绑定(bind)到 localhost (::ffff:127.0.0.1 将出现在所有端口之前)。

如何配置 JMX 以仅绑定(bind)到本地主机?

已添加

我不创建 JMX 我使用 Tomcat JMX:https://tomcat.apache.org/tomcat-8.0-doc/monitoring.html

最佳答案

你的要求是不必要的。

com.sun.management.jmxremote.local.only=true(顺便说一句,这已经是默认设置)意味着它将只接受 来自本地主机的连接。这并不意味着它只会像您假设的那样绑定(bind)到环回接口(interface)。不接受来自不在本地主机上的连接只是另一种方式。从 sun.management.jmxremote.LocalRMIServerSocketFactory 你可以看到它是这样完成的:

// Walk through the network interfaces to see
// if any of them matches the client's address.
// If true, then the client's address is local.
while (nis.hasMoreElements()) {
NetworkInterface ni = nis.nextElement();
Enumeration<InetAddress> addrs = ni.getInetAddresses();
while (addrs.hasMoreElements()) {
InetAddress localAddr = addrs.nextElement();
if (localAddr.equals(remoteAddr)) {
return socket;
}
}
}

为什么这样做而不是绑定(bind)到环回,我不知道。但我相信它同样安全。 (也许不是?)

但如果您真的想要,那么由于 Java 8u102 和 Java 7u131 系统属性 com.sun.management.jmxremote.host 将底层 RMI 注册表绑定(bind)到选定的网络接口(interface)。该值可以是 InetAddress.getByName(String) 接受的任何字符串。 .

例子:

-Dcom.sun.management.jmxremote.host=localhost

参见:JDK-6425769获取更多信息。

链接:Java 8u102 Release Notes

文档在任何地方都没有提到的是,即使在设置 com.sun.management.jmxremote.host 时,您仍然会看到一个绑定(bind)到所有网络接口(interface)的 JMX 端口。这是因为如果 com.sun.management.jmxremote.local.only=true 那么 sun.management.jmxremote.LocalRMIServerSocketFactory 的实例将被启动,而那个实例不会不允许自定义,即它不尊重 com.sun.management.jmxremote.host 属性。如果那是一个错误,那么 JDK-6425769 中的一个疏忽实现还是故意的,我不知道。

关于java - 如何将 JMX 配置为仅绑定(bind)到本地主机?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35367232/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com