Правильный способ автоматической блокировки 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
).