Как автоматически и временно заблокировать IP-адрес, делая слишком много обращений к серверу за короткий промежуток времени?

21

Один из моих серверов LAMP был недавно сбит каким-то скриптовым ботом, ищущим эксплойты. Судя по всему, он делал так много запросов в секунду, что перегружал ОЗУ на сервере и на целый час отключил весь мой сайт. Все эти "аттаки" пришли с одного IP-адреса.

Итак, как я могу автоматически и временно заблокировать IP-адрес, делая слишком много обращений к моему LAMP-серверу за короткий промежуток времени? Какой инструмент лучше всего подходит для этой работы, и должен ли я решать это на уровне операционной системы или через PHP?

ProgrammerGirl
источник

Ответы:

25

Fail2Ban . Золотой стандарт / стандартное решение этой проблемы на платформе Linux.

HopelessN00b
источник
Интересно, спасибо. Как это влияет на веб-сканеры, такие как Google?
ProgrammerGirl
1
@Programmer Зависит от того, как вы это настроите, но вы не ожидаете, что веб-сканер будет вводить неверные пароли, искать эксплойты или набирать достаточно хитов, чтобы вызвать четко определенный порог - поэтому просто проверьте свои журналы, чтобы выяснить что определить ваши пороги в.
HopelessN00b
5

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

Вы можете запретить IP-адреса на любом уровне, но самый низкий уровень, который использует наименьшее количество ресурсов, - это маршрут, который вы хотите выбрать. Обычно это брандмауэр. По крайней мере, iptables (linux firewall) - это то, что вы хотите использовать. Есть инструменты, которые упоминали другие, такие как Fail2Ban, которые могут автоматизировать это для вас. Внешний брандмауэр был бы лучше.

Помимо попыток запретить несанкционированные IP-адреса, вы должны попытаться более эффективно использовать свои ресурсы. Если запрос занимает меньше ресурсов, атака будет эффективнее.

Apache также использует много памяти. Если вы используете mod_php, это еще хуже, потому что PHP загружается внутри каждого дочернего процесса Apache. Это означает, что даже запросы к статическому контенту (css / js / images) загружают PHP, даже если PHP не используется. Вы можете решить эту проблему, используя вместо этого FastCGI. mod_fcgid - хороший вариант.

Есть и другие веб-серверы, которые более эффективны с точки зрения ресурсов. Nginx мой любимый. Там также Lighttpd. Многим нравится Litespeed (замена на Apache).

Если вы хотите придерживаться Apache, подумайте над тем, чтобы настроить его как можно лучше. Рассмотрите возможность отключения .htaccess. Вот хорошее объяснение, почему .

Люк
источник
2

Чтобы контролировать или блокировать трафик http, вы можете использовать:

Однако следует помнить, что эти инструменты могут также блокировать / замедлять работу веб-пауков и, следовательно, влиять на SEO.

Сообщество
источник
2
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 может делать такие вещи автоматически и прозрачно на основе системных журналов.

gmck
источник
1
Можете ли вы объяснить, что именно делает первая строка кода? Кроме того, как ossec по сравнению с fail2ban? Спасибо.
ProgrammerGirl
2
Это правило iptables. Я считаю, что он подсчитывает, сколько новых попыток подключения было сделано, и отбрасывает их после того, как они превысили 4 попытки в течение 60 секунд. Я призываю вас посмотреть man iptablesи понять, что означает каждый флаг и как они работают вместе.
Люк
-3

NoooBS,

--- наводнение ---

iptables -N logdrop iptables -A logdrop -m последние --set --name черный список

iptables -A logdrop -m limit --limit 1 / s --limit-burst 1 -j LOG --log-prefix "Flood:"

iptables -A logdrop -j DROP

iptables -N ddos ​​iptables -A ddos ​​-m недавний --rcheck - черный список имен - секунд 300 --hitcount 1 -j logdrop iptables -A ddos ​​-m недавний --set - name снова iptables -A ddos ​​-m недавний --update - снова имя --seconds 60 --hitcount 2 -j logdrop iptables -A ddos ​​-j ВОЗВРАТИТЬ

Игорь Горда
источник