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


21

Один з моїх серверів LAMP нещодавно був збитий якимось ботом скриптів, який шукав подвиги. З огляду на це він робив стільки запитів в секунду, що це перевантажило оперативну пам’ять на сервері і збило весь мій сайт на годину. Цей "attachcK" прийшов з однієї IP-адреси.

Тож як я можу автоматично і тимчасово блокувати IP-адресу, створюючи занадто багато звернень на моєму сервері LAMP за короткий проміжок часу? Який найкращий інструмент для роботи, і чи потрібно це вирішувати на рівні Операційної системи або через PHP?

Відповіді:


25

Fail2Ban . Золотий стандарт / рішення за замовчуванням цієї проблеми на платформі Linux.


Цікаво, дякую. Як це стосується чи впливає на веб-сканери, такі як Google?
ПрограмістGirl

1
@Programmer Залежить від того, як ви налаштуєте річ, але ви не очікуєте, що веб-сканер вводить неправильні паролі, шукає подвиги або набирає достатньо звернень, щоб викликати чітко визначений поріг - тому просто перевірте свої журнали, щоб з’ясувати на чому визначити ваші пороги.
HopelessN00b

5

Вам слід уникати спроб зробити це за допомогою 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. Ось хороше пояснення, чому .


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


1
Чи можете ви поясніть, що саме робить перший рядок коду? Крім того, як ossec порівнюється з fail2ban? Спасибі.
ПрограмістGirl

2
Це правило iptables. Я вважаю, що підраховує, скільки нових спроб підключення зроблено, і скасовує їх після перевищення 4 спроб протягом 60 секунд. Я закликаю вас подивитися man iptablesі подивитися, що означає кожен прапор і як вони працюють разом.
Лука

-3

NoooBS,

--- повінь ---

iptables -N logdrop iptables -A logdrop -m нещодавно --set --name чорний список

iptables -A logdrop -m межа --limit 1 / s --limit-burst 1 -j LOG --log-префікс "Flood:"

iptables -A logdrop -j DROP

iptables -N ddos ​​iptables -A ddos ​​-m нещодавно --rcheck - ім'я чорного списку --секунди 300 --рахунок 1 -j logdrop iptables -A ddos ​​-m нещодавно --set --name знову iptables -A ddos ​​-m нещодавно --оновлення - ім'я знову --секунди 60 --рахунок 2 -j логпп iptables -A ddos ​​-j ПОВЕРНЕННЯ

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.