2017-10-28 71 views
0

我們的產品有兩個接口,一個是面向客戶的內部接口。是否有可能讓rmi僅在特定接口(如環回)上運行,或者我們是否需要使用防火牆規則來防止訪問?如何限制Java RMI到特定的接口?

有沒有辦法讓服務器只綁定到指定接口的請求?我發現這個屬性可以在服務器上設置,這是否會阻止外部請求?

-Djava.rmi.server.hostname=127.0.0.1

有沒有辦法有rmiregistry中選擇它偵聽像MySQL的綁定選項的界面?

這個問題似乎有關,但我希望有一個簡單的答案: Java RMI: How can I restrict RMI method to only be called internally by the client object

+0

是的,它可能的,使用插座工廠。 https://docs.oracle.com/javase/7/docs/api/java/rmi/server/UnicastRemoteObject.html#UnicastRemoteObject(int,%20java.rmi.server.RMIClientSocketFactory,%20java.rmi.server.RMIServerSocketFactory) – Antoniossss

回答

1

我發現這個特性,可以在服務器上進行設置,這也防止外部請求?

-Djava.rmi.server.hostname=127.0.0.1 

該屬性控制哪些IP地址放在刪除此JVM導出對象的存根。如果你想限制這些客戶端的'本地主機'設置這實際上會工作,但它不是一個很好的解決方案。

您將不得不導出帶有RMIServerSocketFactory的遠程對象,該RMIServerSocketFactory會創建綁定到您想要的特定IP地址的ServerSockets

有沒有辦法讓rmiregistry選擇它所監聽的接口,就像mysql的綁定選項一樣?

相同的答案。您將不得不通過LocateRegistry.createRegistry(int port, RMIServerSocketFactory ssf, RMIClientSocketFactory csf)自己導出註冊表。 csf當然可以爲空。

如果您在導出JVM中使用了多個實例,請確保您的RMIServerSocketFactory已合理實現equals(),例如,只要綁定IP地址相同,它們就是相等的。

這個問題似乎與

它不是。

+0

有沒有更好的方法來保護您建議的RMI端口?主要目標是防止來自我們客戶網絡的攻擊。 – simgineer