Как обойти Cloudflare в 2026 (не спалив дата-центровые IP)

Опубликовано 27 мая 2026 г. · ≈12 мин чтения

Большинство туториалов «как обойти Cloudflare» в интернете перестали работать в конце 2024 года. Причина не в том, что Cloudflare добавил новые защиты. А в том, что старые защиты — JA3-фингерпринтинг и базовые проверки заголовков — сменились новым поколением, которое ломает любой быстрый трюк. Этот гайд объясняет, что Cloudflare реально проверяет в 2026 году, почему cloudscraper, undetected-chromedriver и большинство «stealth»-плагинов проваливаются, и приводит четырёхслойный рецепт, который всё ещё работает в продакшене.

Честный итог сразу: единого трюка нет. Надёжный обход Cloudflare требует правильного IP, правильного TLS-фингерпринта, правильного порядка HTTP/2-фреймов и (на уровне Bot Management) настоящего браузера. Ошибитесь в любом из этих пунктов — и вы провалите фильтр на границе ещё до того, как ваш запрос дойдёт до origin-сервера.

Что Cloudflare реально проверяет в 2026 году

Детекция ботов в Cloudflare работает как конвейер фильтров на границе сети. Каждый запрос проходит их по порядку. Побеждает самый ранний фильтр, который отклоняет запрос — то есть запрос может провалиться уже на репутации IP, прежде чем будут изучены хоть один фингерпринт или заголовок.

1. Репутация IP (ASN + история злоупотреблений)

Это первая и самая дешёвая проверка. Cloudflare держит базу с ключом по ASN (Autonomous System Number). ASN известных облачных провайдеров (AWS AS16509, GCP AS15169, Azure AS8075, OVH AS16276, DigitalOcean AS14061, Hetzner AS24940, Vultr AS20473) под максимальным подозрением. Даже с идеальным фингерпринтом браузерного уровня запрос с этих ASN считается виновным, пока не доказано обратное.

Резидентные ASN (Comcast AS7922, Verizon AS701, China Telecom AS4134, BT AS2856) считаются легитимными. Запрос с резидентного IP с топорным Python-фингерпринтом всё равно может пройти, тогда как запрос с дата-центрового IP с идеальным фингерпринтом Chrome получит челлендж или блок.

2. TLS-фингерпринт JA4

JA4 — преемник JA3 от 2023 года, выпущенный FoxIO. Он хеширует конкретные поля TLS ClientHello: версию TLS, наборы шифров (по порядку), расширения (по порядку), ALPN-протоколы, алгоритмы подписи и поддерживаемые группы. На выходе — детерминированный фингерпринт вроде t13d1516h2_8daaf6152771_b1ff8ab2d16f.

Настоящий Chrome 124 выдаёт один конкретный JA4. Настоящий Firefox 124 — другой. Python-библиотека requests (использующая urllib3 и OpenSSL) выдаёт JA4, который не эмитит ни один реальный браузер, потому что порядок шифров и список расширений не совпадают ни с Chrome, ни с Firefox. Cloudflare помечает этот паттерн ещё до разбора любого HTTP-заголовка.

Вывод: любая библиотека, использующая системный OpenSSL или штатный Python TLS, детектируема. Сюда входят requests, aiohttp, httpx (дефолтная конфигурация) и любая «обходная» обёртка поверх них.

Бесплатный инструмент · без регистрации

Узнайте, какой TLS-фингерпринт Cloudflare считывает с вас

Стукните по нему своим скрапером (curl, requests, ваш headless-браузер) — и он вернёт хеш JA3/JA4, на какую библиотеку он похож и попал бы ли под флаг — та самая проверка, что описана выше.

Проверить мой фингерпринт →

Фингерпринт чистый, а вас всё равно блокируют? Дело в репутации IP. Получите $5 бесплатного баланса и поднимите резидентный прокси за 30 секунд →

3. Порядок HTTP/2-фреймов и последовательность псевдозаголовков

HTTP/2-соединения несут SETTINGS-фреймы, обновления окна (WINDOW_UPDATE), PRIORITY-фреймы и HEADERS-фреймы. Браузеры отправляют их в определённом порядке с определёнными значениями. Chrome 124 шлёт начальный SETTINGS-фрейм с конкретными значениями, затем WINDOW_UPDATE, затем HEADERS. Python-библиотека httpx с включённым HTTP/2 шлёт другой SETTINGS-пейлоад и пропускает PRIORITY-фреймы, которые включает Chrome.

