
一个基于 Cloudflare Workers 的 ProxyIP 检测工具。
当前版本的职责很明确:
/check 路由校验候选 ProxyIP 是否可用这个仓库现在是一个单文件 Worker 应用,核心文件只有 _worker.js。
它把页面、解析和 ProxyIP 连通性探测都放在同一个 Worker 中,负责:
/check 路由发起 TCP / TLS 探测这意味着:
/checkdemo/Check_Proxy.js 移植进 _worker.js/check 会访问 ipv4.090227.xyz 和 ipv6.090227.xyz 作为出口探针,用于判断候选 ProxyIP 的 IPv4 / IPv6 出口能力当前源码只读取以下环境变量:
| 变量名 | 说明 | 示例 | 必需 |
|---|---|---|---|
BEIAN |
自定义页面页脚 HTML。未设置时使用默认页脚,包含项目链接、访问人数和维护者链接。 | © 2026 Example.com · ICP 备案号 |
否 |
支持以下输入形式:
| 类型 | 示例 | 说明 |
|---|---|---|
| IPv4 | 8.223.63.150 |
默认端口为 443 |
| IPv4 + 端口 | 8.223.63.150:8443 |
使用指定端口 |
| IPv6 | 2606:4700::1 |
会在内部标准化为 [2606:4700::1]:443 |
| IPv6 + 端口 | [2606:4700::1]:8443 |
推荐使用方括号格式 |
| 域名 | proxyip.example.com |
自动并发解析 TXT / A / AAAA 记录 |
| 域名 + 端口 | proxyip.example.com:8443 |
所有解析结果沿用该端口 |
项目当前内置以下解析规则:
.tp端口. 时,会强制覆盖端口号abc.tp8443.example.comTXT / A / AAAA 记录TXT 记录会按逗号拆分为多个候选目标A / AAAA 记录会沿用输入端口生成候选目标Enter 可直接开始Ctrl + Enter 或 Cmd + Enter 可直接开始浏览器
├─ 访问 Worker 首页 /
├─ 调用 /resolve 或 /resolve-batch 解析输入目标
├─ 调用 /locations 获取 Cloudflare 机房位置
└─ 调用同源 /check 检测候选 ProxyIP
Cloudflare Worker
├─ 返回 HTML / CSS / JS 页面
├─ 解析 IPv4 / IPv6 / 域名
├─ 通过 DoH 查询 A / AAAA / TXT
├─ 通过 cloudflare:sockets 连接候选 ProxyIP 并执行 TLS 探测
└─ 代理 Cloudflare locations 数据
.
├─ _worker.js # Worker 入口,包含页面、解析路由、/check 检测逻辑和前端脚本
├─ README.md # 项目说明
├─ demo.png # 页面示意图
└─ LICENSE # MIT 许可证
GET /返回完整的 Web 检测页面。
页面包含:
GET /resolve?proxyip=...解析用户输入,返回一个数组形式的候选目标列表。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
proxyip |
string | 是 | 要解析的 IP、IPv6、域名或域名加端口 |
单个 IPv4:
[
"8.223.63.150:443"
]
域名解析为多个候选:
[
"203.0.113.10:443",
"203.0.113.11:443",
"[2001:db8::10]:443"
]
/resolve 当前按以下顺序工作:
443.tp端口. 规则,则覆盖端口TXT / A / AAAA 记录TXT 拆分结果以及 A / AAAA 解析结果{
"error": "Could not resolve domain"
}
POST /resolve-batch批量解析域名使用的接口。单次最多提交 15 个目标,避免 Cloudflare Workers 免费套餐的子请求数量上限。
{
"targets": [
"proxyip.example.com",
"proxyip.example.net:8443"
]
}
{
"results": [
{
"input": "proxyip.example.com",
"targets": [
"203.0.113.10:443"
]
},
{
"input": "proxyip.example.net:8443",
"targets": [],
"error": "Could not resolve domain"
}
]
}
GET /check?proxyip=...检测候选 ProxyIP 是否可用。前端检测按钮现在调用的就是这个同源接口。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
proxyip |
string | 是 | 要检测的候选目标,格式通常为 host:port、IPv4:port 或 [IPv6]:port |
timeoutMs |
number | 否 | 单个 TCP / TLS / HTTP 阶段的超时时间,默认 9999 |
readLimit |
number | 否 | 读取探针响应的最大字节数,默认 65536 |
也可以使用 POST /check 提交 JSON:
{
"proxyip": "203.0.113.10:443"
}
批量检测时也支持:
{
"proxyips": [
"203.0.113.10:443",
"[2001:db8::10]:443"
]
}
{
"candidate": "203.0.113.10:443",
"success": true,
"proxyIP": "203.0.113.10",
"portRemote": 443,
"inferred_stack": "ipv4_only",
"supports_ipv4": true,
"supports_ipv6": false,
"dual_stack": false,
"responseTime": 215,
"colo": "HKG",
"timeStamp": "2026-05-13T11:00:00.000Z",
"probe_results": {
"ipv4": {
"ok": true,
"exit": {
"ip": "198.51.100.20",
"ipType": "ipv4",
"colo": "HKG",
"asn": "13335",
"asOrganization": "Cloudflare",
"country": "Hong Kong",
"city": "Hong Kong",
"loc": "22.3193,114.1694"
}
}
}
}
/check 内部会分别访问 ipv4.090227.xyz 和 ipv6.090227.xyz,通过探针返回的出口 IP 判断候选目标是否可用,以及它支持 IPv4、IPv6 还是双栈。
GET /locations转发 Cloudflare 官方位置数据:
https://speed.cloudflare.com/locationscolo 映射到实际经纬度GET /{target}页面还支持“路径直达”用法。
当访问:
https://your-worker.example.workers.dev/8.223.63.150:443
前端会自动:
这对分享某个目标的快速检测链接很方便。
适合快速验证一个目标:
Enter 或点击 开始检测单条模式会把最近输入保存到浏览器本地:
cf_proxy_history适合一次性筛选多个目标:
Ctrl + Enter / Cmd + Enter 或点击按钮开始批量模式下:
/resolve-batchIP:port 去重检测成功后,结果卡片中会出现“落地 IP”按钮。
点击后会展示:
当前项目仍会访问一些外部资源和探针目标。部署前最好先了解清楚:
| 依赖 | 用途 | 当前地址 |
|---|---|---|
/check 探针目标 |
判断 ProxyIP 出口 IPv4 / IPv6 能力 | https://ipv4.090227.xyz/ / https://ipv6.090227.xyz/ |
| Cloudflare DoH | 解析 A / AAAA / TXT |
https://cloudflare-dns.com/dns-query |
| Cloudflare Locations | 获取机房经纬度 | https://speed.cloudflare.com/locations |
| Leaflet | 地图组件 | https://unpkg.com/leaflet@1.9.4 |
| OpenStreetMap 瓦片 | 地图底图(国际覆盖) | https://tile.openstreetmap.org/{z}/{x}/{y}.png |
| 国旗图片 | 出口国家旗帜 | https://ipdata.co/flags/... |
| Google Fonts | 页面字体 | https://fonts.googleapis.com |
/check 检测接口前端真正执行检测时,调用的是同源接口:
/check?proxyip=<target>
这个接口的实现已经内置在 _worker.js 中,主要使用 cloudflare:sockets 连接候选 ProxyIP,再通过固定探针目标判断出口能力。页面当前主要使用它返回的这些字段:
| 字段 | 类型 | 说明 |
|---|---|---|
candidate |
string | 当前检测的候选目标 |
success |
boolean | 是否判定为可用 |
proxyIP |
string | 目标 IP |
portRemote |
number | 目标端口 |
responseTime |
number | 响应耗时,前端会格式化为毫秒 |
colo |
string | 执行检测的 Cloudflare 机房代码 |
message |
string | 失败时的附加说明,可能不存在 |
probe_results |
object | IPv4 / IPv6 探测结果详情 |
成功结果中,前端会进一步读取:
probe_results.ipv4.exitprobe_results.ipv6.exit并从中提取:
ipipTypecoloasnasOrganizationcountrycityloc如果你准备改造 /check 或替换成自己的检测服务,至少需要兼容上述字段,或者同步修改前端的 checkIP() 和结果渲染逻辑。
这是当前仓库最直接的使用方式。
_worker.js 的内容完整粘贴进去部署完成后,访问 Worker 地址即可打开页面。
如果你已经有自己的 Workers 项目,也可以直接:
_worker.js 作为入口文件fetch() 路由和 generateHTML() 页面逻辑合并到现有项目里由于仓库当前没有附带 wrangler.toml,所以默认更偏向“单文件直接部署”的使用方式。
如果你准备基于当前项目继续开发,最常见的改动点如下:
当前前端函数 checkIP() 请求同源接口:
/check?proxyip=
如果你想替换为自己的后端服务,可以改这里;如果只是想换出口探针目标,优先调整 _worker.js 中的 PROBE_TARGETS。
当前 dohQuery() 使用的是 Cloudflare DoH:
https://cloudflare-dns.com/dns-query
如果你有自己的 DNS over HTTPS 服务,也可以替换。
当前地图和旗帜都来自第三方资源。如果你的使用环境受限,可以改成你自己的 CDN 或静态资源地址。
基于当前代码实现,下面这些点需要特别注意:
/check 使用 cloudflare:sockets,需要部署到支持 TCP sockets 的 Cloudflare Workers 运行时/resolve 只负责解析候选目标,不负责真正的网络可用性验证/check 检测过程依赖 ipv4.090227.xyz 和 ipv6.090227.xyz 探针目标可用如果你是从旧版本文档迁移过来的,下面几点已经和当前代码不一致:
/check Worker 路由TOKEN、URL302、URL、ICO 等环境变量/check 检测 API”部分开源代码思路与实现参考自 ToiCF/CF-Workers-CheckProxyIP
本项目基于 MIT License 开源。
$ claude mcp add CF-Workers-CheckProxyIP \
-- python -m otcore.mcp_server <graph>