Один из моих серверов LAMP недавно был сбит каким-то скриптовым ботом, который искал эксплойты. Судя по всему, он делал так много запросов в секунду, что перегрузил ОЗУ на сервере и на час отключил весь мой сайт. Вся эта «атака» исходила с одного IP-адреса.
Итак, как я могу автоматически и временно заблокировать IP-адрес, который делает слишком много обращений к моему серверу LAMP за короткий период времени? Какой инструмент лучше всего подходит для работы и следует ли мне решать эту проблему на уровне операционной системы или через PHP?
Fail2Ban. Золотой стандарт / решение по умолчанию для этой проблемы на платформе Linux.
Вам следует избегать попыток сделать это с помощью PHP. К тому времени, когда вмешивается PHP, уже слишком поздно - память уже выделена.
Вы можете запретить IP-адреса на любом уровне, но самый низкий уровень, который использует наименьшее количество ресурсов, - это маршрут, который вы хотите выбрать. Обычно это межсетевой экран. По крайней мере, iptables (брандмауэр Linux) - это то, что вы хотите использовать. Есть инструменты, о которых упоминали другие, такие как Fail2Ban, которые могут автоматизировать это за вас. Внешний брандмауэр был бы лучше.
Помимо попытки запретить оскорбительные IP-адреса, вы должны попытаться лучше использовать свои ресурсы. Если запрос требует меньше ресурсов, атака будет эффективнее.
Apache также использует много памяти. Если вы используете mod_php, это еще хуже, потому что PHP загружается внутри каждого дочернего процесса Apache. Это означает, что даже запросы к статическому содержимому (css / js / images) загружают PHP, даже если PHP не используется. Вы можете решить эту проблему, используя вместо этого FastCGI. mod_fcgid - хороший вариант.
Существуют также другие веб-серверы, которые более ресурсоэффективны. Nginx - мой любимый. Также есть Lighttpd. Многим людям нравится Litespeed (замена Apache).
Если вы хотите придерживаться Apache, подумайте о том, чтобы настроить его как можно лучше. Рассмотрите возможность отключения .htaccess. Вот хорошее объяснение, почему.
iptables -I INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --set
iptables -I INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP
Ossec может делать такие вещи автоматически и прозрачно на основе системных журналов.
Чтобы контролировать или блокировать http-трафик, вы можете использовать:
Однако имейте в виду, что этот инструмент также может блокировать / замедлять работу веб-пауков и, следовательно, влиять на SEO.
NoooBS,
iptables -N logdrop iptables -A logdrop -m latest --set --name blacklist
iptables -A logdrop -j DROP
iptables -N ddos iptables -A ddos -m latest --rcheck --name blacklist --seconds 300 --hitcount 1 -j logdrop iptables -A ddos -m latest --set --name again iptables -A ddos -m latest --update --name again --seconds 60 --hitcount 2 -j logdrop iptables -A ddos -j RETURN