Порядок псевдозаголовков HTTP/2 тоже выдаёт личность. Chrome шлёт :method, :authority, :scheme, :path именно в таком порядке. Firefox шлёт :method, :path, :authority, :scheme. Большинство библиотек на Python и Go сериализуют их по алфавиту. Cloudflare сверяет порядок с ожидаемым паттерном для заявленного User-Agent и помечает несоответствия.

4. Порядок и регистр заголовков

Заголовки HTTP/1.1 сохраняют порядок вставки. Настоящий Chrome шлёт заголовки в фиксированном порядке: Host, Connection, Cache-Control, sec-ch-ua, sec-ch-ua-mobile, sec-ch-ua-platform, Upgrade-Insecure-Requests, User-Agent, Accept, Sec-Fetch-Site, Sec-Fetch-Mode, Sec-Fetch-User, Sec-Fetch-Dest, Accept-Encoding, Accept-Language. Python-библиотека requests переупорядочивает их и иногда меняет регистр. Даже ручная установка заголовков в правильном порядке не помогает, потому что нижележащая библиотека их пересортировывает.

5. JavaScript-челлендж (Managed Challenge)

Если предыдущие фильтры пройдены, но оценка всё ещё подозрительна, Cloudflare отдаёт JavaScript-челлендж. Скрипт вычисляет токен из значений окружения браузера (хеш canvas, рендерер WebGL, аудиоконтекст, свойства navigator, замеры таймингов) и отправляет его через XHR. Ни один HTTP-клиент это не решит. Нужен настоящий браузер, и браузер должен выглядеть настоящим (никакого navigator.webdriver = true, никаких отсутствующих свойств).

6. Поведенческие сигналы (только Bot Management Enterprise)

На уровне Bot Management Cloudflare собирает движения мыши, скорость скролла, тайминг кликов и динамику нажатий клавиш через постоянно работающий скрипт. Headless-браузер, который грузит страницу и сразу начинает скрапить, ни разу не двинув мышью, детектируется за секунды. Реальные пользователи двигаются хаотично, делают паузы и перечитывают. Боты скроллят линейно и кликают идеально по пикселям.

Почему большинство обходных инструментов эпохи 2024 мертвы

Быстрые инструменты, питавшие скрапинг 2021–2024, объединяет один режим отказа: они патчат видимую поверхность, но не нижележащий TLS-стек.

ИнструментЧто патчитПочему провалится в 2026
cloudscraperРешатель JS-челленджей (legacy)Cloudflare перешёл на Turnstile в 2023; старые челленджи устарели
undetected-chromedriverПатчит флаги утечек SeleniumJA4 всё равно течёт из TLS нижележащего chromedriver; navigator.webdriver — лишь один из 40+ сигналов
selenium-stealthПодставляет фейковые JS-свойстваCloudflare читает из C++-слоя, а не из JS; подмена детектируется как несогласованность
FlareSolverrОборачивает Chromium для разового решения челленджаcf_clearance привязан к IP решателя; свежий прокси мгновенно аннулирует токен
Штатный puppeteer-extra-plugin-stealthПатчит ~17 точек детекцииCloudflare добавил ~12 новых проверок в 2024–2025, не покрытых плагином

Паттерн очевиден: инструменты, которые оборачивают настоящий браузер и патчат известные утечки, проигрывают гонку вооружений за месяцы. Инструменты, симулирующие TLS-стек браузера (curl_cffi, tls-client), выжили, потому что сидят ближе к проводу.

Четырёхслойный рецепт, который всё ещё работает

Обход, работающий в 2026 году, нуждается во всех четырёх слоях. Пропуск любого из них роняет долю успеха до единиц процентов.

Слой 1: резидентный или мобильный IP

Это безусловное требование для любого сайта на Cloudflare Pro и выше. Фильтр репутации IP отклоняет дата-центровые ASN ещё до завершения TLS-рукопожатия. Используйте резидентный прокси со sticky-сессией минимум на 10 минут, чтобы cookie cf_clearance пережил.

Реальность затрат: Резидентные по $6.8/GB выглядят дорого рядом с дата-центровыми по $1/GB. Но на цели за Cloudflare доля успеха у дата-центровых ниже 1%, а у резидентных — 88–94%. Фактическая стоимость одной успешной страницы: резидентные $0.0036, дата-центровые $0.10. На защищённых целях резидентные дешевле в 27–28 раз и проигрывают только на незащищённых.

