【问题标题】:Java Sockets and multiple outgoing interfaces on LinuxLinux 上的 Java 套接字和多个传出接口
【发布时间】:2016-10-09 09:19:46
【问题描述】:

有很多相关的问题(例如 Java Socket specify a certain network interface for outgoing connections )但是我找不到令人满意的即实用的解决方案:

在我的目标 (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 或从我的路由调用程序。

(顺便说一句:传出接口需要在运行时动态选择,即我的程序关闭连接并尝试使用不同的出站接口频繁地重新连接。)

【问题讨论】:

    标签: java linux sockets network-interface outbound


    【解决方案1】:

    据我所知,如果没有设置路由表,您无法选择传出接口。

    在我看来,最好的解决方案是设置一堆源特定路由,这些路由与数据包的源地址匹配,并绑定到给定的源地址,以便选择路线(就像你已经做的那样)。有两种方法可以实现:

    • 使用ip rule 和多个路由表——这在http://lartc.org/howto/lartc.rpdb.html 中有描述;
    • 使用ip route add ... from ...。据我所知,这仅适用于 IPv6,但避免了多个路由表的复杂性。

    您将在 https://arxiv.org/pdf/1403.0445v4.pdf 中找到有关源特定路由的一些背景知识(免责声明,我是合著者)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-26
      • 2014-03-05
      • 2012-11-10
      • 1970-01-01
      • 1970-01-01
      • 2016-11-07
      • 1970-01-01
      • 2013-04-15
      相关资源
      最近更新 更多