Apache: ограничить количество запросов / трафика на IP?

Я хотел бы разрешить использовать только один IP-адрес, скажем, до 1 ГБ трафика в день, и если этот предел превышен, все запросы с этого IP-адреса отбрасываются до следующего дня. Однако было бы достаточно более простого решения, при котором соединение прерывается после определенного количества запросов.

Уже есть какой-то модуль, который может это сделать? Или, может быть, я могу добиться этого с помощью чего-то вроде iptables?

Спасибо

4 ответа

Это мое решение iptables для такого рода проблем. регулировать --seconds--hitcount по мере необходимости, также таблица iptables.

iptables -A FORWARD -m state --state NEW -m recent --rcheck --seconds 600 --hitcount 5 --name ATACK --rsource -j REJECT --reject-with icmp-port-unreachable
iptables -A FORWARD -d 192.168.0.113/32 -o eth1 -p tcp -m tcp --dport 80 -m recent --set --name ATACK --rsource -j ACCEPT

Разъяснение:

  1. iptables проверьте, указан ли исходный IP-адрес в файле /proc/net/ipt_recent/ATACK 5 или более раз с интервалом 600 секунд, и является ли это НОВЫМ запросом. Если это так, сделайте отказ; еще

  2. iptables проверьте, направлен ли запрос на порт 80. Если это так, выведите IP и временную метку в /proc/net/ipt_recent/ATACK и отправьте пакет.

Он отлично работает для моих нужд.

Если вам нужно чистое решение Apache, то bw_mod для Apache 2.0 и mod_bandwidth для Apache 1.3. Они могут ограничить пропускную способность вашего сервера, чтобы ограничить использование пропускной способности.

Существует также mod_limitipconn, который не позволяет одному пользователю устанавливать множество соединений с вашим сервером. mod_cband - это еще один вариант, но я никогда не использовал его.

Если вы не хотите возиться с установкой Apache, вы можете установить прокси-сервер squid перед Apache. Это дает вам больший контроль над регулированием.

Тем не менее, в большинстве случаев проблема заключается в нескольких крупных объектах, когда вы хотите ограничить пропускную способность для каждого IP-адреса, и вы хотите дать нормальное сообщение об ошибке, когда пользователь извлекает слишком много данных, и вы блокируете его. В этом случае может быть проще написать сценарий PHP и сохранить информацию о доступе во временной таблице в базе данных.

Вы смотрели на инструмент, как fail2ban? Если это может быть немного тяжелым для вас, но это позволит вам ограничить количество запросов, разрешенных для любого данного IP. Он работает, просматривая журналы, и вы устанавливаете правила, сколько нарушений допускается за раз, так что для вас это могут быть запросы в день. Как только они переходят, он может блокировать их, используя ipchains.

Я использовал его, чтобы очень успешно блокировать DDoS-атаки на почтовый сервер. Хотя он может потреблять значительное количество мощности процессора.

Пытаться mod_dosevasive или же mod_security

mod_dosevasive может быть настроен на запрет IP после указанного числа или запросов страниц к сайту в указанный период времени.

Другие вопросы по тегам