Назад | Перейти на главную страницу

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

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

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

Спасибо

Это мое решение 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-адреса после определенного числа или запросов страницы к сайту в указанные временные рамки.