Skip to content

Repository files navigation

China Access Check

检测你的浏览环境是否会被 ChatGPT、Claude、LinkedIn 等网站识别为中国大陆用户

在浏览器中复现这些网站常用的检测手段,逐项打分并给出综合判断,帮助你了解自己的网络环境暴露了哪些信号。托管于 Cloudflare Workers(静态资源 + 边缘 API),无任何数据存储。

检测项与权重

检测项 权重 原理 备注
IP 归属地 21 Cloudflare 边缘提供的 IP 地理位置(request.cf.country),并用 chnroutes CIDR 独立核对 最直接的信号
被屏蔽服务可达性 16 探测 Google、YouTube、Facebook、X、Instagram、维基百科等被屏蔽服务是否可达;按不可达比例分级打分(全部不可达才满分,个别不可达可能只是服务故障或广告拦截),多服务同时不可达强烈暗示身处 GFW 之内
大陆站点延迟 12 对百度、腾讯、哔哩哔哩 favicon 各采样 3 次取每站最小值,再取三站中第二低的值打分(单站可能有海外 CDN 节点,需两站佐证);< 60ms 说明物理位置在大陆或紧邻 物理延迟,VPN 无法掩盖
浏览器时区 11 Intl.DateTimeFormat().resolvedOptions().timeZoneAsia/Shanghai 非东八区会导致生活的不便,难以隐藏
浏览器语言 10 navigator.languages 首选 zh-CN / zh-Hans 无简体中文字体会导致生活不便,难以隐藏
DNS 解析器归属 9 前端触发 <uuid>.<DNS_PROBE_ZONE> 解析,VPS 上的 dns-probe 记录解析器出口 IP,Worker 代理回收并 chnroutes 判定;解析器在大陆而 HTTP 在境外 = 分流代理特征。需部署 dns-probe/ 并配置变量(见已知局限),未配置则此项跳过不计分
旗帜 Emoji 8 大陆行货或地区设为中国的 Apple 设备会屏蔽 🇹🇼(canvas 对比连字与拆分渲染 + 彩色像素判定,用 🇨🇳 做对照) 设备级信号,VPN 无法掩盖
国际站点延迟 6 以 AWS 美东/美西/东京/新加坡区域端点为参照(位置固定、无全球 CDN);「大陆很近 + 美国异常慢(>300ms)」是跨境线路拥堵/代理服务器和 GFW 开销的典型形态,港/新/日/韩直连美国多在 150~250ms;另做归属地-RTT 核验:IP 声称在美国/亚太,但到同区域参照点实测 ≥200ms(真在当地 <100ms)→ 归属地与物理位置不符,判为代理出口 物理延迟,VPN 无法掩盖
时区一致性 3 浏览器时区与 IP 归属地时区不一致 → 代理迹象;若浏览器时区指向中国则计入中国分
WebRTC 泄露 4 STUN (srflx) 暴露的真实公网 IP 经 chnroutes 判定在中国大陆(最强),或与 HTTP 出口不一致(仅代理迹象)

每项检测产出 0~1 的置信度,乘以权重后求和得到基础分。在此之上还有综合研判层:交叉比对信号之间的一致性,发现矛盾时额外加分(封顶 100):

  • IP 在境外,但到大陆站点 < 60ms 且到美国站点 > 300ms → +12(物理位置高度疑似大陆,IP 是分流代理出口)
  • 设备为大陆行货/中国区(🇹🇼 被屏蔽)+ IP 在境外,且网络层仍显示身在大陆(大陆延迟 < 60ms / DNS 解析器在大陆 / WebRTC 泄露中国 IP)→ +8(疑似使用代理的中国用户;仅凭设备特征不加分,排除携带国行设备出境的游客)
  • DNS 解析器出口在大陆,IP 却在境外 → +8(分流代理:只代理 HTTP、DNS 走国内)

总分 0–100:

  • ≥ 60:很可能被识别为中国大陆用户
  • 35–59:具有较明显的中国大陆特征
  • 15–34:存在少量中国大陆特征
  • < 15:基本不会被识别

权重与阈值集中在 public/app.js 顶部的 WEIGHTS / THRESHOLDS,可自行调整。

架构

public/                                 // 静态页面(Cloudflare Static Assets 直接托管)
  index.html
  app.js                                // 全部检测与打分逻辑(无依赖的原生 JS)
  style.css
src/index.ts                            // Worker:仅处理 /api/*
  GET /api/config                       // 前端运行时配置(DNS 泄露探测的委派子域,未配置返回 null)
  GET /api/ip                           // 返回 request.cf 中的 IP、国家、ASN、时区、colo,并附 chnroutes 判定
  GET /api/ip-china                     // 判断任意 IPv4 是否属于中国大陆(供 WebRTC 泄露比对)
  GET /api/dns-lookup                   // 服务端代理 VPS 的 dns-probe,回收解析器出口 IP 并 chnroutes 判定
src/chnroutes.ts                        // IPv4 是否在中国大陆的二分查找
src/chnroutes-data.ts                   // 自动生成的 CIDR 区间数据(勿手改)
scripts/build-chnroutes.mjs             // 刷新 chnroutes 数据:node scripts/build-chnroutes.mjs
.github/workflows/update-chnroutes.yml  // 每日定时重建 chnroutes,有变化才提交(触发自动部署)
dns-probe/                              // 可选:部署在自有 VPS 上的 DNS 泄露探测服务(见其 README)

wrangler.jsoncrun_worker_first: ["/api/*"]——静态资源不经过 Worker,不产生请求费用。

开发与部署

npm install
npm run dev      # 本地开发 (http://localhost:8787)
npm run deploy   # 部署到 Cloudflare

首次部署需 npx wrangler login。部署后可在 Cloudflare Dashboard 绑定自定义域名。

已知局限

  • DNS 解析器检测依赖 VPS:该项需要一台自有 VPS 部署 dns-probe/ 作权威 DNS 观测解析器出口,并配置 DNS_PROBE_ZONE(委派子域)与 DNS_PROBE_LOOKUP(lookup 接口地址)两个变量——生产环境用 wrangler secret put 或 Dashboard 的 Secret 类型变量(明文 Text 变量会被 wrangler deploy 覆盖清除),本地开发复制 .dev.vars.example.dev.vars 填写。未配置或 VPS 不可达时此项自动跳过、不计分,不影响其它检测。
  • 全局代理下的 VPN 用户:若所有流量都走代理且时区/语言已伪装,则与真实海外用户不可区分——这也是真实网站面临的同样极限。
  • 误报来源:广告拦截插件会拦截对 Google/百度的探测;公司防火墙可能屏蔽 UDP(影响 WebRTC 检测)或大陆站点。

Packages

Used by

Contributors

Languages