跳转到主要内容
Guide

Cloudflare 错误 1020 拒绝访问:它意味着什么以及如何修复

2026-06-078 分钟阅读

你发出了一个请求,得到的不是页面,而是一个写着 "Error 1020: Access Denied"(错误 1020:拒绝访问)的 Cloudflare 页面。同一个站点在浏览器里加载正常,但你的脚本、爬虫,甚至你自己的后端却一再被弹回。感觉很随意,其实不然:1020 是一条防火墙规则确定性的、可预测的结果,一旦你知道是哪条规则触发的,通常也就知道该怎么修了。

本指南会准确解释错误 1020 的含义、触发它的那少数几种情形、如何诊断你究竟撞上了哪一种,以及针对合法自动化的具体修复方法。同时它也会坦诚地说明哪些情况是解算服务无能为力的。如果一个站点是故意屏蔽你所在的国家或 IP 段,任何工具都改变不了这一点,假装能办到只会浪费你的时间。

"Error 1020: Access Denied" 到底意味着什么

错误 1020 意味着目标站点上的一条 Cloudflare WAF(Web 应用防火墙)规则评估了你的请求,并匹配上了一条拦截规则。Cloudflare 用站点所有者的防火墙配置检验了你的请求,有某项匹配上了,于是请求在到达源服务器之前就被拒绝了。1020 这个代码是 Cloudflare 对"一条自定义防火墙/WAF 规则拦截了它"的通用标签。

这一点与验证码或 challenge 有重要区别。challenge 说的是"证明你是浏览器,然后你就能继续"。而 1020 说的是"一条规则判定你进不来",仅此而已。没有需要解算的组件,也没有需要获取的令牌。你能否越过它,完全取决于是哪条规则触发的,以及它为什么匹配上了你的请求。

两个请求可能都返回 1020,但原因完全不同:一个是因为规则针对高 bot 分,另一个是因为规则屏蔽了整个国家。前者可以在客户端修复,后者不能。所以第一件事永远是诊断,而不是蛮力硬闯。

什么会触发 1020

WAF 规则是按站点配置的,所以确切的触发因素各不相同,但实际上针对自动化的 1020 几乎总是出自以下其中之一:

  • IP 信誉或 ASN:规则屏蔽信誉分较差的 IP,或屏蔽属于云服务和主机服务商的自治系统编号(ASN)。来自 AWS、GCP、Hetzner、OVH 等的数据中心 IP 会很快触发这一条。
  • 地理 / 国家屏蔽:规则拒绝来自特定国家或地区的流量。如果你的代理出口位于被屏蔽的国家,那么无论请求头长什么样,你都会拿到 1020。
  • 被屏蔽或缺失的 User-Agent:规则常会屏蔽空的 User-Agent、明显的库默认值(如 python-requests/2.x 或 Go-http-client),或已知的爬虫字符串。
  • Referer / 防盗链规则:一条要求对某资源的请求必须来自站点自身域名的规则。直接访问且没有(或带着外部)Referer 头会被拦截。
  • 暴露的自动化信号:navigator.webdriver、无头浏览器的破绽,或不一致的 client hints,都可能匹配上一条专为抓 bot 设计的 managed 规则。
  • 缺失或无效的 cf_clearance:当站点运行了 challenge 而规则期望一个有效的 clearance cookie 时,没有它(或带着过期/不匹配的它)的请求会被拒绝。
  • 高 bot 分:Cloudflare 会给每个请求分配一个 bot 分,规则可以屏蔽所有低于某阈值的请求。这正是解算服务能够真正影响的触发项,因为它关乎你的请求看起来有多像 bot。

如何诊断是哪条规则触发的

在改动任何东西之前,先弄清楚你属于哪一类,因为修复方法各不相同,而且有些根本无法修复。按顺序逐步排查:

第一,更换你的出口 IP。用另一个国家的干净住宅 IP 发送同一个请求。如果数据中心 IP 拿到 1020,而你本国的住宅 IP 一路畅通,那你是被 IP/ASN 或地理规则抓住了。如果两者都同样失败,那 IP 多半不是全部原因。

