Если у нас есть сервер с 10 IP-адресами, есть ли чистый способ случайным образом выбирать один из них в каждом исходящем запросе в качестве исходного IP-адреса?
Я пробовал Apache Mod Proxy, но, очевидно, даже если я автоматически изменю исходный IP-адрес скриптом, мне придется перезагружать Apache каждый раз, когда я это сделаю.
Есть ли какой-нибудь инструмент или чистые методы, которые могут справиться с этим?
На сервере размещено несколько клиентов,
Многие из них вызывают один и тот же API (используя cURL), у которого есть ограничение скорости 2 в секунду, поэтому обычно, когда один из клиентов отправляет 2 запроса, другие не могут их получить!
Я пытаюсь для ротации серверов «Исходящий IP-адрес (исходный IP-адрес)» случайным образом по каждому запросу (вопрос здесь) или назначить выделенный «ИСХОДЯЩИЙ» IP-адрес для каждого хоста (вопрос не здесь).
Вы можете использовать модуль 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), поскольку он используется по умолчанию.
Приведенные выше правила применяются ко всем типам трафика. При необходимости вы можете ограничить его конкретным протоколом / портом и т. Д.
(Размещено как отдельный ответ, потому что слишком долго быть комментарием к ответу Халеда)
Хотя модуль статистики
работает, математика здесь отключена. Первое правило соответствует 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