Разберём действенные и несложные в реализации способы защиты сервера от DDoS‑атак — без дорогих решений и сложной настройки.
Шаг 1. Мониторинг и раннее обнаружение
Что отслеживать:
- загрузку CPU/RAM (резкий рост);
- сетевой трафик (внезапное увеличение);
- количество одновременных подключений;
- ошибки 5xx в логах веб‑сервера.
Инструменты:
- htop — нагрузка системы;
- iftop или nload — сетевой трафик в реальном времени;
- netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr — подсчёт подключений по IP;
- логи веб‑сервера (tail -f /var/log/nginx/access.log).
Шаг 2. Настройка брандмауэра (iptables)
Базовые правила для Linux:
- Ограничение SYN‑запросов (защита от SYN‑флуда):
bash
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP
- Ограничение подключений с одного IP:
bash
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 20 -j REJECT
- Блокировка подозрительных IP (временная мера):
bash
iptables -A INPUT -s 192.168.1.100 -j DROP
- Ограничение ICMP‑запросов (защита от ping‑флуда):
bash
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
Сохранение правил:
bash
iptables-save > /etc/iptables/rules.v4
Шаг 3. Настройка веб‑сервера (Nginx)
Добавьте в конфигурацию Nginx (/etc/nginx/nginx.conf) блоки защиты:
nginx
http {
# Ограничение запросов: 10 запросов в секунду с IP
limit_req_zone $binary_remote_addr zone=one:10m rate=10r/s;
# Ограничение соединений: максимум 5 соединений с IP
limit_conn_zone $binary_remote_addr zone=addr:10m;
server {
location / {
limit_req zone=one burst=20; # всплески до 20 запросов
limit_conn addr 5; # максимум 5 соединений
}
}
}
Перезапуск Nginx:
bash
systemctl reload nginx
Шаг 4. Использование Fail2Ban
Установка:
bash
apt install fail2ban
Настройка:
- Создайте конфиг: cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local.
- Отредактируйте jail.local:
ini
[nginx-limit-req]
enabled = true
filter = nginx-limit-req
action = iptables-multiport[name=NoLimitReq, port="http,https", protocol=tcp]
logpath = /var/log/nginx/error.log
findtime = 600
bantime = 3600
maxretry = 10
- Перезапуск: systemctl restart fail2ban.
Как работает: Fail2Ban анализирует логи и автоматически блокирует IP с подозрительной активностью (много ошибок 429, 5xx).
Шаг 5. Оптимизация сервера
Для веб‑серверов:
- включите кэширование (Nginx, Varnish);
- используйте Gzip‑сжатие;
- настройте HTTP/2 или HTTP/3 (QUIC).
Общие рекомендации:
- отключите неиспользуемые службы (FTP, Telnet);
- смените стандартные порты (например, SSH с 22 на 2222);
- ограничьте доступ к админ‑панелям по IP.
Шаг 6. Облачные сервисы защиты (бюджетные варианты)
Для небольших проектов подойдут бесплатные тарифы:
- Cloudflare — защита от HTTP‑флуда, DNS‑атак;
- Google Cloud Armor — фильтрация трафика для Google Cloud;
- AWS Shield (Standard) — базовая защита для AWS.
Плюсы: не требуют сложной настройки, фильтруют трафик до вашего сервера.
Шаг 7. Резервное копирование и план реагирования
Действия при атаке:
- Зафиксируйте время начала и тип трафика (логи, iftop).
- Временно ограничьте доступ по IP (белый список для админов).
- Усильте лимиты в Nginx/Fail2Ban.
- Сообщите хостеру — у многих есть встроенная защита.
- После атаки проанализируйте логи для улучшения правил.
Резервное копирование:
- настройте автоматическое копирование данных (cron + rsync);
- храните бэкапы на отдельном сервере или в облаке.
Чек‑лист быстрой защиты
- Установите и настройте fail2ban.
- Добавьте лимиты в Nginx (limit_req, limit_conn).
- Настройте iptables для ограничения SYN/ICMP.
- Подключите Cloudflare (бесплатный тариф).
- Настройте мониторинг трафика (iftop, nload).
- Проверьте логи на подозрительную активность.
- Протестируйте восстановление из бэкапа.
Устранение распространённых проблем
- «Сервер всё равно падает под нагрузкой»:
увеличьте лимиты в Nginx постепенно;
проверьте, не использует ли ботнет легитимные IP (Googlebot и т. д.). - «Блокируются легитимные пользователи»:
добавьте их IP в белый список в fail2ban;
настройте burst в Nginx для всплесков трафика. - «Не хватает ресурсов для обработки правил»:
используйте облачные сервисы (Cloudflare) вместо локальных фильтров;
оптимизируйте iptables (удалите неиспользуемые правила). - «Атака идёт через UDP»:
закройте неиспользуемые UDP‑порты в iptables:bashiptables -A INPUT -p udp --dport 53 -j DROP # если не используете DNS
Рекомендации по профилактике
- Регулярно обновляйте ПО (Nginx, ОС, приложения).
- Ограничьте доступ к админ‑панелям (по IP или через VPN).
- Используйте HTTPS — шифрование усложняет спуфинг.
- Анализируйте логи еженедельно (ищите аномалии).
- Тестируйте защиту — имитируйте нагрузку через ab или siege:
bash
ab -n 1000 -c 10 http://ваш-сайт.ru/
- Информируйте пользователей — создайте страницу «Технический перерыв» на случай атаки.
Важные нюансы
- Не блокируйте IP без анализа — могут пострадать легитимные клиенты.
- Начинайте с мягких лимитов (например, 10 запросов/сек вместо 1).
- Комбинируйте методы — Fail2Ban + Nginx + Cloudflare надёжнее одного решения.
- Автоматизируйте мониторинг — настройте оповещения в Telegram/email при превышении нагрузки.
Эти методы помогут отразить большинство атак уровня L3/L4 (SYN‑флуд, UDP‑флуд) и L7 (HTTP‑флуд). Для масштабных атак (10+ Гбит/с) потребуется профессиональная защита, но для небольших проектов этого достаточно.
Если хотите, могу подробнее разобрать какой‑то из шагов или помочь адаптировать настройки под ваш сервер!