第二,通过同一个代理用真实浏览器测试。如果在那个 IP 和地区上你的浏览器也拿到 1020,那这是 IP、ASN 或地理屏蔽,不是 bot 检测问题,任何请求头或指纹调整都帮不上忙。如果浏览器通过而你的脚本失败,那你触发的是 User-Agent、请求头、指纹或 bot 分规则。

第三,看看你发送了什么。在受防盗链保护的资源上缺失 Referer、库的默认 User-Agent,或在带 challenge 的路径上没有 cf_clearance,都会产生一个干净、可复现的 1020,而一旦你修好那一件事,它就会消失。

如何为合法自动化修复 1020

一旦你确定它是 bot 检测或请求头规则,而不是故意的地理/IP 封禁,修复方法就很直接,而且可以层层叠加。按工作量从小到大依次应用:

  • 使用干净的住宅代理。数据中心 IP 几乎会立刻触发 IP/ASN 规则。轮换的住宅或移动 IP 信任度高得多,能清除大多数基于信誉的 1020。
  • 发送真实、一致的浏览器请求头。一套完整、连贯的请求头(User-Agent、Accept、Accept-Language、Accept-Encoding、sec-ch-ua、sec-ch-ua-platform)按浏览器式顺序排列,且 User-Agent 与其余部分相匹配,胜过稀疏的库默认值。
  • 让 User-Agent 与请求的其余部分相匹配。一个 Chrome 的 User-Agent 配上声称是 Firefox 的 sec-ch-ua client hints,就是即时的破绽。让整个故事保持一致。
  • 通过真正通过 challenge 来获取有效的 cf_clearance。如果规则依赖 clearance cookie,你需要一个通过完成 challenge 赢得的真实 cookie,而不是伪造的值。
  • 避免已知不良的指纹。不要泄露 navigator.webdriver,不要运行明显无头的配置,也不要复用已被标记的 TLS/JA3 指纹。
  • 放慢速度。激进的请求速率会抬高你的 bot 分,可能把一个临界请求翻转成被拦截的请求。加入抖动并遵守合理的并发限制。

1020 与 1015、1010、1012 的区别

把所有 Cloudflare 错误代码混为一谈很容易,但它们含义不同,需要不同的应对方式。别拿修 1020 的办法去解决 1015 的问题。

错误 1015 是速率限制。你在太短时间内发送了太多请求,Cloudflare 在限流你,通常是临时的。修复办法是放慢速度、加入退避,并把负载分散到多个 IP 上,而不是改你的指纹。如果你的 1020 其实是一个伪装的速率问题,那请求头救不了你。

错误 1010 意味着 Cloudflare 因为你的浏览器签名被标记而拦截了请求,通常与自动化工具及被检测到的浏览器指纹相关。错误 1012 同样是与一条 Cloudflare 安全规则挂钩的"拒绝访问",常在站点所有者限制了访问时出现。实用的结论是:1010 指向你的指纹,1015 指向你的请求速率,而 1020 指向一条自定义防火墙规则,其具体触发项还需要你自己去查明。

坦诚地说:什么时候 1020 是你无法解决的

这一部分很重要,因为它能让你不必在错误的问题上耗费数小时。来自一条故意规则的 1020 不是验证码,没有任何解算服务、代理轮换或请求头调整能改变站点所有者刻意屏蔽你的决定。

如果站点明确屏蔽你所在的国家、你的整个 IP 段或你的 ASN,那是他们那一端的策略选择。唯一能改变结果的,是改变你的请求来源,而即便如此,也只有在他们没有连你的新位置一起屏蔽时才行。解算服务并不能绕过地理屏蔽;它本来就不是为此设计的,任何声称能办到的供应商都在夸大其词。

解算服务真正能帮上忙的地方,是 1020 的 bot 分这条路径。当防火墙规则针对的是"这个请求看起来是自动化的"时,修复办法就是让请求看起来像一个真实、能通过 challenge 的浏览器,也就是干净的指纹、有效的 cf_clearance,以及匹配的 User-Agent。这是个可解的问题,也是值得自动化的那个。

NSLSolver 适用于哪里,以及如何应用 cf_clearance

