Проверяй краулер, а не его имя: Web Bot Auth, IP-проверки и третий гейт
Перейти к содержимому
Проверяй краулер, а не его имя: Web Bot Auth, IP-проверки и третий гейт

Проверяй краулер, а не его имя: Web Bot Auth, IP-проверки и третий гейт.

Обновлено: 19.07.2026

Проверяй краулер, а не его имя: Web Bot Auth, IP-проверки и третий гейт

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

Это та самая статья: модель, к которой я пришёл, и трещины, на которые я всё время натыкаюсь.

Сразу, чтобы не приняли за победный отчёт: у себя на краю я это ещё не выкатил. Это ресёрч в сторону того, чтобы сделать правильно. Если ты гоняешь такое в проде — в комментариях я узнаю что-то новое.

Один вопрос, который на самом деле два

Ты хочешь, чтобы ИИ-краулеры доходили до контента — так тебя цитируют ChatGPT, Perplexity и Gemini. И не хочешь, чтобы следом заходил каждый скрапер интернета.

«Хороших пустить, плохих не пускать» звучит как одна задача. Это две, и они тянут в разные стороны. Откроешь дверь шире для GPTBot — открыл её всему, что готово вписать GPTBot в заголовок. Закроешь — исчезаешь из тех ответов, в которых пытался появиться.

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

Ответ 1 — имя (и почему оно ничего не стоит)

Ленивый фикс: пропускать всё, у чего в User-Agent есть GPTBot.

User-Agent — это строка. Её может набрать кто угодно. Скрапер подписывается GPTBot, спокойно проходит, и твой жест в сторону ИИ-видимости превращается в открытую дверь ровно для того трафика, который ты не пускал.

Имя — не личность. Это заявка. Нужно то, что гость не может подделать.

Ответ 2 — происхождение (IP)

Лучше: проверить, откуда запрос реально пришёл. Правильно — это двухшаговый DNS-танец, а не плоский поиск по IP:

  1. Reverse-DNS по IP запроса → получить хостнейм
  2. Убедиться, что хостнейм принадлежит вендору — .crawl.openai.com, .anthropic.com, .perplexity.ai, .googlebot.com
  3. Forward-resolve этого хостнейма → он должен вернуть исходный IP
Forward-confirm reverse DNS: IP резолвится в хостнейм, хостнейм должен оканчиваться на домен вендора, затем резолвится обратно к тому же IP. Любой сбойный шаг — это спуфер.
Forward-confirm reverse DNS. Скрапер может заявить хостнейм, но не заставит DNS вендора резолвиться обратно к его IP.

Скрапер может заявить хостнейм. Он не заставит DNS вендора forward-резолвиться к его собственному IP. Обе стороны должны сойтись.

Некоторые вендоры также публикуют сырые диапазоны для сверки:

Где происхождение ломается — три трещины, ни одной мелкой

Публикуют не все. Это меня удивило: Anthropic не публикует IP-диапазоны для ClaudeBot. IP в их доках — для API Claude, а не для краулера. Их же рекомендация для опознания ClaudeBot — User-Agent плюс reverse-DNS по *.anthropic.com. То есть для одного из трёх крупнейших краулеров «просто сверь с опубликованным диапазоном» — не вариант, которого не существует.

Google не разделяет обучающий трафик по IP. Google-Extended — контроль для обучения Gemini и AI Overviews — это токен robots.txt, а не набор IP. Никакого google-extended.json нет. Ты можешь разрешить или запретить его в robots.txt, но не отличишь на сетевом уровне. IP-проверка до него вообще не дотягивается.

Ротация. Это самая острая трещина из всех. Устаревший allowlist и 20-минутное окно 403 — оба реальная цена, а «просто чаще поллить JSON» — пластырь на дизайне, который вообще не должен был требовать поллинга.

