Сокеты Java и несколько исходящих интерфейсов в Linux

Есть довольно много связанных вопросов (например, Java Socket указать определенный сетевой интерфейс для исходящих соединений ), однако я не смог найти удовлетворительного, т.е. практического решения моей проблемы:

На моей целевой (Linux) платформе есть несколько сетевых интерфейсов (eth0...ethN), с которых доступен сервер S. Маршрут по умолчанию обычно проходит через eth0, однако я пытаюсь подключить S через, например. eth4 используя

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

or

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

В этом примере IP-адрес eth4 назначен правильно, но трафик все еще идет через интерфейс маршрута по умолчанию. Я узнал, что это связано с «моделью слабой конечной системы» RFC 1122. Однако мне интересно, есть ли еще решение на основе Java для достижения моей первоначальной цели или мне нужно запускать внешние iptables или маршрутизировать вызовы из моего программа.

(Кстати: исходящий интерфейс необходимо выбирать динамически во время выполнения, т. е. моя программа довольно часто закрывает соединение и пытается повторно подключиться, используя другой исходящий интерфейс.)


person Tom    schedule 09.10.2016    source источник


Ответы (1)


Насколько я знаю, вы не можете выбрать исходящий интерфейс без настройки таблицы маршрутизации.

На мой взгляд, лучшее решение — настроить набор маршрутов для конкретного источника, маршрутов, которые совпадают с исходным адресом пакета, и выполнить привязку к заданному исходному адресу, чтобы выбрать маршрут. (как вы уже делаете). Есть два способа добиться этого:

  • использовать ip rule и несколько таблиц маршрутизации — это описано в http://lartc.org/howto/lartc.rpdb.html ;
  • используйте ip route add ... from .... Насколько я знаю, это работает только для IPv6, но позволяет избежать сложности с несколькими таблицами маршрутизации.

Вы найдете некоторые сведения о маршрутизации для конкретного источника в https://arxiv.org/pdf/1403.0445v4.pdf (отказ от ответственности, я соавтор).

person jch    schedule 09.10.2016