从一次诡异的 403 说起:如何正确判断是网络问题还是风控问题

举报
yd_267090071 发表于 2026/10/31 11:02:49 2026/10/31
【摘要】 记录一次排查 403 的实战:同是 403 可能来自网络层、CDN 风控层或应用层,判断关键是看响应体格式;并说明为什么 curl 的 TLS 指纹会误导排查,以及用 trace 端点和真实浏览器做最终验证的完整流程。

从一次诡异的 403 说起:如何正确判断"是网络问题还是风控问题"

一、那个让我查了两小时的 403

前段时间排查一个服务访问异常:某海外 API 在服务器上稳定返回 403,但同一套代码在同事的笔记本上完全正常。

第一反应是"被墙了",于是开始换节点、换协议、测端口连通性——全部正常,TCP 握手成功,TLS 也能协商,就是返回 403。

后来用 curl 抓了响应体才发现,那不是网络层的拒绝,而是 Cloudflare 返回的 HTML 拦截页:

Sorry, you have been blocked

请求根本没到达目标服务器,是被 CDN 的边缘节点拦下了。

二、403 的三种完全不同的成因

同样是 403,可能来自三个层面,处理方式完全不同:

层面 特征 典型原因
网络层 连接超时、RST、无法握手 链路阻断、端口封锁
CDN 风控层 返回 HTML 拦截页、Just a moment... IP 信誉差、TLS 指纹异常、UA 可疑
应用层 返回 JSON 错误体 权限不足、Token 过期、配额用完

关键判断方法:看响应体的格式。

• HTML 页面 → CDN/防火墙拦截(不是业务逻辑)

• JSON → 应用层拒绝(看 code/message)

• 无响应 → 网络层问题

三、最容易误判的地方:命令行工具的 TLS 指纹

这里有个大坑:用 curl 测试的结果,不能代表浏览器或 App 的真实体验。

原因是 CDN 会检查 TLS 握手的指纹(JA3/JA4)。curl 用的是标准 OpenSSL,指纹非常"机器化",很容易被识别为爬虫;而 Chrome 的指纹是真人流量特征。

我实测过同一个 IP:

# curl 访问 → 403
curl -s -o /dev/null -w "%{http_code}" https://目标站/

# 真实浏览器访问 → 200 正常打开

所以排查时如果只用 curl,很容易得出"这个 IP 被墙了"的错误结论,然后白白折腾换 IP。

四、正确的排查顺序

1. 先看响应体:是 HTML 还是 JSON?这一步能砍掉一半的错误方向。

2. 确认出口 IP:用 /cdn-cgi/trace 这类端点看自己的出口 IP 和 ASN。

```bash

curl -s https://目标站/cdn-cgi/trace | grep -E '^(ip|loc|warp)='

```

3. 区分测试工具:curl 的结果只能作为参考,涉及风控时必须用真实浏览器验证。

4. 检查业务层参数:Header 是否带齐(Accept、Accept-Language、Referer)、Token 是否有效。

五、几个实用技巧

用 trace 端点看真实出口

Cloudflare 系列的站点大多支持 /cdn-cgi/trace,能直接看到:

ip=104.28.x.x
loc=SG
warp=on

warp=on 表示流量走了 Cloudflare WARP,loc 是边缘节点所在地,这两个字段对判断链路非常有用。

用 curl 复制浏览器请求头

如果一定要用 curl 测试风控,至少把头伪装完整:

curl -s -o /dev/null -w "%{http_code}\n" \
  -A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/147.0.0.0 Safari/537.36" \
  -H "accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" \
  -H "accept-language: en-US,en;q=0.9" \
  https://目标站/

但要注意:UA 和 Header 可以伪造,TLS 指纹伪造不了,所以结果仍然只能参考。

用真实浏览器做最终验证

自动化场景下,用 Playwright 起一个真实 Chromium 去访问,看页面标题和内容,这才是最接近真实用户的验证:

const resp = await page.goto('https://目标站/');
console.log(resp.status(), await page.title());
// 如果 title 是 "Just a moment..." 就是被 Cloudflare 挑战了

六、小结

排查 403 的核心不是"试更多方法",而是先分类,再定位:

1. 看响应体格式 → 判断是 CDN 还是应用层

2. 看出口 IP/ASN → 判断是否 IP 信誉问题

3. 用真实浏览器复核 → 避免被 curl 的指纹误导

这三步做完,通常十分钟内就能定位方向,比盲目换 IP、换协议高效得多。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。