Защита от ддос на NGINX

Тема в разделе "Защита от Ddos-атак", создана пользователем admin, 26 сен 2015.

  1. Если вас регулярно ддосят, а ресурсы вашего сервера не велики - забудьте про Apache. Или используйте Nginx как проксирующий сервер к Апачу.
    Для Nginx существует большое количество модулей, в том числе встроенных в сборку, позволяющих настроить эффективную защиту от ддос и хакерских атак. О некоторые мы уже писали: Nginx и Lua, Nginx и GeoIP. В этой теме попробуем обобщить все известные способы защиты от ддос с помощью Nginx.

    Ограничение нагрузки на сайт с помощью настроек limit_conn и limit_req.

    В стандартной сборке nginx есть модуль ngx_http_limit_conn_module (limit_conn) для ограничения числа одновременных соединений и ngx_http_limit_req_module (limit_req) для ограничения числа запросов за единицу времени. Можно настроить разные лимиты на разные разделы сайта, например, на скрипты (PHP) и директории с файлами установить более жесткие правила, чем на статику.

    limit_conn
    В секции http задается зона разделяемой памяти limit_conn_zone:
    Код:
    limit_conn_zone $binary_remote_addr zone=addr:10m;.
    Далее уже в server или location описывается число допустимых одновременных соединений c одного ip-адреса:
    помощью limit_conn:
    Код:
    location /download/ { # папка с файлами
    limit_conn addr 1; # разрешаем не более одного соедниения с одного IP-адреса
    }
    
    Можно задавать несколько настроек limit_conn в одном конфиге.
    Код:
    limit_conn_zone $binary_remote_addr zone=perip:10m;
    limit_conn_zone $server_name zone=perserver:10m;
    
    server {
        ...
        limit_conn perip 10; // задаем ограничение для IP
        limit_conn perserver 100; // задаем ограничения для всего виртуалхоста
    }
    limit_req
    Задаем в секции http зону разделяемой памяти и максимальное количество запросов в секунду.
    Код:
     limit_req_zone $binary_remote_addr zone=one:10m rate=2r/s; #ограничение 2 запроса в секунду 
    Задаем ограничение для определенных разделов и скриптов на сайте:
    Код:
    server {
    
    ...
    # ограничение для раздела поиска
    location /search/ {
    limit_req zone=one burst=5; # burst указывает на максимальное превышение лимита, так если в 1 секунду пришло с адреса 5 запросов, то в следующую секунду  запрос не обработается, если всплесков не предусмотрено то устанавливается параметр nodelay вместо burst=5
    }
    
     
    Последнее редактирование: 26 сен 2015
    26 сен 2015
  2. Еще примеры.

    Ограничение частоты запросов до 30 в минуту к странице login.html.
    Код:
    limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m; 
    server {    
          ...     
          location /login.html
           {        
               limit_req zone=one;     
               ...    
           } 
     }
    
    Важно учесть, что запросы - это не только открытие самой страници, но и подгрузка всех картинок и скриптов на этой странице. Сам Google в целях поисковой оптимизации советует подгружать скрипты и картинки с отдельного зеркала, а также объединить все файлы css-стилей и js-скриптов в один общий файл, чтобы было два файла style.css и common.js. В качестве отдельного зеркала можно завести поддомен load.mydomain.com и подгружать все картинки сайта через него, только для зеркала load.mydomain.com должны быть отдельные настройки server, с отдельными правилами limit_req_zone и limit_conn для загрузки файлов. Также будет полезно включить кеширование для файлов и изображений.
     
    25 сен 2016

Поделиться этой страницей