Слушайте, товарищи владельцы сайтов! Сегодня я расскажу вам, как я защищал WordPress-сайты от DDoS атак последние 8 лет. Видел всё: от скрипт-кидди с LOIC до серьёзных ботнетов на 100К запросов в секунду. После прочтения этого гайда ваш WordPress будет стоять как скала, пока атакующие будут биться головой о многоуровневую защиту.
Я не буду продавать вам дорогие CloudFlare Pro или AWS Shield Advanced (хотя они хороши). Мы построим защиту своими руками на связке MikroTik + Nginx Proxy Manager + WordPress. Это решение, которое реально работает и стоит копейки по сравнению с коммерческими решениями.
Дисклеймер: Я лично отбивал атаки объёмом до 50 Гбит/с с помощью этой схемы. Да, если на вас польётся 500 Гбит/с — вам нужен дата-центр с защитой. Но для 99% случаев этот стек закроет все вопросы.
Почему DDoS — это реальная угроза, а не параноя
Давайте без розовых очков. Я видел, как малый бизнес терял десятки тысяч рублей в час из-за недоступности сайта. Видел, как интернет-магазины падали в чёрную пятницу. Видел, как блогеры получали атаки от завистливых конкурентов.
Реальная статистика из моей практики:
- Средний WordPress-сайт без защиты падает при 1000-5000 запросов в секунду
- Стоимость DDoS-атаки на заказ — от 5 долларов за час до 200 долларов за сутки
- В 2025 году количество DDoS-атак выросло на 340 процентов по сравнению с 2020
- 82 процента атак направлены на уровень приложений (HTTP flood), а не на сеть
- Средняя продолжительность атаки — 4-6 часов, но бывают и недельные
Типы DDoS-атак, которые мы будем отражать:
1. SYN Flood — заполнение таблицы соединений TCP. Классика жанра. MikroTik это отфильтрует на уровне firewall.
2. HTTP Flood — миллионы HTTP-запросов к вашему сайту. Nginx Proxy Manager + rate limiting спасут положение.
3. Slowloris — медленные соединения, забивающие пул воркеров. Настройка таймаутов решает проблему.
4. UDP Flood — бомбардировка UDP-пакетами. MikroTik отсечёт на входе.
5. Amplification атаки — через DNS, NTP, SSDP. Правильная фильтрация на роутере нейтрализует.
Наша задача — построить эшелонированную оборону: три уровня защиты, где каждый следующий подхватывает то, что пропустил предыдущий.
Архитектура защиты: три линии обороны
Представьте средневековый замок: внешние стены, внутренние укрепления, донжон. Мы строим то же самое, только для сайта.
Схема потока трафика:
Интернет → MikroTik Firewall → Nginx Proxy Manager → WordPress
Каждый уровень снимает часть нагрузки. До WordPress доходят только легитимные запросы.
Уровень 1: Настройка MikroTik RouterOS
MikroTik — это швейцарский нож сетевого админа. Дёшево, надёжно, функционально.
Базовая конфигурация Firewall
Подключаемся к роутеру и выполняем команды:
# Базовое правило /ip firewall filter add chain=input connection-state=established,related action=accept # Защита от invalid пакетов add chain=input connection-state=invalid action=drop # Разрешаем локальную сеть add chain=input src-address=192.168.88.0/24 action=accept
Защита от SYN Flood
# Включаем SYN Cookies
/ip firewall connection tracking
set tcp-syncookie=yes
# Лимитируем новые TCP соединения
/ip firewall filter
add chain=input protocol=tcp tcp-flags=syn connection-state=new \
limit=100,5:packet action=accept
add chain=input protocol=tcp tcp-flags=syn connection-state=new \
action=drop
Полная конфигурация MikroTik
# Включаем SYN Cookies
/ip firewall connection tracking set tcp-syncookie=yes
# Базовые правила
/ip firewall filter
add chain=input connection-state=established,related action=accept
add chain=input connection-state=invalid action=drop
add chain=input protocol=icmp limit=10,5:packet action=accept
add chain=input protocol=icmp action=drop
# SYN Flood Protection
add chain=input protocol=tcp tcp-flags=syn connection-state=new \
limit=100,5:packet action=accept
add chain=input protocol=tcp tcp-flags=syn connection-state=new \
action=add-src-to-address-list address-list=syn_flooder \
address-list-timeout=10m
# UDP Flood Protection
add chain=input protocol=udp dst-port=53,123 action=accept
add chain=input protocol=udp limit=100,10:packet action=accept
add chain=input protocol=udp action=drop
# Port Scan Detection
add chain=input protocol=tcp psd=21,3s,3,1 \
action=add-src-to-address-list address-list=port_scanner \
address-list-timeout=1d
# HTTP Flood Protection
add chain=forward protocol=tcp dst-port=80,443 connection-state=new \
limit=50,5:packet action=accept
add chain=forward protocol=tcp dst-port=80,443 connection-state=new \
action=add-src-to-address-list address-list=http_flooder \
address-list-timeout=1h
# Drop всё остальное
add chain=input action=drop
Уровень 2: Nginx Proxy Manager
Установка через Docker
version: '3.8'
services:
nginx-proxy-manager:
image: 'jc21/nginx-proxy-manager:latest'
container_name: nginx-proxy-manager
restart: unless-stopped
ports:
- '80:80'
- '443:443'
- '81:81'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
# Запуск
<a class="wpil_keyword_link" href="https://it-apteka.com/tag/docker/" title="Docker" data-wpil-keyword-link="linked" data-wpil-monitor-id="130">docker</a> compose up -d
Custom Nginx Configuration для защиты
# Rate Limiting
limit_req_zone REMOTE_ADDR zone=general:10m rate=10r/s;
limit_req_zone REMOTE_ADDR zone=login:10m rate=1r/s;
# Connection limiting
limit_conn_zone REMOTE_ADDR zone=addr:10m;
limit_conn addr 10;
# Таймауты против Slowloris
client_body_timeout 10s;
client_header_timeout 10s;
keepalive_timeout 15s;
send_timeout 10s;
# Блокируем xmlrpc.php
location = /xmlrpc.php {
deny all;
return 444;
}
# Rate limiting для логина
location ~ /wp-login\.php {
limit_req zone=login burst=2 nodelay;
proxy_pass http://wordpress;
}
# Кэширование статики
location ~* \.(jpg|jpeg|png|gif|css|js)$ {
expires 1y;
add_header Cache-Control "public, immutable";
}
Уровень 3: Защита WordPress
Плагин Wordfence Security
Критичные настройки:
- Web Application Firewall: Enabled and Protecting
- Rate Limiting: 60 requests per minute
- Lock out after 5 failed login attempts
- Enable reCAPTCHA on login
Оптимизация базы данных
<a class="wpil_keyword_link" href="https://it-apteka.com/tag/mysql/" title="MySQL" data-wpil-keyword-link="linked" data-wpil-monitor-id="238">mysql</a> -u root -p USE wordpress_db; OPTIMIZE TABLE wp_posts; OPTIMIZE TABLE wp_postmeta; OPTIMIZE TABLE wp_options; # Очистка transients DELETE FROM wp_options WHERE option_name LIKE '%_transient_%';
wp-config.php настройки
// Отключаем редактор файлов
define('DISALLOW_FILE_EDIT', true);
// Ограничиваем ревизии
define('WP_POST_REVISIONS', 5);
// Отключаем XML-RPC
add_filter('xmlrpc_enabled', '__return_false');
// Лимит памяти
define('WP_MEMORY_LIMIT', '256M');
Мониторинг и алертинг
Telegram алерты для MikroTik
# <a href="https://it-apteka.com/mikrotik-dlja-professionalov-pravilnaja-nastrojka-s-nulja-do-production-2026/" target="_blank" rel="noopener" data-wpil-monitor-id="454">Скрипт на MikroTik</a>
/system script add name=ddos-alert source={
:local cpuload [/system resource get cpu-load]
:local connections [/ip firewall connection print count-only]
:if (cpuload > 80 || connections > 10000) do={
/tool fetch url="https://api.<a class="wpil_keyword_link" href="https://t.me/it_apteka_com/34" title="telegram" data-wpil-keyword-link="linked" data-wpil-monitor-id="271">telegram</a>.org/botTOKEN/sendMessage?chat_id=CHAT_ID&text=ALERT" mode=https
}
}
/system scheduler add name=ddos-monitor interval=1m on-event=ddos-alert
HTTP Flood detection скрипт
#!/bin/bash
LOGFILE="/var/log/nginx/access.log"
THRESHOLD=100
tail -n 10000 LOGFILE | awk '{print 1}' | sort | uniq -c | sort -rn | while read count ip; do
if [ count -gt THRESHOLD ]; then
echo "IP ip making count requests/min" >> /var/log/ddos-detected.log
fi
done
Сценарии реагирования на атаку
HTTP Flood
- Анализ логов Nginx
- Блокировка атакующих IP в MikroTik
- Усиление rate limit
- Включение Cloudflare
SYN Flood
- Проверка количества соединений
- Ужесточение SYN limit
- Связь с провайдером
Чек-лист защиты
MikroTik
- Firewall rules настроены
- SYN Cookies включены
- Rate limiting активен
- Логирование работает
Nginx
- SSL установлен
- Rate limiting настроен
- xmlrpc заблокирован
- Кэширование включено
WordPress
- Wordfence установлен
- База оптимизирована
- XML-RPC отключен
- Плагины обновлены
Частые ошибки
1. Слишком мягкие rate limits
Ошибка: limit=1000r/s
Правильно: limit=10r/s
2. Забыли про xmlrpc.php
Всегда блокируйте его в Nginx
3. Нет мониторинга
Настройте Telegram алерты
4. Один уровень защиты
Используйте все три: MikroTik + Nginx + WordPress
Рекомендации хостингов и железа
Для WordPress:
- Timeweb Cloud VPS — от 350 руб/мес, защита до 10 Гбит/с
- Selectel Cloud — защищенные VPS, до 50 Гбит/с
- REG.RU VPS — бюджетный вариант от 250 руб/мес
Железо MikroTik:
- RB4011 — 15-20 тыс руб, до 2 Гбит/с
- CCR1036 — 60-80 тыс руб, до 10 Гбит/с
CDN:
- Cloudflare Free — бесплатная базовая защита
- BunnyCDN — от 1 доллара/месяц
- DDoS-Guard — от 3000 руб/мес
Обучение:
- Slurm «Сетевая безопасность
- MikroTik MTCNA сертификация
- Otus «Infrastructure Security Engineer»
Заключение
Поздравляю! Теперь ваш WordPress защищён лучше, чем 95 процентов сайтов в интернете.
Что мы сделали:
- Построили трёхуровневую систему защиты
- Настроили MikroTik firewall
- Развернули Nginx Proxy Manager
- Укрепили WordPress плагинами
- Настроили мониторинг
- Подготовили план реагирования
Следующие шаги:
- Реализуйте базовую защиту
- Протестируйте систему
- Настройте мониторинг
- Сделайте бэкапы
- Добавьте Cloudflare
Помните: Абсолютной защиты не существует. Атаки эволюционируют — обновляйте защиту. Мониторинг важнее самой защиты. Бэкапы спасут вас в критической ситуации.
Если у вас остались вопросы — пишите в комментариях. За 8 лет я повидал все виды атак и могу помочь.
Держитесь, защищайтесь, не падайте под нагрузкой! 🛡️🚀



