繁体   English   中英

java rmi -Djava.rmi.server.hostname=localhost 仍然打开一个监听 0.0.0.0 的套接字

[英]java rmi -Djava.rmi.server.hostname=localhost still opens a socket listening on 0.0.0.0

我使用-Djava.rmi.server.hostname=localhost选项使 rmi 仅在 localhost 上侦听,但 netstat 显示套接字正在侦听0.0.0.0

奇怪的是,RMI RenewClean 线程显示它使用本地主机。 例如 RMI RenewClean-[本地主机:59357]

我假设如果我设置-Djava.rmi.server.hostname=localhost它应该只监听 127.0.0.1

我是否误解了 java.rmi.server.hostname 控制的内容?

我假设如果我设置 -Djava.rmi.server.hostname=localhost 它应该只监听 127.0.0.1

不。

我是否误解了 java.rmi.server.hostname 控制的内容?

是的。 java.rmi.server.hostname与远程对象侦听的 IP 地址没有任何关系。 这是由RMIServerSocketFactory.决定的RMIServerSocketFactory.

在另一个答案中更正我书中的错误引用(随后删除):

java.rmi.server.hostname:主机名字符串; 默认值是“dotted-quad”格式的本地主机的IP地址......当导出远程对象时,它被嵌入到由这个JVM创建的远程存根中。 这可用于控制多宿主主机导出的 RMI 服务器的有效 IP 地址。 此属性在 JVM 的生命周期中只读取一次。 [1]

为了扩展这一点,它还可以用于控制 NAT 设备后面的主机导出的 RMI 服务器的有效 IP 地址(如客户端所见)。 它不一定与本地主机有关,例如在 NAT 情况下,它可以是主机名、点分四组 IPv4 地址或 IPv6 地址。

[1] Pitt & McNiff, java.rmi,远程方法调用指南, Addison Wesley 2001,第 258 页。

我自己遇到了这个问题,我想提供一个不同的上下文来向那些熟悉 HTTP 工作原理的人解释这个值是什么。 当您最初连接到 com.sun.management.jmxremote.port 指定的端口时,响应的效果与 HTTP 重定向到由以下内容组成的名称相同:java.rmi.server.hostname:com.sun.management.jmxremote .rmi.port。 这意味着主机名必须 a) 可由 JMX 客户端解析,并且 b) 允许通过路由和防火墙连接。 但是,该端口也可以与提供重定向的初始端口重叠。

现在,问题是:你能阻止重定向吗? 据我所知,不。 我尝试将主机名设置为各种值,例如 0.0.0.0、255.255.255.255、''(空)。 我也将端口设置为“0”,看看这是否会影响行为。 不。 尽管您可以连接到相同的端口以进行查找和协议的 RMI 部分,但它并不能让您仅建立与相同解析 IP 的连接。

我认为这种行为是为了允许一个进程充当多个进程或集群中多个节点的 RMI 端口的中央索引,但是对于 NAT,它只是协议设计中过去几天的恼人遗物。

由于 Java 8u102 -Dcom.sun.management.jmxremote.host 绑定到特殊 IP 地址。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM