簡體   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