Слой 2: TLS-фингерпринт настоящего браузера

Используйте curl_cffi (Python) или tls-client (Go/Python). Оба линкуются с модифицированным BoringSSL, который несёт точный порядок шифров, список расширений и значения ALPN от Chrome.

from curl_cffi import requests

response = requests.get(
    "https://target.com/api/products",
    impersonate="chrome124",
    proxies={"https": "http://user-session-abc123:[email protected]:10001"},
    timeout=30,
)
print(response.status_code, len(response.text))

Параметр impersonate="chrome124" подменяет TLS-стек так, что ClientHello совпадает с Chrome 124 байт в байт. Хеш JA4 будет идентичен настоящей установке Chrome 124. Сочетайте его с резидентным прокси — и вы проходите первые два фильтра.

Слой 3: порядок заголовков под имитируемый браузер

curl_cffi сам выставляет заголовки в порядке Chrome, когда вы используете impersonate. Если добавляете свои заголовки, дописывайте их в конец, а не вставляйте в середину. Избегайте заголовков, которые настоящий Chrome не отправил бы (например, X-Requested-With при обычной навигации).

Для Accept-Language подгоняйте его под географию прокси. Американский резидентный IP, шлющий Accept-Language: zh-CN,zh;q=0.9, — небольшой, но реальный сигнал. Используйте en-US,en;q=0.9 для американских IP, de-DE,de;q=0.9 для немецких и так далее. Это один из немногих сигналов, который можно поправить бесплатно.

Слой 4: настоящий браузер для JS-челленджей (когда нужно)

Если цель триггерит Managed Challenge (в теле ответа вы видите страницу челленджа CF), одного curl_cffi мало. Переключайтесь на Playwright с пропатченным Chromium.

from playwright.sync_api import sync_playwright
from rebrowser_playwright.sync_api import sync_playwright as rebrowser_sync

with rebrowser_sync() as p:
    browser = p.chromium.launch(
        headless=True,
        proxy={
            "server": "http://gate.jibaoproxy.com:10001",
            "username": "user-session-abc123",
            "password": "pass",
        },
    )
    context = browser.new_context(
        user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36",
        viewport={"width": 1920, "height": 1080},
        locale="en-US",
        timezone_id="America/New_York",
    )
    page = context.new_page()
    page.goto("https://target.com/", wait_until="networkidle")
    # cf_clearance теперь в context.cookies()
    cookies = context.cookies()
    cf_clearance = next((c for c in cookies if c["name"] == "cf_clearance"), None)
    browser.close()

Используйте rebrowser-playwright вместо штатного playwright. Он патчит утечки CDP-рантайма (Runtime.enable, раскрытие CDP-команд странице), которые Cloudflare читает для детекции headless-автоматизации. После прохождения челленджа извлеките cf_clearance из cookie и передайте его обратно в curl_cffi для основного цикла скрапинга. Браузер нужен один раз на сессию, а не на каждый запрос.

Математика затрат: почему резидентные выигрывают на защищённых целях

Инстинкт взять самый дешёвый прокси почти всегда ошибочен на сайтах за Cloudflare. Пройдёмся по математике с реальными цифрами.

Допущения: средняя HTML-страница 500 КБ, всего скрапим 100 000 страниц, цель использует Cloudflare Pro с включённым Bot Fight Mode.

СвязкаСтоимость трафикаДоля успехаЗапросов на успехИтогоЦена за страницу
Дата-центр $1/GB + requests $0.0005 / запрос 0.5% 200 $10,000 $0.10
Дата-центр $1/GB + curl_cffi $0.0005 / запрос 3% 33 $1,650 $0.0165
Резидентные $6.8/GB + requests $0.0033 / запрос 40% 2.5 $825 $0.0083
Резидентные $6.8/GB + curl_cffi $0.0033 / запрос 92% 1.09 $360 $0.0036
Резидентные $6.8/GB + Playwright (rebrowser) $0.017 / запрос (ассеты + JS) 96% 1.04 $1,700 $0.017

Два вывода, которые стоит отметить:

  1. Резидентные + curl_cffi — победитель по цене за успех с отрывом в 3–18 раз над любой другой связкой. Интуиция, что резидентные «дорогие», верна в $/GB, но ошибочна в $/успешную-страницу.
  2. Playwright дороже на запрос, потому что качает весь бандл ассетов (CSS, JS, картинки). Используйте его только для одного запроса, решающего челлендж, а затем передавайте cf_clearance в curl_cffi.

