Правильный способ автоматической блокировки IP-адресов

Эта проблема:

Я управляю веб-сайтом с множеством динамически генерируемых страниц. Каждый день боты из Google, Yahoo и других поисковых систем загружают более 100 тысяч страниц. И иногда у меня возникают проблемы с "хакерами", пытающимися массово загрузить весь сайт.

Я хотел бы заблокировать IP-адреса "хакеров", сохраняя при этом поисковые роботы, сканирующие страницы. Каков наилучший способ сделать это?

Замечания:
Сейчас я решаю проблему следующим образом. Я сохраняю IP каждого запроса страницы в файл каждые X секунд. И у меня есть скрипт crontab, который подсчитывает повторяющиеся ip каждые 30 минут. Для ip, которые повторяются слишком много раз, скрипт проверяет имя хоста - если он не принадлежит Google/Yahoo/Bing/ и т.д., у нас есть кандидатура на бан. Но мне не очень нравится мое решение, и я думаю, что автоматический бан можно было бы сделать лучше, или использовать некоторые из готовых решений.

3 ответа

Вы не указали свою ОС, поэтому я с радостью сообщу вам версию OpenBSD: pf.confпоместите что-то вроде следующего в ваш набор правил (не более 100 conns за 10 секунд):

таблица  сохраняется
быстро заблокировать от передать $ext_if proto tcp в порт $webserver www keep state \
                 (max-src-conn-rate 100/10, перегрузка  глобальная очистка)

Вы можете добавить белый список и задание cron, выбрасывая адреса из bad_hosts через день или два.

Я бы подумал, что fail2ban - это ответ.

Вы можете использовать белый список, чтобы запретить поисковым системам.

Посмотрите на Простой коррелятор событий. Он может автоматически запускать команды (т.е. добавлять блок в iptables) после того, как определенное количество строк, соответствующих регулярному выражению, было замечено в течение времени. Он также может определять "контекст", срок действия которого истекает. Когда контекст истекает, вы можете разблокировать IP-адрес (например, удалить из iptables).

Другие вопросы по тегам