99 % трафика — боты: восемь рубежей обороны сайта от ИИ-скраперов

Если вы держите сайт, вики, форум, Gitea или инстанс Jellyfin с публичной страницей — вы уже платите за трафик, который никто не читает. Вопрос только в том, какая доля счёта уходит на роботов и сколько из этого можно вернуть, не поломав сайт для живых людей.

Ниже — разбор по рубежам обороны: что каждый реально ловит, чем за него платят и в каком порядке их включать. Порядок здесь важнее самих правил: почти все, кто хватается сразу за тяжёлую артиллерию, в итоге режут собственных читателей.

Сначала цифры, чтобы понимать масштаб

Начнём с независимой макростатистики. Cloudflare в отчёте от 1 июля 2026 года («Content Independence Day, one year on») приводит данные по своей сети — а это, по их же оценке, больше 20 % веба и 36 % самых посещаемых сайтов:

  • на июнь 2026 года больше половины интернет-трафика — не человеческий;
  • в структуре краулинга 52 % приходится на сбор данных для обучения моделей — против 22 % весной 2025-го;
  • около 88 % реферального трафика по-прежнему даёт Google — то есть заменителя ему, куда ушли бы «отданные» ИИ данные, просто нет;
  • в отдельных сильно выскрапленных нишах человеческий трафик просел до 40 % меньше чем за год.

Теперь полевой кейс. 7 августа автор сайта на 1,5 млн страниц (patronview.com) выложил разбор года обороны с выгрузками из логов и панели Cloudflare. Цифры оттуда:

Показатель Значение
Страниц отдано за неделю 1,28 млн
Из них живых просмотров 5 977
Соотношение бот : человек 214 : 1
Claude-SearchBot 35 000 страниц на 1 приведённого посетителя
Amzn-SearchBot 117 000 запросов в сутки, 0 переходов
Bingbot 158 610 запросов ради 680 посетителей
Googlebot 46 страниц на 1 посетителя
Счёт за сервер ~$90 → ~$450 в пиковый месяц
Warning:

Это логи одного сайта, а не репрезентативная выборка: тематика, объём страниц и то, насколько сайт «вкусен» для обучающих выборок, меняют картину в разы. Брать эти числа как «норму для всех» нельзя. Ценность кейса в другом — в нём видно, какие меры сработали, а какие оказались театром безопасности. Макроцифры Cloudflare здесь служат независимой опорой: направление тренда совпадает.

Отдельно стоит проговорить главный экономический сдвиг. Классическая сделка с поисковиком была честной: он берёт страницы — он присылает людей. У Googlebot это 46 страниц на посетителя, у Bingbot счёт уже идёт на сотни, а у краулеров, которые кормят ответы ИИ-ассистентов, обмена нет вовсе. Сканирование есть, переходов нет. Именно поэтому разговор «блокировать или нет» перестал быть про нагрузку и стал про экономику.


Схема: gig.ovh

Рубеж 1. robots.txt — заявление, а не защита

Начинать всё равно надо с него: он бесплатен, ничего не ломает и является формальным выражением вашей воли — что важно, если однажды дойдёт до претензий.

User-agent: GPTBot
Disallow: /

User-agent: ClaudeBot
Disallow: /

User-agent: Claude-SearchBot
Disallow: /

User-agent: Amazonbot
Disallow: /

User-agent: Bytespider
Disallow: /

User-agent: CCBot
Disallow: /

User-agent: *
Crawl-delay: 10
Info:

Кто вообще соблюдает robots.txt: крупные вендоры с публичной репутацией — в основном да, потому что им дороже скандал. Кто не соблюдает: всё, что ходит с поддельным браузерным User-Agent, резидентные ботнеты и мелкие «стартапы для датасетов». То есть ровно те, кто создаёт большую часть нагрузки. Cloudflare, к слову, теперь предлагает управляемый robots.txt и блокировку для монетизируемого контента — если вы у них, это делается тумблером.

Рубеж 2. Блок по User-Agent — против честно подписанных

Это работает ровно на тех, кто честно представляется. И такие есть: SEO-краулеры подписываются своим именем, потому что им нужна репутация.

Для nginx:

map $http_user_agent $bad_bot {
    default 0;
    "~*(SemrushBot|AhrefsBot|AhrefsSiteAudit|MJ12bot|DotBot|BLEXBot|DataForSEOBot|Barkrowler|SiteAuditBot|SplitSignalBot)" 1;
    "~*(GPTBot|ClaudeBot|Claude-SearchBot|Amazonbot|Amzn-SearchBot|Bytespider|CCBot)" 1;
}

