Тариф успешно добавлен в корзину
В корзину
url image

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

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

Обычно для защиты от DDos-атак используются сторонние средства. Это могут быть как программные средства, так и аппаратные. Например, Firewall, WAF (Web Application Firewall), прокси-серверы и т. д. Однако обеспечить минимальный набор защиты можно при помощи веб-сервера. В данной статье мы рассмотрим настройку веб-сервера Nginx с целью снижения угрозы DDos-атак на сервер.

Описание DDoS-атак

DDoS (Distributed Denial of Service — распределенный отказ в обслуживании) — это сетевая атака с целью создания нагрузки и последующей недоступности сервера. Главное отличие DDos от DoS-атак — это наличие более, чем одного устройства (группы устройств), с которых осуществляется атака, в то время как Dos-атака исходит от одного устройства.

DDoS-атаки подразделяются на 2 группы:

  • Атаки на уровне инфраструктуры.
    Основная цель такой атаки — перегрузить пропускную способность сети. Сюда относятся такие атаки, как SYN-ACK-флуд и UDP-флуд;
  • Атаки на уровне приложения.
    Основная цель такой атаки — сделать недоступным одно или более приложение. К этой группе относится, например, HTTP-флуд.

Nginx — это бесплатный веб-сервер, прокси-сервер, а также почтовый прокси-сервер с открытым исходным кодом. В функционале Nginx присутствуют параметры, которые помогают уменьшить урон от DDoS-атак. Заранее стоит выделить важный момент — хоть Nginx и помогает фильтровать начальные DDoS-атаки, на работу его фильтрации требуется достаточное количество ресурсов сервера. Поэтому такой метод на слабых машинах или машинах без запаса мощности может быть идентичен принятию запросов от DDoS-атак.

Далее мы перейдем к описанию необходимых директив и настроек в Nginx. Также этот механизм присутствует в интерфейсе панели ISPmanager — можно выставить необходимые настройки в параметрах сайта.

Ограничение по числу соединений

Одним из базовых способов по минимизации последствий от DDoS-атак является выставление ограничений на максимальное количество соединений, которые могут выполняться с одного IP-адреса. За данный функционал в Nginx отвечает модуль ngx_http_limit_conn_module, используя директиву limit_conn и параметр conn_limit_per_ip. Например, следующая конфигурация ограничивает количество соединений до 15 на каждый уникальный IP-адрес:

limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
server {
    ...
    limit_conn conn_limit_per_ip 15;
}

 

Это означает что, например, с IP-адреса 192.168.136.25 максимальное количество одновременных подключений составит 15. Если клиент попытается открыть 16 одновременных соединений, то в ответ сервер вернет ошибку 503 «Service Unavailable». Обратите внимание на том, что при использовании протоколов HTTP/2 и HTTP/3 каждый параллельный запрос считается отдельным соединением. 

Ознакомиться более подробно с модулем ngx_http_limit_conn_module можно по ссылке.

Ограничение частоты запросов

Для ограничения частоты запросов в Nginx используется директива limit_req. Она ограничивает частоту запросов заданным количеством запросов в секунду (или минуту) для определенного значения, под которым обычно подразумевается IP-адрес клиента.

Ниже приведен пример конфигурации, которая ограничивает частоту запросов до 10 в секунду (rate=10r/s ) на один IP-адрес:

