OffshoreVps
Безопасность13 окт. 20268 мин чтенияАвтор: команда OffshoreVps

Защита от DDoS 7-го уровня для VPS с Nginx

Защита от DDoS на уровне хоста останавливает потоки сырого трафика, но не хитрые запросы. Добавьте лимиты запросов, кеширование и правила против ботов в Nginx и fail2ban, чтобы пережить атаки на уровне приложения.

Большинство тарифов хостинга обещают защиту от DDoS. Обычно это означает фильтрацию больших потоков мусорных пакетов (уровни 3 и 4) до того, как они дойдут до вашего сервера. Это не остановит тысячу «настоящих» браузеров, одновременно загружающих вашу самую медленную страницу. Такие атаки прикладного уровня (уровень 7) выглядят как обычные посетители, и справляться с ними вам придётся самостоятельно. Подробнее см. что такое защита от DDoS.

Окно терминала на VPS с командами для защиты от DDoS-атак уровня 7 с помощью Nginx
Примерно такие команды вы будете выполнять на своём сервере в этом руководстве.

Поймите разницу

  • Объёмные атаки: забивают канал. Их фильтрует хостер или вышестоящий провайдер.
  • Атаки на протоколы: исчерпывают таблицы соединений. В основном их обрабатывает сеть.
  • Атаки уровня 7: внешне корректные HTTP-запросы, расходующие CPU, базу данных или воркеры. Они доходят до вашего приложения.

Шаг 1: ограничьте частоту запросов в Nginx

Ограничьте, как быстро один адрес может делать запросы. Определите зону в блоке http и примените её к вашему сайту.

limit_req_zone $binary_remote_addr zone=perip:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=connip:10m;

server {
    location / {
        limit_req zone=perip burst=20 nodelay;
        limit_conn connip 20;
    }
    location = /login {
        limit_req zone=perip burst=3 nodelay;
    }
}

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

Шаг 2: кэшируйте всё, что можно

Обслуживание кэшированной страницы почти ничего не стоит. Включите кэширование FastCGI или прокси для анонимного трафика, даже на 30–60 секунд. Это превращает поток одинаковых запросов в горстку настоящих.

fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=site:50m inactive=10m;
fastcgi_cache site;
fastcgi_cache_valid 200 60s;
fastcgi_cache_use_stale updating error timeout;
Шаги этого руководства по порядку: 1. Знайте разницу; 2. ограничьте частоту запросов в Nginx; 3. кешируйте всё, что можно; 4. баньте повторных нарушителей с помощью fail2ban; 5. поставьте прокси впереди, когда ситуация становится серьёзной; 6. Будьте готовы заранее
Шаги этого руководства по порядку.

Шаг 3: задайте разумные тайм-ауты

Атаки медленными соединениями удерживают воркеры открытыми. Сократите лимиты.

client_body_timeout 10s;
client_header_timeout 10s;
send_timeout 15s;
keepalive_timeout 15s;
client_max_body_size 5m;

Шаг 4: блокируйте повторных нарушителей через fail2ban

Блокируйте адреса, которые срабатывают на ограничитель частоты. Nginx записывает отклонённые запросы в журнал ошибок, и фильтр может их распознавать.

[nginx-limit-req]
enabled  = true
filter   = nginx-limit-req
logpath  = /var/log/nginx/error.log
maxretry = 10
findtime = 60
bantime  = 1h

Шаг 5: поставьте прокси перед сервером, когда ситуация станет серьёзной

Обратный прокси или CDN с проверками на ботов может выдержать атаки, с которыми не справится один VPS. Не забудьте защитить исходный сервер, как описано в статье как сохранить в тайне IP исходного сервера, иначе атакующие обойдут прокси.

Будьте готовы заранее

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

Основы из руководства по UFW и fail2ban дополняют эту статью.