国内网站如何看到你的真实 IP:大陆分流检测的原理与三种结果
如果你的网络配置把国内域名设为直连,访问国内网站时对方看到的就是你本地宽带或移动网络的大陆出口 IP,代理不参与这一段。任何网页都可以在后台向国内 CDN 发请求,读出这个大陆 IP,再和自己看到的出口 IP 对比,判断你是否处于“大陆分流”状态。cdnping 的 IP 与环境检测 里的分流检测做的就是这件事。
本文讲这个机制为什么成立、三种检测结果各代表什么,以及怎么自己验证。
分流模式下为什么会有两个出口
在规则分流的配置下,客户端按域名或 IP 段决定每个连接怎么走:境外域名走代理,国内域名直连。国内网站因此不绕路,但设备在同一时刻有两个对外出口。
假设你打开一个部署在海外的网页,例如 cdnping.org:
- 浏览器请求 cdnping.org,这个连接走代理,cdnping 的服务器看到的是代理出口 IP。
- 页面里的脚本再向某个国内 CDN 的地址发请求,这个域名命中“国内直连”规则,连接从本地网络直接出去。
- 国内 CDN 节点看到的是你的大陆出口 IP。
两个服务端看到两个不同的 IP。只要国内那一侧愿意把它看到的 IP 返回给浏览器,网页就能同时拿到这两个值。分流配置本身的逻辑见站内的 分流原理说明。
国内 CDN 怎么把客户端 IP 交给浏览器
CDN 本来就知道你的 IP
TCP 连接建立后,服务端必然知道对端地址,否则没法回包。CDN 节点把请求转发给源站时,通常还会把这个地址写进请求头,让源站知道访客是谁。所以“国内厂商知道你的 IP”并不新鲜,访问任何网站都是如此。
关键在下一步:这个 IP 能不能被第三方网页读到。
回传:响应体或响应头里的客户端 IP
一些国内 CDN 或边缘服务有用于诊断、调度或测速的地址,会在响应里带上客户端 IP。常见形式有两种:
- 写在响应体里,例如返回一段 JSON 或纯文本,里面有访客 IP;
- 写在响应头里,例如一个类似
X-Client-IP的字段(字段名只是示例,各家命名不同)。
这些接口的本意通常是排障,比如让运维确认用户被调度到了哪个节点。但只要对外开放,谁发请求都能读到结果。
CORS 决定网页能不能读到
浏览器有同源策略:cdnping.org 上的脚本向另一个域名发请求,默认读不到对方的响应。能不能读,取决于对方返回的 CORS 头:
| 响应头 | 作用 | 对检测的影响 |
|---|---|---|
Access-Control-Allow-Origin: * 或包含请求方域名 | 允许跨域脚本读取响应 | 有了它,响应体里的 IP 就能被读到 |
Access-Control-Expose-Headers | 列出允许脚本读取的非标准响应头 | IP 写在自定义头里时,必须在这里列出,脚本才拿得到 |
| 两者都没有 | 脚本读不到内容 | 这类地址无法用于读 IP,只能知道请求是否完成和耗时 |
国内 CDN 回传 IP 是前提,CORS 放行是条件。两者都满足的地址,就成了任意网页都能调用的“你的大陆 IP 是多少”查询口。
延迟是第二条证据
只看耗时也有信息量。直连国内 CDN 时往返一般在几十毫秒;如果请求先出境再回来,往返会明显变长。cdnping 的检测同时记录这些国内节点的延迟,和 IP 结果互相印证,不只依赖某一个接口的返回值。
cdnping 的大陆分流检测怎么判断结果
/ip 页面里的大陆分流检测会向网易、腾讯、抖音、微博、优酷、小红书等国内 CDN 发请求,读取它们回传的客户端 IP 和延迟,再和 cdnping 自己看到的出口 IP 对比,给出三种结论之一:
| 结果 | 国内 CDN 看到的 IP | cdnping 看到的 IP | 国内节点延迟 | 说明 |
|---|---|---|---|---|
| 大陆分流 | 大陆 IP | 境外 IP | 低 | 国内流量直连、境外流量走代理,同时有两个出口 |
| 全局代理 | 境外 IP | 境外 IP | 高 | 所有流量都经过代理,包括访问国内网站 |
| 国内直连 | 大陆 IP | 大陆 IP | 低 | 没有使用代理,或代理没有接管浏览器流量 |
结果是“大陆分流”说明什么
境外服务看到的是代理出口,国内服务看到的是你的宽带或移动出口。同一个浏览器里,这两个 IP 都能被一个网页读到。从隐私角度看,“用了代理”不等于“网站不知道你的大陆 IP”。
结果是“全局代理”说明什么
国内 CDN 回传的也是境外 IP,国内节点延迟偏高,说明访问国内网站也绕到了境外。这时国内网站看到的是代理出口,代价是国内访问变慢,部分国内服务也可能因为境外 IP 要求额外验证。
结果是“国内直连”说明什么
两侧看到的都是大陆 IP。没开代理时这是正常结果。如果你以为代理开着,就要检查它是否真的接管了浏览器,例如系统代理没有生效、浏览器扩展没有启用,或当前网络绕开了设置。
各个 CDN 的结论不一致怎么办
有时几个国内 CDN 的结论对不上,例如大部分返回大陆 IP、个别返回境外 IP。常见原因是分流规则只覆盖了一部分国内域名,或者某个域名解析到了境外节点。这时逐个看每个 CDN 的 IP 和延迟,比只看总结论更有用。
动手:自己做一次检测并生成结果图
在浏览器里
- 打开 cdnping.org/ip,等各项检测跑完。
- 查看大陆分流检测的结论,以及每个国内 CDN 回传的 IP 和延迟。
- 对照上面的表格,看各项是否一致。
- 同一页还有 DNS 泄漏和 WebRTC 泄漏 检测,它们是另外两条可能暴露大陆网络信息的路径。
- 要发给同事或贴进工单时,用页面上的生成结果图功能导出一张带水印的图片。打开隐藏 IP 选项后,图里的 IP 地址不会直接显示,适合公开分享。
在命令行里
用 curl 也能验证同样的机制。先看当前的境外出口:
# Cloudflare 的 trace 接口会返回它看到的客户端 IP(ip= 一行)
curl -s https://www.cloudflare.com/cdn-cgi/trace | grep '^ip='
再检查某个接口的 CORS 头是否允许跨域读取(把地址换成你要检查的 URL):
# 带上 Origin 模拟跨域 GET 请求,只打印响应头
curl -s -o /dev/null -D - -H "Origin: https://example.com" "https://<要检查的地址>" \
| grep -i -E 'access-control-allow-origin|access-control-expose-headers'
如果返回了 Access-Control-Allow-Origin,并且 IP 出现在响应体或已暴露的响应头里,这个接口就能被任意网页用来读取你的出口 IP。终端流量是否走代理取决于终端自己的代理设置,可能和浏览器不同。命令行结果和浏览器结果对不上时,先确认两者走的是不是同一条路。
自查清单
- 我知道自己当前是哪种模式:大陆分流、全局代理还是国内直连
- 各个国内 CDN 的结论一致,没有个别域名漏掉
- DNS 泄漏检测里的解析服务器符合预期
- WebRTC 检测没有暴露本地或大陆公网地址
- 分享结果图前已打开隐藏 IP
两个出口被同一网页读到,对隐私有什么影响
一个网页如果同时拿到你的境外出口和大陆出口,就能把这两个地址对应起来,而且不需要任何权限弹窗。对多数人来说这未必构成问题,但应该知道它可以发生。
IP 也不是唯一的判断依据。时区、语言、字体、延迟特征都能反映网络环境,/ip 页面把这些项目放在一起展示,方便你看到完整情况。指纹在本地计算,不上传。
cdnping 的检测只告诉你现状,不提供绕过任何平台检测的方法。使用海外 AI 服务时,请遵守各服务的条款和当地法规,地区限制要如实对待。
如果你在国内用 Claude Code、Codex 这类编程工具,需要人民币结算的接口,可以看看 AGI Plan。AGI Plan 是 cdnping 的商业合作方。AGI Plan 是多供应商大模型聚合网关,站方明确说明自己不是官方授权渠道。
下一步
- 去 /ip 跑一次检测,导出一张隐藏 IP 的结果图留档,换网络或改配置后再跑一次对比。
- 想弄清自己的出口是原生 IP 还是广播 IP,读 原生 IP 与广播 IP。
- 检测时发现某个 AI 服务连不上,先到 挂了吗 和 API 状态 看是不是服务本身的问题,再排查自己的网络。