Назад | Перейти на главную страницу

Заставить сервер Nginx реагировать медленно

Так что у меня на сайте есть спамер. Я мог бы заблокировать его 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-адреса, которые спамят ваш сайт. Конечно, вы должны настроить его для поиска правильного шаблона.