Заставить произвольное приложение 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