Каждый опубликованный диапазон — снимок движущейся цели. Вендор ротирует или выкатывает новый блок с опозданием, и ты выбираешь между allowlist, который уже неверен, и окном, где легитимные краулеры едят 403. Ты больше не проверяешь личность. Ты нянчишь CIDR-блоки и надеешься, что JSON актуален.

Ответ 3 — доказательство (Web Bot Auth)

Вот тут модель доверия меняет форму, а не просто становится придирчивее.

Web Bot Auth — IETF-драфт под руководством Cloudflare (draft-meunier-web-bot-auth-architecture, поверх RFC 9421 HTTP Message Signatures) — заставляет каждый краулер подписывать свои запросы Ed25519-ключом. Публичный ключ лежит в well-known каталоге на собственном домене вендора. Ты проверяешь подпись. Личность доказана криптографией, а не выведена из того, откуда пришёл пакет.

Сдвиг и есть вся суть: от «откуда пришло это соединение» к «можешь ли доказать, что владеешь ключом». Это переживает ротацию. Ему всё равно, из какого дата-центра ушёл запрос. Никаких CIDR нянчить, никакого JSON поллить.

И это реально, и движется быстро:

  • Встроено в программу Cloudflare Verified Bots с каталогом Signed Agents
  • Агент ChatGPT был в первом подписанном когорте, 2025
  • AWS WAF добавил поддержку Web Bot Auth в конце 2025, автоматически пропуская проверенных агентов

Статус, честно: активный IETF-драфт, а не ратифицированный стандарт. Но раз Cloudflare, OpenAI, Anthropic и AWS двигаются в ногу, это уже де-факто направление.

Где доказательство ломается

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

Так почему просто не подождать, пока подписи победят?

Потому что подписи отвечают на вопрос уже, чем кажется. Переформулировка, которая всё для меня прояснила: подписи переносят вопрос с «кто ты» на «что ты делаешь».

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

А значит, под всем остальным всегда есть пол: поведение. Рейт-лимиты, паттерны запросов, за чем клиент тянется, оказавшись за дверью. Проверка даёт имя. Поведение решает, позволят ли имени и дальше вести себя как имя.

Модель: три гейта, а не один

Расставь три ответа по порядку — и они перестают конкурировать. Они складываются.

  1. Подписан? Проверь подпись → пусти по быстрому пути. (Web Bot Auth — доказательство)
  2. Не подписан, но заявляет известный краулер? Reverse-DNS + forward-подтверждение или опубликованный диапазон. (IP — происхождение)
  3. Прошёл любой гейт — теперь смотри за ним. Рейт-лимиты и поведение, всегда включены, для всех. (пол)
Проверка тремя гейтами: запрос сперва проверяется на подпись Web Bot Auth, затем на IP-происхождение через reverse-DNS, затем падает на всегда включённый слой поведения, который следит и за разрешённым трафиком. Личность доказывает «кто»; только поведение доказывает «что».
Три гейта, а не один: доказательство, затем происхождение, затем всегда включённый пол поведения. Личность доказывает «кто»; только поведение — «что».

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

Как ловить фейк, пока мир догоняет

Пока подписи не повсеместны, бóльшая часть работы — ловить лжецов по User-Agent. Признаки устойчивы:

  • Reverse-резолвится в общий хост (Hetzner, OVH, DigitalOcean) без совпадения с вендором
  • NXDOMAIN — reverse-DNS вообще нет
  • Идёт сразу на /admin, /.env, /wp-login — настоящие краулеры читают контент, а не секреты
  • Сотни запросов в минуту, без Crawl-Delay
  • Опечатка в имени: GPT-Bot или несуществующая версия (ClaudeBot/2.x)

Ни один не доказательство сам по себе. Вместе — скрапер с чужим бейджем.

Правило, которое я вынес

Вся прогрессия — одна идея, всё честнее к себе самой:

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

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

Я это ещё не построил. Когда построю — подписи первыми, IP как фолбэк, поведение снизу, — и опишу, что сломалось, потому что что-то ломается всегда.

Подробнее

Читайте также