Случайное изменение исходящего IP-адреса

Если у нас есть сервер с 10 IP-адресами, есть ли чистый способ случайным образом выбирать один из них в каждом исходящем запросе в качестве исходного IP-адреса?

Я пробовал Apache Mod Proxy, но, очевидно, даже если я автоматически изменю исходный IP-адрес скриптом, мне придется перезагружать Apache каждый раз, когда я это сделаю.

Есть ли какой-нибудь инструмент или чистые методы, которые могут справиться с этим?


Редактировать: Подробнее

На сервере размещено несколько клиентов,

Многие из них вызывают один и тот же API (используя cURL), у которого есть ограничение скорости 2 в секунду, поэтому обычно, когда один из клиентов отправляет 2 запроса, другие не могут их получить!

Я пытаюсь для ротации серверов «Исходящий IP-адрес (исходный IP-адрес)» случайным образом по каждому запросу (вопрос здесь) или назначить выделенный «ИСХОДЯЩИЙ» IP-адрес для каждого хоста (вопрос не здесь).

1
задан 30 January 2017 в 03:38
2 ответа

Вы можете использовать модуль statistic iptables с правилом SNAT следующим образом:

$ sudo iptables -t nat -A POSTROUTING -m statistic --mode random --probability 0.1 -j SNAT --to-source IP2
$ sudo iptables -t nat -A POSTROUTING -m statistic --mode random --probability 0.1 -j SNAT --to-source IP3
Other rules for remaining IPs ...

Вы можете выбрать random режим или n-й режим. 10 IP-адресов дают 0,1 вероятности для каждого отдельного IP-адреса. Нет необходимости добавлять правило для IP-адреса основного интерфейса (IP1), поскольку он используется по умолчанию.

Приведенные выше правила применяются ко всем типам трафика. При необходимости вы можете ограничить его конкретным протоколом / портом и т. Д.

4
ответ дан 3 December 2019 в 16:44

(Размещено как отдельный ответ, потому что слишком долго быть комментарием к ответу Халеда)

Хотя модуль статистики работает, математика здесь отключена. Первое правило соответствует p = 0,1 для любого данного пакета. Второе правило соответствует 10% оставшихся, поэтому оно дает общий результат p = 0,1 * 0,9 = 0,09 . Третье правило применяется к p = 0,1 * 0,9 * 0,9 = 0,081 и так далее. Для девяти правил существует только общая вероятность p = 0,651 , поэтому неявное DROP будет соответствовать одной трети всех пакетов. Вы можете попробовать сами:

$ for n in `seq 9`; do sudo iptables -A OUTPUT --dest 10.10.10.10 -m statistic --mode random --probability 0.1 -j ACCEPT; done
$ sudo iptables -A OUTPUT  --dest 10.10.10.10 -j ACCEPT
$ sudo ping -c 1000 -i 0.001 -W 0.002 10.10.10.10
$ sudo iptables-save -c | grep 10.10.10.10
[103:8652] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode random --probability 0.10000000009 -j DROP
[90:7560] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode random --probability 0.10000000009 -j DROP
[73:6132] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode random --probability 0.10000000009 -j DROP
[74:6216] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode random --probability 0.10000000009 -j DROP
[73:6132] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode random --probability 0.10000000009 -j DROP
[70:5880] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode random --probability 0.10000000009 -j DROP
[44:3696] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode random --probability 0.10000000009 -j DROP
[43:3612] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode random --probability 0.10000000009 -j DROP
[50:4200] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode random --probability 0.10000000009 -j DROP
[380:31920] -A OUTPUT -d 10.10.10.10/32 -j DROP

Вы можете видеть, что первое правило соответствует примерно 10% пакетов, и вероятность совпадения падает вниз, в то время как последнее DROP получает намного больше, чем оно должен. Вы можете изменить свои вероятности или, что проще, использовать не режим вероятность , а nth :

$ sudo iptables -F OUTPUT
$ for n in `seq 10 -1 2`; do sudo iptables -A OUTPUT --dest 10.10.10.10 -m statistic --mode nth --every $n --packet 0 -j DROP; done
$ sudo iptables -A OUTPUT  --dest 10.10.10.10 -j DROP
$ sudo ping -c 1000 -i 0.001 -W 0.002 10.10.10.10
[100:8400] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode nth --every 10 --packet 0 -j DROP
[100:8400] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode nth --every 9 --packet 0 -j DROP
[100:8400] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode nth --every 8 --packet 0 -j DROP
[100:8400] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode nth --every 7 --packet 0 -j DROP
[100:8400] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode nth --every 6 --packet 0 -j DROP
[100:8400] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode nth --every 5 --packet 0 -j DROP
[100:8400] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode nth --every 4 --packet 0 -j DROP
[100:8400] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode nth --every 3 --packet 0 -j DROP
[100:8400] -A OUTPUT -d 10.10.10.10/32 -m statistic --mode nth --every 2 --packet 0 -j DROP
[100:8400] -A OUTPUT -d 10.10.10.10/32 -j DROP
2
ответ дан 3 December 2019 в 16:44

Теги

Похожие вопросы