Большая и реальная борьба с DDoS-атакой

Юрий Герук 2025-11-20 9
Большая и реальная борьба с DDoS-атакой

Содержание

    Введение

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

    Именно это произошло с нами летом 2025 года. Один из сайтов внезапно начал вести себя подозрительно:

    • страницы начали грузиться медленно;
    • сервер отвечал с ошибками 502 и 504;
    • время отклика выросло с 300мс до 2–3 секунд;
    • в Google Search Console появился всплеск по «недоступности».

    И всё бы ничего — но это был не всплеск активности людей. Это была полномасштабная DDoS-атака.

    Этап 1: Распознаём врага по лицу

    Мы сразу полезли в Cloudflare Firewall Events, выгрузив JSON-логи за последние сутки. И это было зрелище:

    • десятки тысяч запросов;
    • с IP из Вьетнама, Индии, Бразилии, Малайзии, Пакистана, Южной Кореи;
    • одинаковые User-Agent'ы: curl, python-requests, go-http, WinHttp;
    • запросы почти все — на /, /admin, .ico, /robots.txt, /wp-login.php.

    Мы выгрузили CSV из Cloudflare и сделали базовую агрегацию: country, ASN, userAgent, action.

    Топ-10 стран по атакующему трафику:

    Страна Запросов
    🇻🇳 Вьетнам 12000+
    🇮🇳 Индия 8900+
    🇧🇷 Бразилия 7000+
    🇮🇩 Индонезия 5200+
    🇲🇾 Малайзия 4100+
    🇵🇭 Филиппины 3900+
    🇹🇭 Таиланд 2800+
    🇧🇩 Бангладеш 2100+
    🇵🇰 Пакистан 1800+
    🇰🇵 Северная Корея 900+

    Топ ASN (автономных систем):

    ASN Провайдер
    24560 Bharti Airtel (Индия)
    45899 VNPT Corp (Вьетнам)
    4766 Korea Telecom
    45102 Alibaba Vietnam
    28329 Oi S.A. (Бразилия)
    13886 Cloud South (США)
    51167 Contabo GmbH
    20473 Choopa (Vultr)
    16276 OVH SAS

    Этап 2: Настройка боевых фильтров

    Cloudflare по умолчанию не фильтрует такие запросы. Даже curl проходит. Так что мы начали действовать:

    Правило #1: Отсекание географии

    Мы собрали список стран, откуда шёл мусор, и добавили их в фильтр:

    ip.geoip.country in {
     "VN" "IN" "PK" "BD" "ID" "PH" "MY" "TH" "BR" "CN" "KP"
    }
    

    Правило #2: Фильтрация ASN

    ASN — это блоки провайдеров. Мы добавили в блок те, кто был замечен в атаках:

    ip.geoip.asnum in {
     24560 45899 4766 45102 28329 20473 16276 51167 13886
    }
    

    Правило #3: Защита от curl, python, go

    lower(http.user_agent) contains "curl" or
    lower(http.user_agent) contains "python" or
    lower(http.user_agent) contains "go-http" or
    lower(http.user_agent) contains "winhttp"
    

    Правило #4: Отсекание сканеров на / с query

    http.request.uri.path eq "/" and
    http.request.uri.query ne ""
    

    Всё вместе — итоговый фильтр:

    (
     not cf.client.bot and
     (
     ip.geoip.country in {
     "CN" "KP" "PK" "BD" "ID" "PH" "VN" "MY" "IN" "BR" "TH"
     } or
     ip.geoip.asnum in {
     45102 63859 136121 20473 16276 210616
     14061 9009 21859 35913 49505 4766 51167 210644
     24560 28329 45899 13886
     } or
     (
     http.request.uri.path eq "/" and
     http.request.uri.query ne ""
     ) or
     (
     http.request.uri.path contains ".ico"
     ) or
     (
     lower(http.user_agent) contains "curl" or
     lower(http.user_agent) contains "go-http" or
     lower(http.user_agent) contains "python" or
     lower(http.user_agent) contains "httpclient" or
     lower(http.user_agent) contains "winhttp" or
     lower(http.user_agent) contains "libwww" or
     lower(http.user_agent) contains "scan" or
     lower(http.user_agent) contains "bot"
     )
     )
    )
    

    Этап 3: Результаты

    После активации правил:

    • 97% вредоносного трафика блокировалось на уровне Cloudflare.
    • Сайт начал летать.
    • В логах — только люди и поисковики.
    • Число запросов на / с мусорными параметрами упало до нуля.
    • Атака продолжалась — но она билась в кирпичную стену.

    Параллельный сайт: zhzh.info

    Мы взяли логи с другого сайта (zhzh.info) без фильтров. Там:

    • curl, python — проходили;
    • запросы с Вьетнама — пропускались;
    • боты спокойно заходили на /.ico, /admin.php, /login.php.

    Вывод: если фильтр не поставлен — Cloudflare сам по себе не помогает.

    Дополнительные меры

    • Включили rate limiting: 10 запросов в 10 секунд.
    • Отключили HTTP/1.0 и 1.1 через firewall headers.
    • Настроили geo rate limiting: с Вьетнама — не более 5 в минуту.
    • Включили логирование в Telegram (bot → alert).
    • Проверили все сайты на аккаунте: добавили фильтр копипастой.

    Заключение

    Боты никуда не денутся. Но ты можешь сделать так, чтобы они долбились об глухую стену.

    Cloudflare — не магия. Это просто мощный инструмент. Настроенный правильно — это как мина с распознаванием лиц. Не настроенный — это просто оранжевая иконка.

    Лицензия: CC BY-SA 4.0

     

    Автор: Юрий Герук

    Похожие материалы:

    Комментарии