/etc/nginx/nginx.conf
http {
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=10r/s;
/etc/nginx/default.conf
server {
    limit_req zone=req_limit_per_ip burst=5 nodelay;
}

Где:

rate=10r/s — параметр, который устанавливает ограничение на количество запросов за определенный отрезок времени. Другими словами, rate задает максимальное количество запросов. В примере выставлено десять запросов в секунду. Поддерживаются секунды (s) и минуты (m);

burst=5 — параметр, отвечающий за максимально разрешенный всплеск запросов. Например, если за 1 секунду с IP-адреса пришло 5 запросов, то в следующую секунду не будет обработано ни одного запроса, пока не вернется число запросов в секунду в нормальный лимит. Параметр burst отвечает именно за количество запросов, а не за их скорость.

nodelay — параметр, отвечающий за то, что запросы, которые превысили разрешенный лимит, будут отклонены.

Выставление лимитов на ограничение частоты запросов должно быть настроено предельно точно, чтобы найти максимально правильный порог. Следует начать с выставления небольшого количества запросов в секунду, например, с диапазона в 30-50 IP-адресов, а затем постепенно увеличивая или уменьшая частоту запросов, пока не будет найден оптимальный порог. Также стоит учесть что некоторые cms генерируют около 10-20 запросов с нескольких нажатий по формам сайта вполне легитимного пользователя и такой низкий порог может привести к ограничению функциональности сайта.

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

Использование тайм-аутов в режиме обратного прокси (reverse proxy)

При применении Nginx в качестве обратного прокси можно использовать тайм-ауты, в течение которых клиент должен получить ответ от сервера. Использование механизма тайм-аутов поможет предотвратить излишнее потребление ресурсов сервера медленными соединениями. По умолчанию тайм-аут запроса в NGINX равен 60 секундам.

Для настройки тайм-аута используются такие параметры, как proxy_connect_timeoutproxy_send_timeout и proxy_read_timeout. Рассмотрим следующую конфигурацию, в которой параметры тайм-аута устанавливаются на уровне 15 секунд:

server {
    ...
    proxy_connect_timeout 15s;
    proxy_send_timeout 15s;
    proxy_read_timeout 15s;
}

Где:

  • proxy_connect_timeout — параметр, который задает тайм-аут для установки соединения с прокси-сервером;

  • proxy_send_timeout — параметр, который задаёт тайм-аут во время передачи запроса к проксируемому серверу. Если по истечении установленного времени прокси-сервер не примет данные, то соединение будет закрыто;

  • proxy_read_timeout — параметр, который задаёт тайм-аут при обработке (чтении) ответа полученного от прокси-сервера. Если по истечении установленного времени прокси-сервер не примет данные, то соединение будет закрыто.

Выбирать подходящие значения для тайм-аута необходимо с осторожностью. Любые низкие значения таймаута не будут работать, если на сайте используются различные «долгие» формы, такие как выгрузка данных, синхронизация с другой базой данных. Как правило, такие процедуры обычно требуют свыше 100 с. Если установленные значения слишком короткие по времени, то обычные подключения могут быть преждевременно прерваны. 

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

Блокировка и разрешение IP-адресов

В Nginx присутствует встроенный функционал по блокировке IP-адресов, то есть можно выбрать, каким IP-адресам разрешен или запрещен доступ к веб-серверу. Для блокировки и разрешения необходимых IP-адресов используются 2 директивы — deny и allow. deny запрещает доступ к серверу, в то время как allow — разрешает. Рассмотрим на конкретном примере ниже:

server {
    location / {
        deny 192.168.32.0/24;
        allow 192.168.35.0/24;
    }
}

Конфигурация выше блокирует доступ ко всему веб-ресурсу (сайту) сразу — для этого используется символ косой черты (слеш). В данном примере доступ будет запрещен всем IP-адресам, которые находятся в подсети 192.168.32.0/24. В свою очередь, доступ будет разрешен всем IP-адресам, которые находятся в подсети с диапазоном 192.168.35.0/24.

Также можно разрешить доступ только одному IP-адресу и запретить доступ всем остальным:

location / {
   allow 192.168.32.136;
   deny all;
 }

Если клиент попытается отправить запрос к веб-серверу, IP-адрес которого предварительно заблокирован, то в ответ будет возвращена ошибка 403 Forbidden.

Функционал по блокировке IP-адресов необходимо использовать с осторожностью, поскольку блокирование доступа к определенным диапазонам IP-адресов может повлиять на обычных пользователей. Так же, как и при определении значений для тайм-аута, необходимо полагаться на лог-файлы и файлы журналов для поиска IP-адресов, с которых идет подозрительная активность с дальнейшей их блокировкой. Блокировка по IP-адресу может быть полезна, если DDoS-атака осуществляется с определенного диапазона IP-адресов.

Блокировка доступа к файлу или URL

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

Для реализации данного метода можно использовать директиву location. Например, следующая конфигурация блокирует доступ к файлу с именем logs.txt для абсолютно всех IP-адресов:

server {
    ...
    location /logs.txt {
        deny all;
    }
}

Для того чтобы заблокировать доступ к определенному URL на сайте, используется то же действие deny all и в директиве location задается необходимый URL. В примере ниже заблокирован доступ к URL wp-admin, на котором, как правило, находится панель администратора CMS WordPress:

server {
    ...
    location /wp-admin {
        deny all;
    }
}

Одним из способов защиты от DDoS-атак является блокировка доступа к файлам и URL, которые не являются необходимыми для функционирования веб-сайта. К ним относятся файлы резервных копий, файлы конфигурации, git-файлы, директории с исходным кодом, а также URL, на которых находятся интерфейсы панелей администратора, баз данных, мониторинга. К ним можно отнести и  прочие файлы и URL, которые могут стать потенциальными объектами для атаки и несанкционированного доступа.

Как и при использовании других методов защиты, нужно  четко понимать, что вы не блокируете доступ к критически важным файлам/URL, включая такие ресурсы, как маркетинговые страницы и статические файлы, которые необходимы для функционирования веб-сайта, поскольку это может вызвать проблемы у обычных пользователей.

Данный метод поможет защитить от DDoS-атак, которые нацелены на определенный файл или ресурс на сервере.

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

Этот материал был полезен?

Скидка 25% новым клиентам!
Закажи сервер сегодня и получи скидку на первый месяц аренды!
Фаина-236 Ваш виртуальный бортовой помощник
Маршрут «Земля-Марс» построен. Готовы к старту? Участвуйте в акции и получайте призы!