2016-10-09 60 views
1

輸出接口有相當多幾個相關的問題(如Java Socket specify a certain network interface for outgoing connections),但是我找不到我的問題一個令人滿意的,即實際的解決方案:Java的插座和多個Linux上

在我的目標(的Linux)平臺有多個網絡接口(eth0 ... ethN),從中可以訪問服務器S.默認路由通常是通過eth0,但是我試圖通過例如連接S來連接。 ETH4使用

new java.net.Socket(IP_of_S, targetport, IP_of_eth4, srcport) 

sock.bind(eth4_SocketAddress); 
sock.connect(S_SocketAddress); 

在ETH4的IP已被正確分配,但交通仍然會走出低谷的缺省路由的接口這個例子情況。我瞭解到這是由於「弱端系統模型」RFC 1122所致。但是,我想知道是否仍然有一個基於Java的解決方案來實現我的原始目標,或者是否必須觸發外部iptables或路由來自我的電話程序。

(BTW:輸出接口需要在運行時動態選擇,即我的程序關閉了連接,並嘗試使用不同的輸出接口非常頻繁地重新連接。)

回答

0

據我所知,你不能選擇沒有一些路由表設置的傳出接口。

在我看來,最好的解決方案是設置一堆源特定路由,匹配一個數據包的源地址的路由,並綁定到給定的源地址,以便選擇路由(如你已經這樣做)。有實現這一目標的方法有兩種:

  • 使用ip rule和多個路由表 - 這是在http://lartc.org/howto/lartc.rpdb.html描述;使用ip route add ... from ...。據我所知,這隻適用於IPv6,但避免了多個路由表的複雜性。

您會在https://arxiv.org/pdf/1403.0445v4.pdf(免責聲明,我是合作作者)中找到有關源特定路由的一些背景信息。