Есть довольно много связанных вопросов (например, 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 или маршрутизировать вызовы из моего программа.
(Кстати: исходящий интерфейс необходимо выбирать динамически во время выполнения, т. е. моя программа довольно часто закрывает соединение и пытается повторно подключиться, используя другой исходящий интерфейс.)