Защита от DDOS с помощью Nginx

Веб-проекты очень часто сталкиваются с DDOS атаками. Сегодня мы рассмотрим один из базовых способ защиты от HTTP-Flood.

Введение:

Недавно на один из проектов моего знакомого произошла атака, скорее всего, атаковал неопытный хакер, так как атака велась с одного ip адреса.

В ходе анализа логов было установлено, что злоумышленник пытается загрузить много раз главную страницу, а сервер старается обработать эти запросы и не может.

Для защиты от атак подобного рода мы будем использовать прокси сервер nginx и стандартный модуль  ngx_http_limit_conn_module

Модуль ngx_http_limit_conn_module позволяет ограничить число соединений по заданному ключу, в частности, число соединений с одного IP-адреса.

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

Иначе говоря, мы можем поставить ограничение на количество запросов и подключений с одного ip адреса. Этого хватит для защиты от слабых и средних HTTP-Flood атак.

Для установки ограничения мы будем использовать директиву limit_conn

Настройка nginx для защиты от DDoS:

limit_conn:

limit_conn задаёт максимально допустимое число соединений с одного ip. При превышении этого числа в ответ на запрос сервер вернёт ошибку 503 (Service Temporarily Unavailable).

После получения ошибки 503, атакующий перестанет создавать полезную-нагрузку на сервер базы данных, например MySQL, тем самым разгрузив его.

Но перед тем как использовать limit_conn для защиты от DDOS атак с помощью nginx, мы должны разобраться и установить директиву limit_conn_zone

limit_conn_zone:

Синтаксис: limit_conn_zone ключ zone=название:размер;
Задаёт параметры зоны разделяемой памяти, которая хранит состояние для разных значений ключа. Состояние в частности содержит текущее число соединений. В качестве ключа можно использовать текст, переменные и их комбинации. Запросы с пустым значением ключа не учитываются.
Пример использования:

Эта директива нужна, чтобы хранить состояние для каждого ip адреса. Это важно! Данная директива должна идти в nginx.conf сразу после http {.

Пример конфигурации nginx.conf для limit_conn_zone:

После установки директивы limit_conn_zone мы перейдём к установке limit_conn

Синтаксис: limit_conn зона число;

Обратите внимание, что зону необходимо брать из зоны, установленной в limit_conn_zone, в нашем случае addr.

3-й параметр «число» обозначает число одновременно открытых соединений с одного ip адреса.

Для того, чтобы ограничить 3-мя одновременными подключениями для зоны addr, необходимо написать следующие:

limit_conn addr 3;

Пример конфигурации для защиты от DDoS атак с помощью nginx и limit_conn:

Этого будет достаточно, чтобы защититься от простой DDOS атаки.

Ошибки, которые могут возникнуть во время настройки:

«limit_conn_zone» directive is not allowed:

Данная ошибка возникает, когда директива limit_conn_zone установлена после дочерних элементов http в nginx.conf

Иными словами, данная директива должна находиться сразу после «http {«, см пример конфигурации.

Для связи со мной можно воспользоваться контактами.

 

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

Ваш e-mail не будет опубликован.