1

У меня есть основной IP-адрес для всех задач, связанных с системой. Иногда мне приходится использовать свою систему для выполнения различных тестов, и большую часть времени мне приходится иметь дело со скриптами bash/shell. Я хочу, чтобы используемые тесты / пропускная способность были полностью отделены от первичного IP, поэтому я хочу выполнять операции с использованием вторичного IP. Как мне этого добиться?

1 ответ1

2

Речь идет не столько о 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 :).

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .