如何在 2026 年繞過 Cloudflare(而不燒掉資料中心 IP)

發佈於 2026年5月27日 · 約 12 分鐘閱讀

網路上大多數「如何繞過 Cloudflare」的教學在 2024 年底就失效了。原因不是 Cloudflare 加了新防禦,而是那些舊防禦 — JA3 指紋識別與基本標頭檢查 — 被替換成了新一代,足以打破每一條捷徑。本指南解釋 Cloudflare 在 2026 年實際上檢查什麼、為什麼 cloudscraperundetected-chromedriver 與大多數「stealth」外掛會失敗,以及那套在正式環境中仍然有效的四層配方。

先把誠實的結論講在前頭:沒有單一妙招。可靠地繞過 Cloudflare 需要對的 IP、對的 TLS 指紋、對的 HTTP/2 框架順序,以及(對 Bot Management 層級而言)一個真正的瀏覽器。其中任何一項弄錯,你都會在請求抵達源伺服器之前就在邊緣過濾器上失敗。

Cloudflare 在 2026 年實際上檢查什麼

Cloudflare 的機器人偵測在邊緣以一連串過濾器的流水線運作。每個請求都依序通過它們。最早拒絕的那個過濾器勝出,這意味著一個請求可能光憑 IP 信譽就失敗,根本還沒檢查任何指紋或標頭。

1. IP 信譽(ASN + 濫用歷史)

這是第一個、也最便宜的檢查。Cloudflare 維護一個以 ASN(自治系統號碼)為鍵的資料庫。屬於知名雲端供應商的 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. JA4 TLS 指紋

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 的函式庫都可被偵測。這包括 requestsaiohttphttpx(預設設定),以及任何建構於它們之上的「bypass」包裝。

Free tool · no signup

看看 Cloudflare 從你這裡讀到的確切 TLS 指紋

用你的抓取器(curl、requests、你的無頭瀏覽器)打它,它會回傳 JA3/JA4 雜湊、它看起來像哪個函式庫,以及它是否會被標記 — 就是上面描述的同一個檢查。

檢查我的指紋 →

指紋乾淨卻還是被擋?是你的 IP 信譽。取得 500M免費流量,30 秒內開好一個住宅 proxy →

3. HTTP/2 框架順序與偽標頭序列

HTTP/2 連線承載 settings 框架、視窗更新、優先權框架與 headers 框架。瀏覽器以特定的順序、帶著特定的值送出這些。Chrome 124 送出一個帶著這些確切值的初始 SETTINGS 框架,接著是一個 WINDOW_UPDATE,然後是 HEADERS。Python 的 httpx 在啟用 HTTP/2 時送出不一樣的 settings 載荷,並略過了 Chrome 會包含的優先權框架。

HTTP/2 的偽標頭順序也會洩漏身分。Chrome 以 :method:authority:scheme:path 這個順序送出。Firefox 送的是 :method:path:authority:scheme。大多數 Python 與 Go 函式庫則按字母順序序列化它們。Cloudflare 會把這個順序與所宣告 User-Agent 的預期模式比對,並標記不符的情形。

4. 標頭順序與大小寫

HTTP/1.1 標頭會保留插入順序。真正的 Chrome 以一個固定順序送出標頭:HostConnectionCache-Controlsec-ch-uasec-ch-ua-mobilesec-ch-ua-platformUpgrade-Insecure-RequestsUser-AgentAcceptSec-Fetch-SiteSec-Fetch-ModeSec-Fetch-UserSec-Fetch-DestAccept-EncodingAccept-Language。Python 的 requests 會重新排序它們,有時還會用不同的大小寫。就算你手動以正確的順序設定標頭也沒用,因為底層的函式庫會重新排序它們。

5. JavaScript 挑戰(Managed Challenge)

如果前面的過濾器都通過了但分數仍可疑,Cloudflare 會送出一個 JavaScript 挑戰。那段腳本會從瀏覽器環境的值(canvas 雜湊、WebGL renderer、audio context、navigator 屬性、時序量測)計算出一個 token,並透過 XHR 提交。沒有任何 HTTP 客戶端能解開它。你需要一個真正的瀏覽器,而且那個瀏覽器必須看起來像真的(沒有 navigator.webdriver = true、沒有缺漏的屬性)。

6. 行為訊號(僅 Bot Management Enterprise)

在 Bot Management 層級,Cloudflare 透過一段持續運行的腳本收集滑鼠移動、捲動速度、點擊時機與按鍵動態。一個載入頁面後就立刻抓取、從未移動滑鼠的無頭瀏覽器,會在數秒內被偵測到。真實使用者會無規律地移動、停頓、重讀。機器人則線性捲動、像素級精準地點擊。

為什麼大多數 2024 年代的繞過工具都死了

那些撐起 2021-2024 抓取的捷徑工具全都共享同一個失敗模式:它們修補了可見的表面,卻沒修補底層的 TLS 堆疊。

工具它修補什麼為什麼在 2026 年失敗
cloudscraperJS 挑戰解算器(舊版)Cloudflare 在 2023 年改用 Turnstile;舊版挑戰已棄用
undetected-chromedriver修補 Selenium 的洩漏旗標JA4 仍從底層的 chromedriver TLS 洩漏;navigator.webdriver 只是 40 多個訊號之一
selenium-stealth注入偽造的 JS 屬性Cloudflare 從 C++ 層讀取,而非 JS;偽造會被偵測為不一致
FlareSolverr包裝 Chromium 來做一次性的挑戰解算cf_clearance 綁定到解算器的 IP;換成新 proxy 會立刻使 token 失效
標準 puppeteer-extra-plugin-stealth修補約 17 個偵測點Cloudflare 在 2024-2025 加了約 12 個新檢查,外掛沒涵蓋

模式很清楚:那些包裝真實瀏覽器並修補已知洩漏的工具,會在幾個月內就輸掉這場軍備競賽。那些模擬瀏覽器 TLS 堆疊的工具(curl_cffi、tls-client)之所以存活下來,是因為它們更貼近底層線路。

那套仍然有效的四層配方

一套在 2026 年有效的繞過需要全部四層。略過任何一層都會把成功率降到個位數。

第 1 層:住宅或行動 IP

對任何跑著 Cloudflare Pro 或以上的站台而言,這沒得商量。IP 信譽過濾器會在 TLS 握手完成之前就拒絕資料中心 ASN。使用帶黏性工作階段的住宅 proxy,至少維持 10 分鐘,好讓 cf_clearance cookie 存活下來。

成本現實:住宅 $2/GB 跟資料中心 $0.8/GB 比起來看似昂貴。但在 Cloudflare 保護的目標上,資料中心成功率低於 1%,而住宅是 88-94%。每個成功頁面的實際成本:住宅 $0.0036、資料中心 $0.10。對受保護的目標而言,住宅便宜了 27-28 倍,只有在未受保護的目標上才會輸。

第 2 層:真實瀏覽器 TLS 指紋

使用 curl_cffi(Python)或 tls-client(Go/Python)。兩者都連結到一個修改過的 BoringSSL,它帶著 Chrome 確切的加密順序、擴充清單與 ALPN 值。

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 完全相同。把它和住宅 proxy 搭配,你就能通過前兩個過濾器。

第 3 層:與所模仿瀏覽器相符的標頭順序

當你使用 impersonate 時,curl_cffi 會自動以 Chrome 的順序設定標頭。如果你加上自訂標頭,把它們附加在尾端,而不要插在中間。避免設定真正的 Chrome 不會送出的標頭(例如,在一般導覽上設 X-Requested-With)。

至於 Accept-Language,要讓它與 proxy 的地理位置相符。一個美國住宅 IP 送出 Accept-Language: zh-CN,zh;q=0.9 是個微小但真實的訊號。美國 IP 用 en-US,en;q=0.9、德國 IP 用 de-DE,de;q=0.9,依此類推。這是少數你能免費修正的訊號之一。

第 4 層:應付 JS 挑戰的真實瀏覽器(必要時)

如果目標觸發了 Managed Challenge(你在回應本體看到一個 CF 挑戰頁面),光靠 curl_cffi 無法解開它。改用搭配打過修補的 Chromium 的 Playwright。

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 is now in context.cookies()
    cookies = context.cookies()
    cf_clearance = next((c for c in cookies if c["name"] == "cf_clearance"), None)
    browser.close()

使用 rebrowser-playwright 而非標準的 playwright。它修補了 Cloudflare 用來偵測無頭自動化的那些 CDP 執行期洩漏(Runtime.enable、把 CDP 指令暴露給頁面)。挑戰通過後,從 cookie 取出 cf_clearance,把它交回給 curl_cffi 來跑真正的抓取迴圈。瀏覽器每個工作階段只需要用一次,而不是每次請求都用。

成本算式:為什麼住宅在受保護的目標上勝出

在 Cloudflare 保護的站台上,「用最便宜的 proxy」這個直覺幾乎總是錯的。用真實數字把算式走一遍。

假設:平均 HTML 頁面 500KB、總共抓取 100,000 頁、目標使用啟用了 Bot Fight Mode 的 Cloudflare Pro。

設定頻寬成本成功率每次成功的請求數總成本每頁成本
資料中心 $0.8/GB + requests $0.0005 / req 0.5% 200 $10,000 $0.10
資料中心 $0.8/GB + curl_cffi $0.0005 / req 3% 33 $1,650 $0.0165
住宅 $2/GB + requests $0.0033 / req 40% 2.5 $825 $0.0083
住宅 $2/GB + curl_cffi $0.0033 / req 92% 1.09 $360 $0.0036
住宅 $2/GB + Playwright(rebrowser) $0.017 / req(assets + 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):
    """One-shot Playwright call to solve the challenge and extract 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):
    """Reuse the same session_id (sticky IP) for all requests."""
    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 expired; re-solve
            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

# Usage
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 提供動態住宅 proxy,橫跨 240+ 國家的 90M+ IP、最長 60 分鐘的黏性工作階段,以及從 $2/GB 起的國家級定位。行動 IP 請見動態行動 proxy。兩者都能直接搭配 curl_cffi、tls-client、Playwright、Puppeteer、Selenium,以及任何支援 HTTP/SOCKS5 proxy 的 HTTP 客戶端開箱即用。

延伸閱讀:黏性 vs 輪換 Proxy 工作階段深入說明工作階段設定。為 AI 代理人準備的 Proxy解釋與 Cloudflare 繞過工作流程高度重疊的 AI 代理人使用情境。

用真實的住宅 IP 測試這套配方

取得 500M免費流量。在投入之前,先用 curl_cffi + 黏性住宅組合對你的目標跑跑看。

開始免費試用

適用於所有 IP 產品 · 龐大的節點池隨時可用

立即註冊,儲值最高可享 100% 返現

新用戶註冊即送 500M免費流量,首次儲值另有贈金。優惠限時供應。