Так что у меня на сайте есть спамер. Я мог бы заблокировать его IP-адрес, используя «запретить», но тогда он просто сменит свой IP-адрес, и мне придется продолжать играть с ним в кошки-мышки.
Вместо этого мне любопытно, есть ли способ настроить nginx для более медленного ответа на его IP-адрес.
Таким образом, возможно, он просто решит, что сайт работает некорректно, и оставит меня в покое.
Спасибо
Директива Nginx limit_rate
позволяет указать скорость, с которой вы хотите ограничить скорость ответов, например
location / {
if ($slow) {
limit_rate 4k;
}
}
Документация Nginx есть Вот. (из документации вы увидите, что ваш бэкэнд может принять решение и запросить Nginx для ограничения скорости клиента)
Как вы это получили $slow
набор переменных зависит от вашей конфигурации. Проще всего установить его через geo
отображение:
geo $slow {
default 0;
1.2.3.0/24 1;
}
«Географическое» отображение - это зависимость $slow
на основе IP-адреса клиента. По умолчанию 0 и 1, если IP-адрес клиента находится в 1.2.3.0/24
подсеть. См. Документацию Nginx по "geo" Вот
Использование «fail2ban» - разумное развитие всего этого решения. Вы можете использовать «fail2ban» для автоматического обнаружения необычной активности и сбора IP-адресов для Nginx, а затем перезагрузить Nginx, чтобы он перечитал списки IP-адресов, которые необходимо замедлить и / или заблокировать.
Если вы хотите обмануть обидчика, заставив его думать, что он все еще остается незамеченным вами, вы можете использовать модуль ограничения запросов nginx (http://wiki.nginx.org/HttpLimitReqModule).
Сначала определите зону ограничения запросов:
http {
limit_req_zone $binary_remote_addr zone=spammers:1m rate=30r/m;
}
Эта зона будет использовать IP-адрес злоумышленника, чтобы определять и ограничивать количество запросов до 30 в минуту (1/2 секунды). Обратите внимание, что размер памяти зоны установлен на 1 МиБ, что означает, что она может обрабатывать 1 МиБ / 64 байта на ведро запроса = 16384 адреса спамера (что, возможно, является излишним для нашего случая). При необходимости отрегулируйте соответственно.
Затем мы определяем директиву, которая фактически направит нарушителя через ограничитель, используя (к сожалению, зло) if case:
location / {
if ($remote_addr = 1.2.3.4) {
limit_req zone=spammer burst=5;
}
}
Вы можете наблюдать за плодами своего труда в журнале доступа к серверу.
Обратите внимание, что этот хак плохо масштабируется, так как вам придется обновлять файл конфигурации каждый раз, когда преступник меняет IP (не говоря уже о том, чтобы включить в него больше IP, что означает больше случаев), но он работает.
Лучший способ справиться с этим спамером - правильно установить и настроить fail2ban. Fail2ban будет искать шаблоны в файлах журналов и блокировать все IP-адреса, которые спамят ваш сайт. Конечно, вы должны настроить его для поиска правильного шаблона.