Настройка Fail2Ban и Nginx для защиты от DOS атак

Если Вы управляете сервером на котором находится ваш сайт, рано или поздно Вы можете столкнуться с неприятностью в виде DOS (Denial of Service) атаки.

В данной статье будет описана быстрая настройка программы Fail2Ban и Nginx для препятствования DOS атаке. Более подобное описание установка и настройки данной утилиты Fail2Ban можно найти тут.


Установка Fail2Ban

Для Debian/Ubuntu:

Для CentOS:

Настройка Nginx

Сперва, нам нужно настроить Nginx для ограничения количества запросов c одного IP-адреса. В этом нам поможет модуль Nginx’s Limit Req Module. Данный модуль будет ограничивать максимальное количество запросов с одного IP и записывать информацию о запрещенном IP в журнал ошибок. Fail2ban будет анализировать журнал ошибок Nginx и блокировать IP-адреса превысившие лимит запросов.

В http{..} блок файла /etc/nginx/nginx.conf (для всех сайтов на сервере) или http{..} блок (за пределами блока server {…}) vhost файла конфигурации сайта добавим строку:

где:

  • $binary_remote_addr — переменная Nginx содержащая IP с которого пришёл запрос;
  • one — имя зоны. Если настройка делается в нескольких vhost файлах, имена должны быть разные;
  • 10m — размер зоны. 1m может содержать 16000 состояний, что, вероятно, означает 16000 уникальных IP-адресов;
  • 1r/s — означает, что разрешено 1 запрос в секунду. Так же можно указать количество запросов в минуту (30r/m — 30 запросов в минуту). Эффективно 1 запрос за 2 секунды.

Теперь добавим строку в конфиг сайта, блока server{..}:

где:

  • one — имя настроенной выше зоны;
  • burst — максимальный всплеск активности, можно регулировать до какого значения запросов в секунду может быть всплеск запросов;
  • nodelay — незамедлительно, при достижении лимита подключений, выдавать код 503 (Service Unavailable) для этого IP.

Пример конфига для запросов к .php файлам сайта:

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

Настройка Fail2Ban

Создадим файл фильтра /etc/fail2ban/filter.d/nginx-req-limit.conf со следующим содержанием:

Далее создаём файл /etc/fail2ban/jail.local или, если уже настраивали Fail2Ban, добавляем в него:


Самое важное на данном этапе указать maxretry, т.е. количество записей в логе об ошибке для одного IP, после достижения которого IP отправляется в бан. И конечно bantime — время в секундах, в течении которого IP будет заблокирован.

Подробнее о фильтрах здесь.

Перезагружаем Fail2Ban:

Ну или перечитываем файлы конфигурации:

Подробнее об управлении Fail2Ban можно прочитать здесь.

Почему не достаточно только Nginx’s Limit Req Module

Хоть использование Nginx’s Limit Req Module в случае DOS сможет снизить нагрузку на сервер, однако веб серверу Nginx требуется больше ресурсов для обработки запросов чем нужно iptables или любому штатному фаерволу. Таки образом мы разгружаем веб сервер, чтобы он лучше выполнял свою функцию по обработке запросов пользователей, а работу по блокировке нежелательных соединений отдаём во власть фаервола.


Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *