Hầu hết các hướng dẫn "cách vượt qua Cloudflare" trên internet đã ngừng hoạt động vào cuối năm 2024. Lý do không phải là Cloudflare đã bổ sung các tuyến phòng thủ mới. Mà là các tuyến phòng thủ cũ, như JA3 fingerprinting và kiểm tra header cơ bản, đã được thay thế bằng một thế hệ mới phá vỡ mọi mẹo tắt. Bài hướng dẫn này giải thích Cloudflare thực sự kiểm tra những gì vào năm 2026, tại sao cloudscraper, undetected-chromedriver, và hầu hết các plugin "stealth" đều thất bại, cùng công thức bốn lớp vẫn hoạt động trong môi trường production.
Tóm tắt thẳng thắn ngay từ đầu: không có một mẹo duy nhất nào cả. Để vượt qua Cloudflare một cách đáng tin cậy, bạn cần đúng IP, đúng TLS fingerprint, đúng thứ tự frame HTTP/2, và (đối với tầng Bot Management) một trình duyệt thật. Sai bất kỳ điều nào trong số này và bạn sẽ trượt bộ lọc tại edge trước khi request của bạn kịp chạm tới origin server.
Cơ chế phát hiện bot của Cloudflare chạy như một chuỗi (pipeline) các bộ lọc tại edge. Mỗi request đi qua chúng theo thứ tự. Bộ lọc từ chối sớm nhất sẽ thắng, nghĩa là một request có thể trượt chỉ vì danh tiếng IP, trước khi bất kỳ fingerprint hay header nào được xem xét.
Đây là bước kiểm tra đầu tiên và rẻ nhất. Cloudflare duy trì một cơ sở dữ liệu được lập chỉ mục theo ASN (Autonomous System Number). Các ASN thuộc về những nhà cung cấp cloud nổi tiếng (AWS AS16509, GCP AS15169, Azure AS8075, OVH AS16276, DigitalOcean AS14061, Hetzner AS24940, Vultr AS20473) sẽ bị soi xét gắt gao nhất. Ngay cả với một fingerprint hoàn hảo ở cấp độ trình duyệt, một request bắt nguồn từ các ASN này vẫn bị coi là có tội cho đến khi được chứng minh là vô tội.
Các ASN dân cư (Comcast AS7922, Verizon AS701, China Telecom AS4134, BT AS2856) được mặc định là hợp pháp. Một request từ IP dân cư với fingerprint Python vụng về vẫn có thể vượt qua, trong khi một request từ IP trung tâm dữ liệu với fingerprint Chrome hoàn hảo lại bị thử thách hoặc chặn.
JA4 là phiên bản kế nhiệm năm 2023 của JA3, được FoxIO phát hành. Nó băm các trường TLS ClientHello cụ thể: phiên bản TLS, bộ mã hóa cipher (theo thứ tự), extension (theo thứ tự), giao thức ALPN, thuật toán chữ ký, và supported groups. Kết quả là một fingerprint xác định kiểu như t13d1516h2_8daaf6152771_b1ff8ab2d16f.
Chrome 124 thật tạo ra một JA4 cụ thể. Firefox 124 thật tạo ra một cái khác. Thư viện requests của Python (sử dụng urllib3 và OpenSSL) tạo ra một JA4 mà không trình duyệt thật nào từng phát ra, bởi vì thứ tự cipher và danh sách extension không khớp với cả Chrome lẫn Firefox. Cloudflare đánh dấu mẫu này trước khi phân tích bất kỳ HTTP header nào.
Hệ quả: mọi thư viện sử dụng OpenSSL của hệ thống hoặc TLS Python mặc định đều có thể bị phát hiện. Điều này bao gồm requests, aiohttp, httpx (cấu hình mặc định), và bất kỳ wrapper "bypass" nào được xây dựng dựa trên chúng.
Các kết nối HTTP/2 mang các settings frame, window update, priority frame, và headers frame. Trình duyệt gửi chúng theo một thứ tự cụ thể với các giá trị cụ thể. Chrome 124 gửi một SETTINGS frame ban đầu với chính xác các giá trị này, sau đó là một WINDOW_UPDATE, rồi đến HEADERS. httpx của Python khi bật HTTP/2 lại gửi một payload settings khác và bỏ qua các priority frame mà Chrome đưa vào.
Thứ tự pseudo-header HTTP/2 cũng làm lộ danh tính. Chrome gửi :method, :authority, :scheme, :path theo đúng thứ tự đó. Firefox gửi :method, :path, :authority, :scheme. Hầu hết các thư viện Python và Go serialize chúng theo thứ tự bảng chữ cái. Cloudflare so khớp thứ tự với mẫu kỳ vọng cho User-Agent được khai báo và đánh dấu những trường hợp không khớp.
Các header HTTP/1.1 giữ nguyên thứ tự chèn vào. Chrome thật gửi các header theo một thứ tự cố định: 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. Thư viện requests của Python sắp xếp lại chúng và đôi khi viết hoa theo cách khác. Ngay cả việc thiết lập header thủ công theo đúng thứ tự cũng không giúp ích, vì thư viện bên dưới vẫn sắp xếp lại chúng.
Nếu các bộ lọc trước đó được vượt qua nhưng điểm số vẫn đáng nghi, Cloudflare sẽ phục vụ một thử thách JavaScript. Đoạn script tính toán một token từ các giá trị môi trường trình duyệt (canvas hash, WebGL renderer, audio context, thuộc tính navigator, các phép đo thời gian) và gửi nó qua XHR. Không một HTTP client nào có thể giải được điều này. Bạn cần một trình duyệt thật, và trình duyệt đó phải trông như thật (không có navigator.webdriver = true, không thiếu thuộc tính nào).
Ở tầng Bot Management, Cloudflare thu thập chuyển động chuột, tốc độ cuộn, thời điểm click, và động lực gõ phím thông qua một đoạn script chạy liên tục. Một trình duyệt headless tải trang và lập tức cào dữ liệu mà không hề di chuyển chuột sẽ bị phát hiện trong vài giây. Người dùng thật di chuyển một cách thất thường, dừng lại, và đọc lại. Bot cuộn theo đường thẳng và click chính xác từng pixel.
Các công cụ tắt từng cung cấp sức mạnh cho việc cào dữ liệu giai đoạn 2021-2024 đều chung một điểm thất bại: chúng vá lớp bề mặt nhìn thấy được nhưng không vá tầng TLS bên dưới.
| Công cụ | Vá cái gì | Tại sao thất bại vào năm 2026 |
|---|---|---|
cloudscraper | Giải thử thách JS (legacy) | Cloudflare đã chuyển sang Turnstile vào năm 2023; các thử thách legacy bị khai tử |
undetected-chromedriver | Vá các cờ rò rỉ của Selenium | JA4 vẫn rò rỉ từ TLS của chromedriver bên dưới; navigator.webdriver chỉ là một trong hơn 40 tín hiệu |
selenium-stealth | Tiêm các thuộc tính JS giả mạo | Cloudflare đọc từ tầng C++, không phải JS; sự giả mạo có thể bị phát hiện vì không nhất quán |
FlareSolverr | Bọc Chromium để giải thử thách một lần | cf_clearance gắn với IP của solver; proxy mới làm token vô hiệu ngay lập tức |
puppeteer-extra-plugin-stealth bản gốc | Vá khoảng 17 điểm phát hiện | Cloudflare đã thêm khoảng 12 bước kiểm tra mới trong 2024-2025 mà plugin không bao phủ |
Mẫu hình rất rõ ràng: các công cụ bọc một trình duyệt thật và vá các điểm rò rỉ đã biết sẽ thua cuộc đua vũ trang trong vòng vài tháng. Các công cụ mô phỏng tầng TLS của trình duyệt (curl_cffi, tls-client) vẫn sống sót vì chúng nằm gần với đường truyền hơn.
Một giải pháp bypass hoạt động vào năm 2026 cần đủ cả bốn lớp. Bỏ qua bất kỳ lớp nào sẽ kéo tỷ lệ thành công xuống còn một con số.
Đây là điều không thể thương lượng đối với bất kỳ trang nào chạy Cloudflare Pro trở lên. Bộ lọc danh tiếng IP từ chối các ASN trung tâm dữ liệu trước khi quá trình TLS handshake hoàn tất. Hãy dùng một proxy dân cư với sticky session trong ít nhất 10 phút để cookie cf_clearance còn tồn tại.
Hãy dùng curl_cffi (Python) hoặc tls-client (Go/Python). Cả hai đều liên kết với một bản BoringSSL đã sửa đổi đi kèm với chính xác thứ tự cipher, danh sách extension, và các giá trị ALPN của 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))
Tham số impersonate="chrome124" hoán đổi tầng TLS để ClientHello khớp với Chrome 124 từng byte một. Hash JA4 sẽ giống hệt một bản cài Chrome 124 thật. Kết hợp nó với một proxy dân cư và bạn vượt qua hai bộ lọc đầu tiên.
curl_cffi tự động đặt header theo thứ tự của Chrome khi bạn dùng impersonate. Nếu bạn thêm header tùy chỉnh, hãy nối chúng vào cuối thay vì chèn vào giữa. Tránh đặt các header mà Chrome thật sẽ không gửi (ví dụ, X-Requested-With trong một lần điều hướng thông thường).
Đối với Accept-Language, hãy khớp nó với vị trí địa lý của proxy. Một IP dân cư Mỹ gửi Accept-Language: zh-CN,zh;q=0.9 là một tín hiệu nhỏ nhưng có thật. Dùng en-US,en;q=0.9 cho IP Mỹ, de-DE,de;q=0.9 cho IP Đức, và cứ thế. Đây là một trong số ít tín hiệu bạn có thể khắc phục miễn phí.
Nếu mục tiêu kích hoạt một Managed Challenge (bạn thấy một trang thử thách CF trong response body), riêng curl_cffi không thể giải được. Hãy chuyển sang Playwright với Chromium đã được vá.
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()
Hãy dùng rebrowser-playwright thay vì playwright bản gốc. Nó vá các điểm rò rỉ runtime của CDP (Runtime.enable, việc phơi bày các lệnh CDP ra trang) mà Cloudflare đọc để phát hiện tự động hóa headless. Sau khi thử thách được vượt qua, hãy trích xuất cf_clearance từ cookie và đưa nó lại cho curl_cffi để chạy vòng lặp cào dữ liệu thực sự. Trình duyệt chỉ cần một lần cho mỗi phiên, không phải cho mỗi request.
Bản năng dùng proxy rẻ nhất hầu như luôn sai trên các trang được Cloudflare bảo vệ. Hãy đi qua bài toán với những con số thực.
Giả định: trang HTML trung bình 500KB, cào tổng cộng 100.000 trang, mục tiêu dùng Cloudflare Pro với Bot Fight Mode được bật.
| Cấu hình | Chi phí băng thông | Tỷ lệ thành công | Số request mỗi lần thành công | Tổng chi phí | Chi phí mỗi trang |
|---|---|---|---|---|---|
| Trung tâm dữ liệu $0.8/GB + requests | $0.0005 / req | 0,5% | 200 | $10.000 | $0.10 |
| Trung tâm dữ liệu $0.8/GB + curl_cffi | $0.0005 / req | 3% | 33 | $1.650 | $0.0165 |
| Dân cư $2/GB + requests | $0.0033 / req | 40% | 2,5 | $825 | $0.0083 |
| Dân cư $2/GB + curl_cffi | $0.0033 / req | 92% | 1,09 | $360 | $0.0036 |
| Dân cư $2/GB + Playwright (rebrowser) | $0.017 / req (assets + JS) | 96% | 1,04 | $1.700 | $0.017 |
Hai phát hiện đáng lưu ý:
Đây là mẫu hình chúng tôi khuyến nghị cho những khách hàng cào các mục tiêu được Cloudflare bảo vệ ở quy mô lớn. Nó giảm thiểu việc dùng Playwright (vốn chậm và tốn kém) và tối đa hóa việc dùng curl_cffi (vốn nhanh và rẻ).
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)
Những điểm chính trong công thức này:
Một số triển khai Cloudflare không thể bị vượt qua ở bất kỳ mức chi phí hợp lý nào. Nếu bạn thấy những tín hiệu này, hãy đổi chiến lược (dùng API, hợp tác với chủ trang, hoặc mua dữ liệu) thay vì đốt ngân sách vào một giải pháp bypass sẽ không bao giờ ổn định.
| Tầng mục tiêu | Công thức | Tỷ lệ thành công kỳ vọng |
|---|---|---|
| CF Free / Pro (không Bot Fight) | Trung tâm dữ liệu + curl_cffi | 60-75% |
| CF Free / Pro + Bot Fight Mode | Dân cư + curl_cffi | 85-93% |
| CF Business | Dân cư + curl_cffi + thỉnh thoảng Playwright | 80-90% |
| CF Business + Turnstile | Dân cư + rebrowser-playwright (mỗi request) | 70-85% |
| CF Enterprise + Bot Management | Dân cư di động + rebrowser + mô phỏng hành vi | 30-60% |
| CF Enterprise + Bot Management + WAF tùy chỉnh | Đừng cào; theo đuổi API hoặc hợp tác | <10% |
JIBAO Proxy cung cấp proxy dân cư động với hơn 90 triệu IP trên hơn 240 quốc gia, sticky session lên đến 60 phút, và nhắm mục tiêu cấp quốc gia bắt đầu từ $2/GB. Đối với IP di động, xem proxy di động động. Cả hai đều hoạt động ngay lập tức với curl_cffi, tls-client, Playwright, Puppeteer, Selenium, và bất kỳ HTTP client nào hỗ trợ proxy HTTP/SOCKS5.
Đọc thêm: Sticky vs Rotating Proxy Sessions trình bày chi tiết về cấu hình phiên. Proxies for AI Agents giải thích trường hợp sử dụng AI agent, vốn trùng lắp rất nhiều với quy trình bypass Cloudflare.
Nhận 500MB lưu lượng miễn phí. Chạy tổ hợp curl_cffi + dân cư sticky trên mục tiêu của bạn trước khi cam kết.
Bắt Đầu Dùng Thử Miễn PhíNgười dùng mới nhận 500MB khi đăng ký, cùng tiền thưởng cho lần nạp đầu tiên. Ưu đãi có thời hạn.