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


8

Так что у меня есть спамер на моем сайте. Я мог заблокировать его IP, используя 'deny', но тогда он просто поменяет свой IP, и мне придется продолжать играть с ним в кошки-мышки.

Вместо этого мне любопытно, есть ли способ настроить nginx для более медленного ответа на его IP.

Таким образом, возможно, он просто решит, что сайт работает неправильно, и оставит меня в покое.

Спасибо

Ответы:


7

Директива 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-адресов, которые необходимо замедлить и / или заблокировать.


5

Если вы хотите, чтобы обидящий пользователь заставил вас думать, что он все еще остается незамеченным вами, вы можете использовать модуль ограничения запросов 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 адресов спамеров (что, возможно, является избыточным для нашего случая). Отрегулируйте соответственно, если необходимо.

Далее мы определяем директиву, которая фактически направит нарушителя через ограничитель, используя (зло, к сожалению), если case:

location / {
    if ($remote_addr = 1.2.3.4) {
        limit_req   zone=spammer  burst=5;
    }
}

Вы можете посмотреть плоды своего труда в журнале доступа сервера.

Обратите внимание, что этот хак плохо масштабируется, так как вам придется обновлять файл конфигурации каждый раз, когда нарушитель меняет IP (не говоря уже о включении большего количества IP-адресов, что означает больше случаев), но это работает.


1
Вы также можете объединить мой ответ с геоблоком Александра Азарова и сделать его более масштабируемым!
Panagiotis PJ Papadomitsos

2

Лучший способ справиться с этим спамером - правильно установить и настроить fail2ban. Fail2ban будет искать шаблоны в лог-файлах и блокировать все ips, которые спамят ваш сайт. Конечно, вы должны настроить его для поиска правильного шаблона.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.