server {
    if ($bad_bot) { return 403; }
}

Для Caddy:

@badbots header_regexp User-Agent "(?i)(SemrushBot|AhrefsBot|MJ12bot|DotBot|BLEXBot|GPTBot|ClaudeBot|Amazonbot|Bytespider|CCBot)"
respond @badbots 403

В упомянутом кейсе после такой блокировки Claude-SearchBot ушёл с ~60 000 запросов в сутки до 25. Это не победа над скраперами вообще — это выключение тех, кто играл по правилам и просто ходил слишком жадно. И этого зачастую достаточно, чтобы снять большую часть счёта.

Рубеж 3. Проверять «хороших» ботов, а не верить им на слово

Если вы разрешаете Googlebot — вы разрешаете всем, кто напишет Googlebot в заголовке. Проверять надо не строку, а происхождение.

Самый простой способ — обратный DNS с прямой сверкой:

# IP притворяется Googlebot?
host 66.249.66.1
# → crawl-66-249-66-1.googlebot.com
host crawl-66-249-66-1.googlebot.com
# → должен вернуться тот же IP

Правильный способ — брать официальные списки подсетей, которые Google, Bing и Apple публикуют машиночитаемо, и обновлять их по расписанию. У Cloudflare это уже готовый список Verified Bots.

Error:

Чего делать нельзя: блокировать по подсети целиком «потому что оттуда шёл бот». Из тех же диапазонов ходят ваши читатели через мобильных операторов и корпоративные NAT. Блок по ASN допустим только для сетей дата-центров — и то с оговорками (см. рубеж 5).

Рубеж 4. Ограничение скорости — первое, что стоит включить всем

Рабочий диапазон для контентного сайта — порядка 30 запросов за 10 секунд на IP, то есть 3 запроса в секунду с запасом на пачку картинок.

limit_req_zone $binary_remote_addr zone=perip:10m rate=3r/s;
limit_req_status 429;

server {
    location / {
        limit_req zone=perip burst=30 nodelay;
    }
}

Живой человек этот лимит не заметит: страница тянет CSS, шрифты и картинки пачкой, поэтому burst=30 nodelay обязателен — без него первый же честный посетитель получит 429 на половине картинок.

Warning:

Ограничение скорости на IP бесполезно ровно там, где болит сильнее всего. В апреле упомянутый сайт получил 3,6 млн запросов за сутки с 361 844 уникальных адресов — на каждый IP приходится по десятку запросов, любой разумный лимит такое пропускает. Распределённый ботнет обходит per-IP лимиты по определению; per-IP лимит спасает от жадного одиночки, а не от толпы.

Если вы за Cloudflare или другим прокси — не забудьте set_real_ip_from и real_ip_header CF-Connecting-IP, иначе вы отлимитируете сам прокси.

Рубеж 5. Челлендж для сетей дата-центров

Скрапер, который арендует мощности в AWS, Azure, GCP или у хостера подешевле, приходит с адреса, за которым не может стоять живой читатель. Это самое честное правило из всех: пользователи из ASN дата-центра — редкость.

В кейсе автор выставил челлендж для 46 ASN и получил заметный эффект. Если вы не на Cloudflare, эквивалент — фильтр по спискам подсетей дата-центров на уровне nginx или fail2ban.

Warning:

Побочный эффект, о котором забывают: под это же правило попадают ваши собственные интеграции. Uptime-мониторинг, RSS-агрегаторы, превью ссылок в Telegram и Slack, вебхуки, curl из вашего же CI, Home Assistant, который дёргает ваш API, — всё это ходит из дата-центров. Заводите allow-list до включения правила, а не после жалоб.

Рубеж 6. География — сильно, грубо и обоюдоостро

Апрельская волна в кейсе была страновой, и блок по стране её снял. Дальше автор пошёл дальше — челлендж всем континентам, кроме Северной Америки, и получил показательную статистику: доля решённых челленджей 0,24 % за 48 часов (252 решённых из 106 437), при этом 99,94 % неудач по Бразилии и 99,96 % по Сингапуру.

Эти цифры можно читать двумя способами, и это ровно та развилка, где ошибаются.

Оптимистичный: практически всё, что приходит из этих регионов, — автоматика, челлендж работает.
Пессимистичный: челлендж настолько тяжёлый, что его не проходят и люди тоже, а вы просто выключили себе половину планеты.

