Это как-то связано с Изменить интерфейс для Whois
Разница в том, что я хотел бы знать, можно ли указать интерфейс по умолчанию только для конкретной программы, а не для всей системы. Например: допустим, у моего сервера несколько IP-адресов. Я хочу запустить программу X (скажем, wget), и я хочу, чтобы она использовала один из моих IP-адресов в качестве исходного адреса. Это выглядело бы так:
theprogram --use-interface=1.2.3.4 wget google.com
и wget будет использовать мой IP 1.2.3.4 для подключения к google.com и получения html. Является ли это возможным?
Люди здесь предложили несколько работоспособных альтернатив тому, что вы хотите делать. Маршрутизация и NAT источника могут помочь, но могут решить или не решить проблему, которую вы пытаетесь решить.
Вы жестяная банка делайте именно то, что вы просили, если вы готовы многого в малом. Вы можете использовать магию функциональное взаимодействие через LD_PRELOAD
завернуть bind()
системный вызов с кодом по вашему выбору.
На следующих страницах есть информация, которая дает более подробную информацию об этом решении:
Это будет работать только до тех пор, пока код, который вы используете, не SUID (из соображений безопасности программы SUID / SGID не могут быть изменены с помощью LD_PRELOAD
).
Многие, но далеко не все программы имеют возможность связываться с определенным адресом. Некоторые, такие как wget (как указано fbh), имеют параметр командной строки, чтобы указать, к какому адресу привязаться. Многие другие серверные программы, такие как apache и squid, контролируют это в своем файле конфигурации. Это всегда будет зависеть от конкретной программы.
Для программ, которые не поддерживают привязку к определенному адресу, ваши возможности могут быть более ограниченными, в зависимости от того, с какой программой вы имеете дело.
Для серверной программы (которая принимает входящие соединения) вы обычно можете выполнить то же самое, прослушивая все адреса (что обычно по умолчанию), а затем используя iptables или внешний маршрутизатор, чтобы защитить другие адреса.
Сложнее обстоит дело с исходящими соединениями. Здесь вам понадобится что-то большее, чем описано в ответе, на который вы ссылались в своем вопросе. Проблема в том, что он зависит от адреса назначения, а не от исходной программы.
Возможно, вы сможете добиться желаемого с помощью iptables и правила SNAT.
iptables -A POSTROUTING -p tcp --dport 80 -j SNAT --to-source 1.2.3.4
Это правило iptables (которое у меня не проверено), должен чтобы изменить исходный адрес для любого трафика, идущего на порт 80. Если вам нужно одинаковое поведение для трафика TCP и UDP, вам нужно будет создать два правила, заменив '-p tcp' на '-p udp' во втором один.
С wget вы можете использовать --bind-address
В противном случае, я думаю, вам нужно либо указать маршрут для IP-адреса назначения, либо посмотреть в программе, которую вы пытаетесь использовать, есть ли у нее способ определения адреса привязки / источника.