Защита от DDoS и SEO: как настроить Rate Limit и CAPTCHA

Сегодня хочу поделиться опытом, как защитить сайт от DDoS-атак, не жертвуя SEO-показателями. Вы узнаете, как настроить rate limits, внедрить «невидимую» CAPTCHA и проверить, не замедлится ли сайт для поисковых роботов. В статье будут реальные примеры кода, тесты и лайфхаки, которые я применяю в своих проектах.

Почему DDoS-защита может убить SEO?

Представьте, вы настроили мощный файрволл, ограничили запросы, добавили CAPTCHA на каждую форму. А через месяц заметили, что трафик из Яндекса упал на 30%. Причина? Поисковые боты стали получать ошибки 429 или бесконечно решать капчи. Результат — краулинговый бюджет сократился, страницы выпали из индекса.

Моя задача найти баланс, отсечь ботов-атакеров, но пропустить Googlebot и Yandex. Расскажу, как это сделать.

Настройка Rate Limits

Rate Limit (ограничение частоты запросов) — основа защиты от DDoS. Но если настроить его неправильно, под удар попадут и пользователи, и поисковики.

Шаг 1. Определяем нормальный трафик
Перед настройкой я анализирую логи Nginx за 30 дней. Например:

  • Среднее число запросов от одного IP: 120/мин.
  • Пиковые значения (во время акций): 500/мин.

Шаг 2. Настраиваем Nginx
В конфигурации сервера добавляю зону для ограничений:

nginx
http {  
    limit_req_zone $binary_remote_addr zone=api_limit:10m rate=200r/m;  
}  

server {  
    location / {  
        limit_req zone=api_limit burst=300 nodelay;  
    }  
}

Пояснение:

  • rate=200r/m — 200 запросов в минуту с одного IP.
  • burst=300 — разрешаем кратковременные всплески до 300 запросов.
  • nodelay — не задерживаем запросы, а сразу отклоняем лишние.

Важно! Исключаем поисковых ботов. Для этого проверяем User-Agent и добавляем условие:

nginx
map $http_user_agent $is_bot {  
    default 0;  
    ~*(Googlebot|YandexBot|Bingbot) 1;  
}  

server {  
    location / {  
        if ($is_bot) {  
            limit_req off;  # Отключаем лимит для ботов  
        }  
    }  
}

CAPTCHA

CAPTCHA — эффективный инструмент, но её неправильная реализация блокирует краулеры. Мой подход — «невидимая» проверка для ботов.

Пример: интеграция hCaptcha с проверкой IP
Использую Cloudflare и их сервис Turnstile. Код для PHP:

// Проверяем, является ли посетитель ботом  
$user_agent = $_SERVER['HTTP_USER_AGENT'];  
$is_search_bot = preg_match('/Googlebot|YandexBot|Bingbot/', $user_agent);  

if (!$is_search_bot) {  
    // Показываем CAPTCHA только людям  
    $secret = "ваш_ключ";  
    $response = $_POST['cf-turnstile-response'];  
    $url = "https://challenges.cloudflare.com/turnstile/v0/siteverify";  

    $data = array(  
        'secret' => $secret,  
        'response' => $response  
    );  

    $result = json_decode(file_get_contents($url, false, stream_context_create(array(  
        'http' => array(  
            'method' => 'POST',  
            'header' => "Content-Type: application/x-www-form-urlencoded\r\n",  
            'content' => http_build_query($data)  
        )  
    ))));  

    if (!$result->success) {  
        die("Пройдите CAPTCHA!");  
    }  
}

Как это работает:

  • Поисковые боты видят страницу без CAPTCHA.
  • Пользователи решают CAPTCHA только при подозрительной активности (например, 100 запросов в минуту).

Сравнительные тесты: что происходит со скоростью?

Я провел эксперимент на тестовом сайте (WordPress, 500 страниц).

Параметр Без защиты С Rate Limit Rate Limit + CAPTCHA
Время загрузки (с) 1.2 1.3 1.4
Запросов/сек 1500 900 700
Ошибки краулеров 0% 12% 0%

Выводы:

  • Rate Limit снижает нагрузку, но может блокировать ботов.
  • CAPTCHA с исключениями для SEO возвращает ошибки краулеров к 0%, но добавляет +0.1с к загрузке.

Мои 3 правила для баланса

  1. Белые списки для ботов. Всегда исключайте Googlebot, YandexBot и других легитимных краулеров из ограничений.
  2. Мониторьте логи. Раз в неделю проверяйте, не блокируются ли поисковики.
  3. Тестируйте скорость. После настройки защиты запускайте Lighthouse или WebPageTest. Если TTFB вырос на 30% оптимизируйте кэширование.