我正在通過SSH隧道隧道傳輸cajo rmi流量。通過SSH隧道傳輸所有RMI流量
爲此,我有一臺運行SSH deamon(apache Mina)的服務器和一臺運行SSH客戶端(Trilead SSH)的客戶端。
可以建立這些機器之間的shh連接,並通過應用本地和遠程端口轉發我可以隧道rmi流量,但是這隻適用於延長(到服務器)方向。
的設置:
主動SSH連接(端口22)
客戶端:轉發本地端口4000,遠程主機端口第1198(此流量實際上去trhough隧道) 服務器:轉發服務器端口4000到客戶端端口1198(隧道的這部分沒有被使用cajo)
服務器出口使用對象:
Remote.config(null, 1198, null, 0);
ItemServer.bind(new SomeObject(), "someobject");
客戶端不會使用對象查找:
ObjectType someObject = (ObjectType)TransparentItemProxy.getItem(
"//localhost:4000/someobject",
new Class[] { ObjectType.class });
logger.info(someObject.getName());
端口轉發是使用在客戶端的三鉛SSH庫調用:
conn.createLocalPortForwarder(4000, "Server-IP", 1198);
conn.requestRemotePortForwarding("localhost" 4000, "Client-IP", 1198);
當使用Wireshark分析兩個機器之間的IP通信,我發現通過隧道將查詢重定向,但迴應不是。 負責人通常發送到客戶端的1198端口。
如何強制服務器將遠程調用的響應發送到本地端口,以便將其傳回客戶端?
UPDATE:這裏的問題是,對RMI對象的端口不同,那麼註冊表端口,因此還需要進行轉發。
簡而言之,客戶端10.0.0.1會查找到//10.0.0.1:4000,並將其轉發到服務器上的RMI端口(通過隧道)。 隨後,服務器響應10.0.0.1:1198,我希望服務器將其流量發送到其本地端口4000,以便使用隧道。
我試圖擺弄cajo Remote.config(ServerAddress,ServerPort,ClientAddress,ClientPort)設置,但是當我將clientaddress設置爲10.0.0.1或127.0.0.1這個方法時,我無法獲取響應回來,我沒有看到任何響應的交通...
將響應發送回請求發送到的相同連接。你在談論一個*回調*? – EJP
他在這裏回答了答案中的細節嗎? http://stackoverflow.com/questions/1734558/java-rmi-via-ssh-v2-protocol - 好像他可能錯過了至少一次轉移 – Petesh
謝謝Petesh和EJP,我正在重新思考我的設計。 RMI註冊表可能運行在與RMI服務器不同的端口上。定製RMI服務器端口我想我需要實現一個自定義套接字facktory,如下所述:http://www.javaranch.com/journal/2003/10/rmi-ssh_p1.html –