如果你的诊断落在 bot 分这条路径上——站点运行了 Cloudflare managed/JS challenge,规则会屏蔽一切没有有效 clearance 的请求——那么 NSLSolver 的 Challenge 端点会替你清除它,并返回你的普通 session 所需的两样东西:一个 cf_clearance cookie 和与之匹配的 user_agent。你把两者附加到一个 requests session 上,就能以原生 HTTP 速度继续,管线里不必运行任何无头浏览器。

NSLSolver 能解算 Cloudflare Turnstile、Cloudflare Challenge(managed/JS)和 Kasada。它不能解算地理屏蔽、IP 信誉封禁或非 Cloudflare 系统,因为那些不是 challenge。请在 1020 是由 bot 检测路径驱动、且缺的正是一个真实 cf_clearance 时使用它。

这套契约很小。向 https://api.nslsolver.com/solve 发送一个带 X-API-Key 的 POST。响应中的 cookies 字段是一个以 cf_clearance 为键的字典,user agent 以 user_agent(蛇形命名)返回。你之后发送的 User-Agent 必须与绑定在该 cookie 上的那个一致,所以请始终使用 API 返回的值。

fix_1020.py
import requests

API_KEY = "nsl_YOUR_API_KEY"
TARGET = "https://target-site.com"

# 1) Ask NSLSolver to pass the Cloudflare challenge behind the 1020 rule
resp = requests.post(
    "https://api.nslsolver.com/solve",
    headers={"X-API-Key": API_KEY},
    json={
        "type": "challenge",
        "url": TARGET,
        "proxy": "http://user:pass@host:port",  # use a clean residential proxy
    },
    timeout=120,
)
data = resp.json()

# 2) Apply the cf_clearance cookie + matching user_agent to a session
session = requests.Session()
session.cookies.update(data["cookies"])          # dict keyed by cf_clearance
session.headers["User-Agent"] = data["user_agent"]

# 3) Requests now carry a valid clearance and stop tripping the bot-score rule
page = session.get(TARGET)
print(page.status_code)   # 200 instead of 1020
print(page.text[:500])

常见问题

Cloudflare 错误 1020 是一个我能解算的验证码吗?

它本身不是。1020 意味着一条防火墙(WAF)规则拦截了你的请求,而不是有验证码在等着。如果规则是因为请求看起来是自动化的、或缺少有效的 cf_clearance 而触发,你可以通过通过 challenge 并让自己看起来像真实浏览器来修复。但如果规则屏蔽的是你的国家、IP 段或 ASN,那就没有验证码,也没有解算服务能改变结果。

我怎么知道我的 1020 是地理/IP 屏蔽还是 bot 检测规则?

通过同一个代理和地区用真实浏览器测试同一个请求。如果浏览器也拿到 1020,那是 IP、ASN 或地理屏蔽,客户端调整帮不上忙。如果浏览器通过而你的脚本失败,那你触发的是 User-Agent、请求头、指纹或 bot 分规则,这是可以修复的。

错误 1020 和错误 1015 有什么区别?

1015 是速率限制:你在太短时间内发送了太多请求,修复办法是放慢速度并加入退避。1020 是一条自定义防火墙规则的拦截,其触发项需要你自己去查明。它们看起来可能相似,但需要不同的修复,所以当真正的问题是请求速率时,别去调你的指纹。

轮换代理能修复所有 1020 吗?

只能修复由 IP 信誉或 ASN 规则驱动的那些。干净的住宅代理能清除大多数基于信誉的屏蔽。但对于一条针对它们仍会出口的地区的故意地理屏蔽,或一条因为你缺少有效 cf_clearance 而拦截的规则(你需要真正通过 challenge),它们都无能为力。

NSLSolver 在 1020 上到底能帮上什么?

在 bot 分这条路径上。当一个 Cloudflare managed/JS challenge 挡在你和页面之间,而规则拒绝一切没有有效 clearance 的请求时,NSLSolver 会返回一个真实的 cf_clearance cookie 加上匹配的 user_agent。把两者应用到你的 session 上,请求就不再触发规则中 bot 检测的那部分。它不能绕过地理或 IP 封禁。

别再对 1020 屏蔽瞎猜

当 1020 是由 Cloudflare 的 bot 检测路径驱动时,一次 API 调用即可返回有效的 cf_clearance 和匹配的 user_agent,让你的请求不再被拒绝。注册即送 100 次免费请求,无需信用卡、无需加密货币。