Защита от DDoS — тонкое искусство на стыке программирования, компьютерной безопасности и системного администрирования. В списке инструментов защиты не последнее место занимает популярный сервер Nginx.

Если его правильно настроить, можно минимизировать последствия DDoS-атак и затруднить их проведение. Мы подготовили список рекомендаций для тех, кто строит систему защиты от основных атак DDoS с помощью Nginx.

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

1. Готовьтесь к балансировке нагрузки с первого дня

Часто бэкэнд-системы сначала работают с небольшими нагрузками. В этом случае балансировка нагрузки не нужна — нет и самой нагрузки. Но это не значит, что к нагрузкам не надо готовиться.

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

Поскольку повышенный спрос на программу чем-то похож на DDoS-атаку, готовность к всплескам полезного трафика защитит вас и от атак.

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

2. Кэширование всего, чего только можно

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

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

3. Блокируйте подозрительные адреса

Часто в ходе расследования инцидентов безопасности выясняется, что большая часть вредоносного трафика приходит с определенных IP-адресов. Такой трафик легко блокируется файерволами. Если по какой-либо причине нет возможности настроить файервол, вы всегда можете отрезать запросы злоумышленников на уровне самого Nginx:

location / {
    deny 123.123.123.0/28;
    # ...
}

Вот такая простая опция в конфигурационном файле блокирует вредоносную подсеть целиком.

4. Боритесь с медленными соединениями

Один из способов загрузить сервер лишней работой и провести DDoS — отправлять на него медленные запросы. Отвечая на медленные коннекты, сервер не сможет обрабатывать запросы от настоящих пользователей. Для защиты от DDoS в Nginx есть возможность выставить тайм-ауты, которые не позволят соединениям висеть слишком долго:

server {
    client_body_timeout 5s;
    client_header_timeout 5s;
    # ...
}

Эта простая настройка защитит вас от целого класса DDoS-атак.

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

5. Ограничивайте количество запросов с одного адреса

Еще одна из тактик проведения DDoS — обрушить на сервер большое количество запросов с одного адреса. Nginx умеет предотвращать и это, ограничивая количество запросов с адреса к ресурсу:

limit_req_zone $binary_remote_addr zone=one:10m rate=30r/m;

server {
    # ...
    location /login.html {
        limit_req zone=one;
    # ...
    }
}

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

6. Защищаем приложение — ограничиваем число коннектов к бизнес-логике

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

Ограничить количество коннектов на бэкенд в Nginx DDoS Protection можно так:

upstream website {
    server 192.168.100.1:80 max_conns=200;
    server 192.168.100.2:80 max_conns=200;
    queue 10 timeout=30s;
}

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