Important:

Для русскоязычной аудитории это не абстракция. Значительная часть читателей ходит через VPN, выходные узлы которых расположены в Нидерландах, Германии, Финляндии — то есть географически «не там», а по ASN зачастую в дата-центре. Правило «челлендж всем, кроме своей страны» гарантированно накрывает вашу собственную аудиторию. Если вы вводите гео-правила — сначала неделю в режиме логирования без блокировки, потом сравнивайте.

Рубеж 7. Замороженные версии браузера

Изящный трюк из того же кейса: ботнеты годами ходят с одним и тем же User-Agent, потому что его никто не обновляет. Живой Chrome обновляется сам. Челлендж (не блок!) для Chrome версий 100–130 и Firefox ниже 115 отсекает такие «замороженные» подписи и почти не задевает живых.

Почти — потому что есть старые Android-телефоны без обновлений, корпоративные машины с политикой заморозки и Linux-сборки со старым Firefox ESR. Поэтому именно челлендж, а не 403.

Рубеж 8. Proof-of-work: тяжёлая артиллерия

Самый радикальный вариант — заставить браузер посчитать задачу перед выдачей страницы. Для тех, кто не может или не хочет отдавать сайт под Cloudflare, есть Anubis (TecharoHQ) — открытый «веб-фаервол», который вешает вычислительный челлендж перед апстримом и умеет держать allow-list для полезных ботов вроде Internet Archive. Проект живой и популярный — больше 21 тысячи звёзд на GitHub.

Ставится перед вашим приложением как обычный обратный прокси, разворачивается в Docker.

Error:

Цена высокая и её нужно понимать заранее: proof-of-work требует исполнения JavaScript. Значит, отваливаются RSS-читалки, поисковые превью, ваши же API-клиенты, мобильные приложения, ссылочные боты мессенджеров и пользователи с отключённым JS. Anubis сами авторы называют «ядерным ответом» — вариантом для тех, кому остальное недоступно.

Есть и куда более дешёвый способ утяжелить жизнь скраперу, если у вас самохост: не выдавать 403, а отдавать медленно. limit_rate 10k для помеченных клиентов не ломает ничего, что уже работает, но делает выкачку миллиона страниц экономически бессмысленной.

Отдельный сюжет: не сделайте хуже сами себе

Самая дорогая ошибка кейса — не в правилах, а в средстве измерения. Скрипт JS-детекции, который автор поставил ради классификации трафика, добавил 2 875 мс к загрузке на мобильных и уронил Lighthouse до 58. То есть ради борьбы за трафик была испорчена скорость сайта для тех самых живых 0,5 %, ради которых всё затевалось. Скрипт выключили 5 августа.

Success:

Порядок внедрения, который не сломает вам сайт:

  1. Неделя наблюдения без блокировок: разберитесь, кто вообще к вам ходит (awk '{print $12}' access.log | sort | uniq -c | sort -rn | head -30 по User-Agent).
  2. robots.txt — сразу, он бесплатен.
  3. Блок по User-Agent для явных SEO- и ИИ-краулеров — это снимет большую часть счёта.
  4. Ограничение скорости с burst и правильным real_ip.
  5. Allow-list собственных интеграций и мониторинга — до, а не после.
  6. Челлендж для дата-центровых ASN.
  7. Гео- и версионные правила — только в режиме логирования сначала, с оценкой потерь.
  8. Proof-of-work — последним и только если предыдущее не помогло.

И измеряйте не «сколько заблокировано», а два числа: счёт за трафик и время ответа для живых пользователей. Первое должно падать, второе — не расти.

Ещё одна честная мысль напоследок. Полностью выиграть эту войну нельзя: резидентные ботнеты через домашние провайдерские IP выглядят как обычные посетители, и в кейсе июльская волна пришла именно так — с американских бытовых адресов, после того как страновые правила были включены. Реалистичная цель не «ноль ботов», а «предсказуемый счёт и живой сайт». Всё, что сверх этого, обычно оплачивается вашими же читателями.

Источники

Смежные темы на форуме: UFW-Docker: как закрыть порты Docker-контейнеров и настроить файрвол, Homelab-стек 2026: что реально self-хостят.

Question:

Интересно свести статистику по форуму: какая у вас доля ботов в логах и что из перечисленного вы уже включили? И отдельный вопрос к тем, кто ставил Anubis или похожий proof-of-work — сколько живых пользователей пожаловалось в первую неделю?