Простая защита сервера от DDoS

DDoS (Distributed Denial of Service) — это атака, когда ваш сервер или сайт начинают заваливать огромным количеством запросов с множества устройств одновременно. Представьте, это как будто в вашу маленькую кофейню на 10 столиков одновременно пытаются зайти тысячи посетителей - у вас просто не хватит ресурсов, чтобы всех обслужить. При этом ваши «постоянные» клиенты даже не смогут подойти к двери!

Кстати, кратко о том, чем Dos отличается от DDoS:
DoS (Denial of Service, «Отказ в обслуживании») — это атака, при которой один злоумышленник или одна программа пытается перегрузить какой-то сервер, сайт или онлайн-сервис, чтобы сделать его недоступным для обычных пользователей.

DDoS (Distributed Denial of Service, «Распределённый отказ в обслуживании») — это более масштабная версия DoS. В этом случае атака идёт не от одного источника, а от множества устройств одновременно. Эти устройства часто заражены вредоносным ПО и управляются злоумышленником.

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

В результате такой атаки ресурс становится недоступным для пользователей, падает или значительно снизижает свою нормальную производительность.

Можно ли избежать ее или защититься от такого вида атаки? Ответ - да, можно.

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

Использование Nginx для предотвращения DDOS-атак

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

Установка лимитов на запросы и подключения

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

Ограничение скорости подключений

Модуль `limit_conn` позволяет ограничить количество соединений, устанавливаемых каждым IP в одно и то же время. Это очень эффективно для предотвращения атак с большим количеством недействительных соединений (например, SYN Flood).

http {
    # Определите область общей памяти для хранения IP-адреса и количества соединений
    limit_conn_zone $binary_remote_addr zone=conn_limit:10m;
    
    server {
        listen 80;
        server_name example.com;
        
        # Ограничьте максимальное количество соединений на один IP-адрес
        limit_conn conn_limit 10;

        location / {
            # Обычная обработка запросов
        }
    }
}

В приведенной выше конфигурации `limit_conn_zone` определяет зону общей памяти для хранения количества соединений IP-адреса, а `limit_conn` ограничивает каждый IP-адрес максимум 10 соединениями одновременно.

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

http {
    # Определите область общей памяти для хранения информации о скорости запроса
    limit_req_zone $binary_remote_addr zone=req_limit:10m rate=5r/s;
    
    server {
        listen 80;
        server_name example.com;
        
        # Ограничение до 5 запросов в секунду на один IP-адрес
        limit_req zone=req_limit burst=10 nodelay;

        location / {
            # Обычная обработка запросов
        }
    }
}

В этой конфигурации `limit_req_zone` определяет зону ограничения скорости запросов и устанавливает максимум 5 запросов в секунду для каждого IP-адреса. Если количество запросов превысит это значение, NGINX будет отбрасывать или задерживать слишком большое количество запросов.

Черный и белый списки

NGINX позволяет контролировать доступ на основе IP-адресов. С помощью модуля `ngx_http_access_module` можно легко заблокировать (черный список) или разрешить доступ (белый список) к определенным IP-адресам. Это очень эффективно для борьбы с небольшими DDoS-атаками или вредоносными запросами с определенных IP-адресов.

Конфигурация черного списка
server {
    listen 80;
    server_name example.com;
    
    # Блокирование доступа к IP-адресу
    deny 192.168.1.1;
    
    # Блокирование доступа к сегменту IP
    deny 192.168.1.0/24;

    location / {
        # Обычная обработка запросов
    }
}
Настройка белых списков

Если вы разрешаете доступ к службе только определенным IP-адресам, вы можете использовать директиву `allow` и сочетать ее с `deny all` для реализации механизма белых списков:

server {
    listen 80;
    server_name example.com;
    
    # Разрешить доступ к IP-адресу
    allow 192.168.1.1;
    
    # Запретить все остальные IP-адреса
    deny all;

    location / {
        # Обычная обработка запросов
    }
}

Настройка тайм-аута запроса

Разумная настройка таймаута запроса может предотвратить длительное занятие ресурсов сервера злоумышленниками и уменьшить количество DDoS-атак, таких как slowloris. Настроив параметры таймаута соединения и запроса в NGINX, можно быстро отключать недействительные соединения.

Настройка параметров тайм-аута

