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

12

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

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

Спасибо


источник
Версия Apache?
pehrs
2.2 - Заполнение предела персонажа--

Ответы:

5

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

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

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

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

pehrs
источник
2
Спасибо за предложения. Я уже изучил bw_mod и mod_limitipconn, но ни один (насколько я могу судить) не делает то, что я хочу. mod_limitipconn просто ограничивает их одним соединением за раз, а bw_mod позволяет мне ограничивать скорость загрузки для каждого IP. Я хочу заблокировать их после определенного количества передачи / запросов данных. Я на самом деле пытаюсь защитить от определенных пользователей, которые чувствуют необходимость сканировать весь мой сайт и загружать все. Я посмотрю прокси-сервер Squid, звучит интересно. Если это не сработает, я думаю, что прибегну к модификации источника bw_mod.
Вы установили свой robots.txt, чтобы запретить пауков?
pehrs
1
Проблема с robots.txt в том, что (как и в RFC 3514) его уважают только хорошие роботы.
Скотт Пак
Это правда, но вы обнаружите, что большинство людей, использующих ваш сайт, используют стандартные инструменты. И многие из них, как и wget, уважают robots.txt. Robots.txt - это также правильный способ сообщить своим пользователям, что вы не хотите, чтобы они паука.
pehrs
1
Я попробовал это. Сначала было достаточно robots.txt, затем они приказали Wget игнорировать robots.txt, поэтому я прибег к блокированию «нераспознанных» пользовательских агентов, но затем они подделали пользовательский агент. Они, как правило, делают много запросов на заголовок, в то время как законные браузеры этого не делают, поэтому я могу рассмотреть ограничение запросов заголовков или их полное отключение (менее желательно).
5

Это мое решение 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 и отправьте пакет.

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

Густаво Фейхо
источник
3

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

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

Питер Баньялл
источник
тока, вы собираетесь реализовать это самостоятельно. Надеюсь, что это работает
Dark Star1
1

попробуй mod_dosevasiveилиmod_security

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

prophet.six
источник