Практический рецепт: скрапер продакшен-уровня

Это паттерн, который мы рекомендуем клиентам, скрапящим цели за Cloudflare в масштабе. Он минимизирует использование Playwright (медленного и дорогого) и максимизирует использование curl_cffi (быстрого и дешёвого).

from curl_cffi import requests as cf_requests
from rebrowser_playwright.sync_api import sync_playwright

PROXY_USER_FMT = "user-session-{sid}"
PROXY_HOST = "http://gate.jibaoproxy.com:10001"
PROXY_PASS = "your_password"

def get_cf_clearance(target_url, session_id):
    """Разовый вызов Playwright, чтобы решить челлендж и извлечь cf_clearance."""
    with sync_playwright() as p:
        browser = p.chromium.launch(
            headless=True,
            proxy={"server": PROXY_HOST,
                   "username": PROXY_USER_FMT.format(sid=session_id),
                   "password": PROXY_PASS},
        )
        ctx = browser.new_context(user_agent="Mozilla/5.0 ... Chrome/124.0.0.0 Safari/537.36")
        page = ctx.new_page()
        page.goto(target_url, wait_until="networkidle", timeout=45000)
        cookies = ctx.cookies()
        browser.close()
    return {c["name"]: c["value"] for c in cookies}

def scrape_with_clearance(urls, session_id, cookies):
    """Переиспользуем один session_id (sticky IP) для всех запросов."""
    proxy = f"http://{PROXY_USER_FMT.format(sid=session_id)}:{PROXY_PASS}@gate.jibaoproxy.com:10001"
    out = []
    for url in urls:
        r = cf_requests.get(
            url,
            impersonate="chrome124",
            proxies={"https": proxy},
            cookies=cookies,
            timeout=30,
        )
        if r.status_code == 200:
            out.append((url, r.text))
        elif r.status_code in (403, 503) and "challenge" in r.text.lower():
            # cf_clearance истёк; решаем заново
            cookies = get_cf_clearance(url, session_id)
            r = cf_requests.get(url, impersonate="chrome124",
                                proxies={"https": proxy}, cookies=cookies)
            out.append((url, r.text))
    return out, cookies

# Использование
session_id = "scrape-job-2026-05-27"
cookies = get_cf_clearance("https://target.com/", session_id)
results, cookies = scrape_with_clearance(target_urls, session_id, cookies)

Ключевые моменты этого рецепта:

Когда стоит сдаться

Некоторые развёртывания Cloudflare нельзя обойти за любую разумную цену. Если видите эти сигналы, меняйте стратегию (используйте API, договоритесь с владельцем сайта или купите данные) вместо того, чтобы жечь бюджет на обход, который никогда не стабилизируется.

Краткая шпаргалка

Уровень целиРецептОжидаемая доля успеха
CF Free / Pro (без Bot Fight)Дата-центр + curl_cffi60–75%
CF Free / Pro + Bot Fight ModeРезидентные + curl_cffi85–93%
CF BusinessРезидентные + curl_cffi + изредка Playwright80–90%
CF Business + TurnstileРезидентные + rebrowser-playwright (каждый запрос)70–85%
CF Enterprise + Bot ManagementМобильные резидентные + rebrowser + симуляция поведения30–60%
CF Enterprise + Bot Management + кастомный WAFНе скрапить; идти через API или партнёрство<10%

JIBAO Proxy предлагает динамические резидентные прокси с более чем 90 млн IP в 240+ странах, sticky-сессиями до 60 минут и таргетингом по странам от $6.8/GB. Для мобильных IP см. динамические мобильные прокси. Оба работают из коробки с curl_cffi, tls-client, Playwright, Puppeteer, Selenium и любым HTTP-клиентом, поддерживающим прокси HTTP/SOCKS5.

По теме: Sticky vs ротируемые сессии прокси подробно разбирает настройку сессий. Прокси для AI-агентов объясняет сценарий с AI-агентами, который сильно пересекается с workflow обхода Cloudflare.

Протестируйте рецепт на настоящих резидентных IP

Получите $5 бесплатного баланса. Прогоните связку curl_cffi + sticky-резидентные против своей цели, прежде чем вкладываться.

Начать бесплатно

Все IP-продукты · огромный пул узлов, доступных в любой момент

Зарегистрируйтесь сейчас и получите до 100% кэшбэка на пополнение

Новым пользователям — 5U при регистрации, бонус к первому пополнению. Акция ограничена по времени.