server {
    listen 80;
    server_name example.com;

    # Установка таймаута простоя клиентского соединения
    keepalive_timeout 10;

    # Установите максимальный размер тела запроса для предотвращения больших запросов
    client_max_body_size 1m;
    
    # Установка таймаута для чтения клиентских запросов
    client_body_timeout 10s;

    # Установка таймаута чтения заголовков клиента
    client_header_timeout 10s;

    location / {
        #  Обычная обработка запросов
    }
}

  • `keepalive_timeout`: Ограничивает максимальное время простоя соединения, чтобы не занимать ресурсы соединения сервера.
  • `client_max_body_size`: Ограничение размера тела запроса для предотвращения истощения ресурсов сервера слишком большими запросами.
  • `client_body_timeout` и `client_header_timeout`: Ограничивают время чтения содержимого запроса и заголовка для предотвращения медленных атак.

Оптимизация кэша и статических ресурсов

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

proxy_cache_path /data/nginx/cache levels=1:2 keys_zone=cache_zone:10m max_size=10g inactive=60m use_temp_path=off;

server {
    listen 80;
    server_name example.com;
    
    location / {
        proxy_cache cache_zone;
        proxy_cache_valid 200 302 10m;
        proxy_cache_valid 404 1m;
        proxy_pass http://backend;
    }
}

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

Использование очереди HTTP-запросов

С помощью модуля `ngx_http_limit_req_module` вы можете поместить входящие запросы в очередь. Если запрос превышает емкость очереди, возвращается ошибка, чтобы предотвратить перегрузку сервера большим количеством запросов.

http {
    limit_req_zone $binary_remote_addr zone=one:10m rate=1r/s;

    server {
        listen 80;
        server_name example.com;

        location / {
            limit_req zone=one burst=5 nodelay;
            proxy_pass http://backend;
        }
    }
}

Данная конфигурация позволяет выполнять не более 1 запроса в секунду. Если запрос превышает эту скорость, он будет помещен в очередь `burst`, и новые запросы будут отклонены, когда очередь будет заполнена.

Используйте модули безопасности сторонних производителей

NGINX поддерживает использование сторонних модулей для расширения возможностей защиты. Вот некоторые часто используемые модули и инструменты защиты от DDoS:

  • ModSecurity: Это брандмауэр веб-приложений (WAF) с открытым исходным кодом, который может обнаруживать и блокировать распространенные модели атак, включая SQL-инъекции, XSS и т. д., а также обладает определенным эффектом защиты от DDoS-атак.
  • NAXSI: Модуль брандмауэра, разработанный специально для NGINX для защиты веб-приложений от различных атак. Он отличается легкостью и высокой производительностью.

Комбинирование брандмауэров с внешними инструментами

Несмотря на то, что NGINX может смягчить некоторые DDoS-атаки, для более эффективной защиты обычно требуется сочетание других инструментов и механизмов безопасности:

  • iptables:  С помощью конфигурации Linux’ `iptables` некоторые атаки могут быть заблокированы непосредственно на сетевом уровне.
  • Cloudflare или другая CDN:  Использование сети доставки контента (CDN), например Cloudflare, может обеспечить дополнительную защиту от DDoS. Брандмауэр веб-приложений и услуги по очистке трафика, предоставляемые Cloudflare, могут эффективно противостоять крупномасштабным DDoS-атакам.
  • Fail2ban: Объедините журналы NGINX для автоматической блокировки вредоносных IP-адресов с помощью `fail2ban`.

Динамическая балансировка нагрузки и эластичное масштабирование

Сочетание NGINX с такими платформами, как Kubernetes, позволяет реагировать на масштабные DDoS-атаки за счет эластичного масштабирования. Например, с помощью функции эластичного масштабирования Kubernetes при пике трафика автоматически увеличивается количество экземпляров NGINX, чтобы разделить трафик, а при снижении трафика ресурсы автоматически сокращаются.

Резюме

В статье мы кратко объяснили, что такое DDoS, как защититься от атак при помощи нехитрых настроек NGinx.
Напомним, что надежный хостинг-провайдер предоставляет шаред хостинг с ддос защитой. Но когда вы используете услугу виртуального сервера, рекомендуем самостоятельно выполнять тонкую настройку сервера, чтобы возможность кибератаки на сайт была минимизирована.

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

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