你如何被识别:代理判定、TLS 指纹与 Bot 评分
三层证据:承载你的网络、握手的形状、以及打在你行为上的分数。每一层都比听起来更弱。
「你是不是代理」从来不是一个是非题,而是一条证据链。最外层是网络:这个地址由谁广播、属于机房还是住宅、是不是公开列表上的 Tor 出口。往里一层是传输:ClientHello 的形状能说明这次连接来自浏览器还是某个脚本库,换了 IP 也改不掉。最里层是行为与评分:Bot Score、请求节奏、会话长度。三层各自都只能给出概率,叠起来才勉强够用——这也是为什么误判总是集中在同一批人身上。
并非所有"隐身"流量的特征都一样。商业 VPN、机房代理与 Tor 出口节点,在网络边缘留下的指纹各不相同。本文梳理现代 IP 情报体系实际使用的信号。
一、ASN 是第一个线索
每个 IP 都属于某个自治系统(ASN)。家用宽带、移动运营商与主机商的 ASN 截然不同。当一个地址由云/主机商 ASN 广播——如 AWS、DigitalOcean、Hetzner——它几乎不可能是家庭宽带。仅凭 ASN 就能识别出相当一部分代理与 VPN 流量。
二、机房 vs 住宅
住宅代理更难识别:它们租用真实的家庭 IP,ASN 看起来是本地的。服务商需要用信誉库、连接类型数据库与行为信号(同一 IP 多账号、异常端口、会话存活时间短)来对抗。
三、Tor 出口节点是公开的
Tor 会公布其出口节点列表。列表上的任何 IP 都能被瞬间识别。来自 Tor 出口的请求不是"可能被匿名",而是已知的中继节点,在敏感接口上往往会被直接拦截。
四、VPN 识别是概率性的
商业 VPN 是移动靶:不断更换 IP、购买住宅段、使用混淆。没有单一信号能一锤定音,因此服务商会把 ASN、信誉、TLS 指纹(JA3)与请求行为综合成一个评分。
五、这意味着什么
- 如果你运营服务:把高欺诈分当作"增加摩擦"(验证码、邮箱验证)的理由,而不是直接封禁。
- 如果你重视隐私:VPN 换掉的是 IP,而不是浏览器指纹。
- 在信任某条线路之前,先用透明工具自测。
六、误判的代价
把正常用户判成代理,代价不是“少一个访问”,而是这个人多半不会再回来。企业出口、校园网、共用同一个运营商级 NAT 的整片用户、装了隐私扩展的开发者——他们的特征和代理高度重叠。所以成熟的系统不会输出“是或否”,而是返回一个分数加上若干条理由,由人来决定在哪一步加摩擦。这也是为什么做得好的检测用户几乎感觉不到,做得差的会把所有人挡在门外。
换掉 IP 很容易,改变 TLS 握手的样子却很难——而这次握手,在你发出任何一个字节的 HTTP 之前就已经明文送达。
七、ClientHello 本身就是指纹
每次 TLS 连接都以 ClientHello 开场,它按特定顺序列出支持的加密套件、扩展、椭圆曲线、签名算法等。这个组合取决于浏览器、版本、操作系统与 TLS 库。把这些字段做哈希,就得到一个稳定的标识。
八、JA3 是什么
JA3 是这类哈希中被广泛采用的方案:把 ClientHello 的数值字段拼接后取 MD5。JA4 是同一思路更新、更细的版本。两个 JA3 相同的连接,几乎可以断定来自同一套软件栈——即便 IP、User-Agent 和 Cookie 都不一样。
九、为什么它关系到隐私
- VPN 藏住 IP,却完全没动指纹——你在不同会话之间依然可被关联。
- 异常的 JA3 本身就是信号:自动化框架与爬虫的指纹往往和真实浏览器对不上。
- 反爬系统会把指纹与 ASN、时序、行为一起打分;没有哪个单一信号能定案,是分数在定案。
十、你自己到底能看到什么
在 Cloudflare 上,JA3 与 JA4 只对启用了 Bot Management 的 Enterprise 套餐开放。没有它,任何站点能拿到的诚实信号就是传输层元数据(TLS 版本、加密套件、HTTP 协议版本),加上浏览器主动送出的客户端提示,例如操作系统平台与移动标记。
十一、指纹对不上时该怀疑什么
如果指纹和你声称的浏览器版本长期不一致,先别认定自己被封了。最常见的三个原因:企业代理或杀毒软件在中间终止 TLS,再用自己的技术栈重新发起连接;扩展改写了请求头;以及客户端确实是自动化工具。前两个的后果不只是“看起来奇怪”——TLS 被终止意味着那个中间设备原则上能看到全部明文,这件事比指纹本身更值得关心。
某个表单开始被打,于是有人加了一个验证码,注册量掉了三分之一,滥用只是变少了但没停。验证码完成了它被要求完成的事——给所有人加摩擦,包括你想要的那些人。反机器人是另一个问题:先识别出自动化流量,再把摩擦只花在需要的地方。
十二、边缘先看连接,再看行为
在任何 JavaScript 跑起来之前,请求已经带了很多东西:来源 ASN 及其声誉、TLS 版本与加密套件、ClientHello 的形状、HTTP/2 的 SETTINGS 帧、请求头的顺序与大小写,以及声明的 User-Agent 是否和整条技术栈自洽。一个自称 Chrome 130、TLS 特征却是某个 Python 库的请求,并不难发现。
Cloudflare 把这些信号压缩成 1 到 99 的 Bot Score。分数低说明看起来像自动化,分数高说明像人;平台把 1–29 视为「很可能是机器人」,30–99 视为「很可能是人」,托管规则只在两端动作。这个分数只在带 Bot Management 的套餐上才拿得到,所以一个自建的诊断页经常只能说「不可用」而不是打印一个数字——说「不可用」才是对的。
十三、分数不是判决
很多合法流量分数很低:监控探针、链接预览、RSS 阅读器、无障碍工具、CI 里跑的 curl,以及任何装了改写请求头扩展的用户。反过来,一个熟练的人操纵的无头浏览器也能拿到高分。把分数当成一个输入,并且在每次采取动作时留一条人能读懂的理由。
十四、Turnstile 不是验证码
Turnstile 只在自己没把握时才弹交互题。多数访客什么都不用做就通过了,这正是重点:它用一组浏览器与连接信号替代了视觉测验。团队弄错的部分在服务端。
- 每个令牌都必须在你自己的服务器上向 siteverify 校验。前端返回的「成功」只是一种建议,不是证据。
- 令牌是一次性且短命的,大约五分钟。要存的是校验结果,不是令牌本身。
- 把令牌绑定到 action,并检查它签发时的 hostname;否则令牌农场可以在别的站上解好,然后拿到你这儿重放。
- 敏感动作上,令牌缺失或无效时要失败即拒绝;其余场景则失败后给出挑战——一个在 siteverify 超时时硬失败的结账流程是在丢钱。
十五、浏览器能证明什么,不能证明什么
JavaScript 执行、事件时序、指针轨迹、WebGL 输出,这些都比一个纯 HTTP 请求更费攻击者的力气;但只要操作者够有耐心,一个被自动化的真实浏览器可以把它们全部做出来。请求头顺序和 TLS 指纹更难伪造,因为它们来自 TLS 库,而不是调用库的那段代码——但在 Cloudflare 上这些指纹需要企业版套餐,所以小站通常只能靠 JS 信号、限流和声誉来做事。
十六、摩擦该放在哪里
放在误判成本最低、对攻击者价值最高的地方:注册、找回密码、结账,以及任何会对外发消息的动作。读取类页面就别管了。然后再补上速度规则——同一 IP 一天建了多个账号、一台设备对应几十个会话、某个 ASN 突发流量——因为那类流量本来就会从挑战里漏过去。
ipbox.one 把这三层信号尽量摊开给你看:地址的 ASN 与网络属性、这次请求在边缘被观察到的 TLS 细节,以及部署支持时给出的 Bot Score。拿不到的那几项它会明说拿不到,而不是猜一个——这本身也是一种结论。