Заставить произвольное приложение Linux использовать определенный IP-адрес для исходящих соединений

Имея несколько IP-адресов, можно ли заставить произвольное сетевое приложение использовать только определенный IP-адрес при установлении соединений с внешним миром?

Общесистемные маршруты могут быть использованы. Некоторые приложения настраиваются для этого. Но есть ли общий способ?

Скажем, браузер должен всегда использовать IP-адрес, привязанный к "eth0", а torrent-клиент должен использовать IP-адрес, привязанный к "eth1".

Технически, это должно явно передать определенный IP-адрес bind(2) вызов при создании клиентского сокета.

2 ответа

Решение

Вы можете использовать переменную окружения LD_PRELOAD и "взаимное расположение функций" для изменения поведения ваших сетевых программ. См. Эту статью для примера, и вставку функции Google для получения дополнительной информации.

Например, вы можете переопределить системный вызов socket, чтобы после каждого вызова socket() выполнялась соответствующая операция bind().

NB: Эта техника может быть очень забавной для игры (например, я однажды написал что-то, что позволило бы мне "открывать" URL для редактирования в произвольных текстовых редакторах), но может быть сложно получить правильную информацию.

Мое единственное предложение - использовать iptables для перенаправления трафика с одного интерфейса на другой.

Вот ссылка на кого-то, кто сделал что-то похожее: http://straylink.wordpress.com/2006/08/16/using-iptables-to-redirect-packets/

По сути, команда была такой:

iptables -t nat -A PREROUTING -p tcp -d 198.168.1.254 --dport 80 -j REDIRECT --to-ports 8080

Чтобы полностью украсть контент (в случае его исчезновения),

Приведенное выше правило добавляет команду PREROUTING в вашу таблицу nat, сообщая, что все TCP-пакеты, предназначенные для 192.168.1.254 на порту 80, должны перенаправляться на порт 8080 локального хоста. Итак, разбив приведенный выше пример на формат шаблона, вы получите

 iptables -t nat -A PREROUTING -p PROTO -d DEST_IP --dport DEST_PORT -j REDIRECT --to-ports LOCAL_PORTS
Другие вопросы по тегам