Имея несколько IP-адресов, можно ли заставить произвольное сетевое приложение использовать только определенный IP-адрес при установлении соединения с внешним миром?
Можно использовать общесистемные маршруты. Некоторые приложения можно настроить для этого. Но есть ли общий способ?
Скажем, браузер всегда должен использовать IP, привязанный к eth0, а торрент-клиент должен использовать IP, привязанный к eth1.
Технически, это должно явно передать конкретный IP-адрес в bind(2)
вызывается при создании клиентского сокета.
Мое единственное предложение - использовать 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, должны быть перенаправлены на порт localhost 8080. Итак, разбив приведенный выше пример на формат шаблона, вы получите
iptables -t nat -A PREROUTING -p PROTO -d DEST_IP --dport DEST_PORT -j REDIRECT --to-ports LOCAL_PORTS
Вы можете воспользоваться переменной окружения LD_PRELOAD и «взаимодействием функций», чтобы изменить поведение ваших сетевых программ. Видеть Эта статья например, и Google функциональное взаимодействие Чтобы получить больше информации.
Вы можете, например, переопределить системный вызов "socket", чтобы за каждым вызовом socket () следовала соответствующая операция bind ().
NB: С этой техникой может быть очень весело играть (например, я однажды написал что-то, что позволило бы мне «открывать» URL-адреса для редактирования в произвольных текстовых редакторах), но может быть сложно сделать правильно.