共计 2240 个字符,预计需要花费 6 分钟才能阅读完成。
背景痛点:国内访问 ChatGPT 的技术限制
国内开发者访问 ChatGPT 官网主要面临三重技术封锁:

- DNS 污染:对 chat.openai.com 等域名返回错误 IP 地址,导致域名解析失败
- IP 封锁:对 OpenAI 官方服务器 IP 实施 TCP 连接重置(RST 包注入)
- SNI 检测:通过 TLS 握手阶段的 Server Name Identification 识别并阻断请求
传统 VPN 方案存在速度慢、IP 易被标记等问题,而直接使用 API 中转又面临接口变更风险。经过实测,Cloudflare Workers 方案在成本、性能和隐蔽性上取得较好平衡。
技术选型:为什么选择 Cloudflare Workers
- 反向代理:
- 优点:部署简单,可复用现有基础设施
-
缺点:需要维护服务器,IP 仍有被封风险
-
商业 VPN:
- 优点:开箱即用
-
缺点:流量特征明显,稳定性无法保障
-
API 中转:
- 优点:不依赖网页端
- 缺点:需处理认证和接口适配
Cloudflare Workers 方案优势:
- 边缘计算节点全球分布,自动选择最优路由
- 免费层包含 10 万次 / 日请求额度
- 原生支持 WebSocket 和 HTTP/2
- IP 池庞大难以被全面封锁
核心实现:Cloudflare Workers 代理脚本
以下是完整实现代码,保存为chatgpt-proxy.js:
// Cloudflare Workers 处理逻辑
addEventListener('fetch', event => {event.respondWith(handleRequest(event.request))
})
async function handleRequest(request) {
// 只处理特定路径的请求
if (!request.url.includes('/chat')) {return new Response('Not Found', { status: 404})
}
// 构造新请求头
let headers = new Headers(request.headers)
headers.set('Host', 'api.openai.com')
headers.delete('CF-Connecting-IP')
// 请求参数转换
const proxyUrl = new URL('https://api.openai.com' + new URL(request.url).pathname)
// 发起代理请求
return fetch(proxyUrl, {
method: request.method,
headers: headers,
body: request.body,
// 保持长连接
cf: {
cacheEverything: false,
minify: {javascript: false}
}
})
}
部署步骤:
- 登录 Cloudflare Dashboard,进入 Workers 服务
- 创建新服务并粘贴上述代码
- 在
Triggers选项卡绑定自定义域名(如 chat.yourdomain.com) - 在域名 DNS 设置中添加 CNAME 记录指向 workers.dev 域名
性能优化策略
- 连接复用:
- 启用 HTTP/ 2 保持长连接
-
设置
keepalive时间为 300 秒 -
缓存策略:
- 对静态资源设置 Cache-Control 头
-
对 /v1/models 等 GET 请求启用边缘缓存
-
地域路由:
- 通过
cf.colo获取接入点信息 - 优先选择非敏感地区节点
安全防护方案
- 流量混淆:
- 随机化 User-Agent 头
-
添加无害的 Referer 头(如 https://www.google.com)
-
频率控制:
// 在 Worker 开始处添加限流逻辑 const RATE_LIMIT = 5 // 每秒请求数 const ip = request.headers.get('CF-Connecting-IP') const token = await TOKEN_BUCKET.get(ip) if (token === null) {await TOKEN_BUCKET.put(ip, RATE_LIMIT - 1, { expirationTtl: 1}) } else if (token <= 0) {return new Response('Too Many Requests', { status: 429}) } else {await TOKEN_BUCKET.put(ip, token - 1, { expirationTtl: 1}) } -
敏感数据过滤:
- 移除请求中的中国区 IP 特征
- 不记录含 PII(个人身份信息)的交互数据
常见问题排查
- 出现 1020 错误:
- 原因:Cloudflare 安全防护触发
-
解决:更换 Worker 子域名或调整请求频率
-
连接超时:
- 检查 Worker 执行超时设置(默认 10 秒)
-
添加重试逻辑:
const fetchWithRetry = async (url, opts, retries = 3) => { try {return await fetch(url, opts) } catch (err) {return retries <= 0 ? throw err : fetchWithRetry(url, opts, retries - 1) } } -
API 返回 403:
- 确认 OpenAI 账号未被封禁
- 检查请求头中的 Authorization 是否有效
可持续性建议
长期来看,建议考虑以下方向:
- 多节点轮换:结合多个 Cloudflare 账号部署冗余 Worker
- 协议升级:逐步迁移到 WebSocket 实现全双工通信
- 流量分散:将不同功能拆分到不同子域名
- 客户端优化:在浏览器扩展层面实现请求改写
这套方案目前实测可稳定使用,但技术对抗是持续的过程。建议开发者关注 OpenAI 官方动态,及时调整技术方案。
正文完
发表至: 技术分享
近两天内
