Назад | Перейти на главную страницу

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

Имея несколько 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-адреса для редактирования в произвольных текстовых редакторах), но может быть сложно сделать правильно.