У меня есть основной IP-адрес для всех задач, связанных с системой. Иногда мне приходится использовать свою систему для выполнения различных тестов, и большую часть времени мне приходится иметь дело со скриптами bash/shell. Я хочу, чтобы используемые тесты / пропускная способность были полностью отделены от первичного IP, поэтому я хочу выполнять операции с использованием вторичного IP. Как мне этого добиться?
1 ответ
Речь идет не столько о bash, сколько о командах, которые вы используете в скрипте. Как правило, исходный IP-адрес выбирается в соответствии с целевым IP-адресом. Некоторые инструменты могут позволить вам указать исходный IP-адрес или вы можете переписать исходный IP-адрес с помощью iptables
если вы можете сопоставить скрипт, например, с помощью uid/gid.
На самом деле, нет способа привязать IP-адреса источника к процессам (и вам также понадобятся подпроцессы для его наследования). Если вы согласны с перезаписью исходного IP-адреса, вы можете переключить процесс сценария на специальный идентификатор группы:
Как корень:
ip4_address=... # fill in your ipv4 address
group=secondaryip # or any other name
groupadd $group
usermod your-user -aG $group # not needed for the root user
iptables -t nat -A POSTROUTING \
-m owner --gid-owner $group \
-j SNAT --to-source $ip4_address
Запустите скрипт, используя:
sg secondaryip "/path/to/your/script arg1 arg2"
В качестве альтернативы вы можете вызывать отдельные команды внутри ваших скриптов, используя sg
. Прочитайте его страницу руководства для более подробной информации. Кроме того, существуют хитрости, позволяющие запустить скрипт самостоятельно с помощью команды sg
но вам это не нужно. Вы можете использовать классическую команду newgrp
и передать ей сценарий оболочки через stdin
но это не сработает для perl (упомянуто в вашем комментарии).
Примечание. Команды, используемые в скрипте, не будут знать об измененном исходном IP-адресе, но обычно это не должно быть проблемой.
Для полноты картины есть еще один способ. Вы можете использовать переменную среды LD_PRELOAD для замены некоторых символов libc, например connect()
на вашу собственную версию, которая будет выполнять дополнительные действия, такие как привязка к конкретному адресу источника. Но это немного продвинутое программирование на C, и вам лучше придерживаться обычных waepons :).