Большинство тарифов хостинга обещают защиту от DDoS. Обычно это означает фильтрацию больших потоков мусорных пакетов (уровни 3 и 4) до того, как они дойдут до вашего сервера. Это не остановит тысячу «настоящих» браузеров, одновременно загружающих вашу самую медленную страницу. Такие атаки прикладного уровня (уровень 7) выглядят как обычные посетители, и справляться с ними вам придётся самостоятельно. Подробнее см. что такое защита от DDoS.
Поймите разницу
- Объёмные атаки: забивают канал. Их фильтрует хостер или вышестоящий провайдер.
- Атаки на протоколы: исчерпывают таблицы соединений. В основном их обрабатывает сеть.
- Атаки уровня 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;
Шаг 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 дополняют эту статью.