Claude 中转站自建教程 - 用 Cloudflare Worker 一台 VPS 搞定
Claude 中转站搭建步骤详解。本文给出 Cloudflare Worker、VPS Nginx 反代、One-API 三套自建方案,附完整可用代码,帮你用官方 Key 自建一个"满血、可控、不卖给别人"的 Claude 中转。
如果你已经有 Anthropic 官方 API Key,却卡在”国内访问 api.anthropic.com 不稳”这一步,自建中转是远比买第三方中转更好的选择。
自建的核心差别:
| 对比项 | 第三方中转 | 自建中转 |
|---|---|---|
| API Key 归属 | 商家的(你看不到) | 你自己的官方 Key |
| ToS 合规性 | 普遍违反 Anthropic ToS | 自用不涉及转售,风险最低 |
| 满血程度 | 取决于商家良心 | 100% 官方,无人能动 |
| 数据隐私 | 经过第三方服务器 | 只经过你自己的服务器 |
| 跑路风险 | 商家可能跑路 | 你自己不会跑 |
| 成本 | 包年包月或按量 | CF Worker 免费额度 / VPS 月租 |
| 工程门槛 | 注册即用 | 需要懂一点点反代 / DNS |
前提条件很关键:你需要有官方 Anthropic API Key。如果你完全没有海外手机号 / 信用卡 / 支付方式,先解决这一步——可以参考 Claude API 完整指南 和 Claude 国内访问指南。
风险提示:本文方案假设你只为自己(或小范围团队)使用自己拥有的 Anthropic Key。对外开放、二次售卖、共享给陌生人,都可能违反 Anthropic ToS。
适合人群速判
| 你是… | 适不适合自建 |
|---|---|
| 个人开发者,有官方 Key,国内访问困难 | 非常适合 |
| 小团队(3-10 人)共用一个 Key | 适合,可加访问控制 |
| 企业生产环境 | 优先 AWS Bedrock / Vertex AI |
| 完全没有官方 Key | 不适合,先解决 Key 来源 |
| 想拿来卖给别人赚钱 | 不要做,违反 ToS |
方案 A:Cloudflare Worker(推荐)
这是首选方案:零运维、免费额度对个人完全够用、Cloudflare 边缘节点全球覆盖、HTTPS 自动配置、防 DDoS 自带。
工作原理
你的应用 (Claude Code / SDK)
|
v
your-relay.your-domain.com ← CF Worker 入口
|
Cloudflare 边缘节点
|
v
api.anthropic.com ← Anthropic 官方
|
v
返回响应(透传 streaming)
CF Worker 做的事情非常简单:
- 接收来自你应用的请求
- 校验自定义鉴权 token(防止你的 Worker 被陌生人白嫖)
- 把请求原样转发给
api.anthropic.com - 把 Anthropic 的响应原样返回(包括流式 SSE)
完整 worker.js 代码
下面这段代码直接可用,处理了流式响应、鉴权、错误透传:
const TARGET_HOST = "api.anthropic.com";
export default {
async fetch(request, env, ctx) {
// 处理 CORS 预检
if (request.method === "OPTIONS") {
return new Response(null, {
status: 204,
headers: {
"Access-Control-Allow-Origin": "*",
"Access-Control-Allow-Methods": "GET, POST, OPTIONS",
"Access-Control-Allow-Headers": "*",
"Access-Control-Max-Age": "86400",
},
});
}
// 自定义鉴权:客户端必须带 x-relay-token
const relayToken = request.headers.get("x-relay-token");
if (!env.RELAY_TOKEN || relayToken !== env.RELAY_TOKEN) {
return new Response(
JSON.stringify({ error: "forbidden: invalid relay token" }),
{
status: 403,
headers: { "content-type": "application/json" },
}
);
}
// 构造转发请求
const url = new URL(request.url);
url.host = TARGET_HOST;
url.protocol = "https:";
url.port = "";
// 复制 headers 并注入官方 Key
const newHeaders = new Headers(request.headers);
newHeaders.set("host", TARGET_HOST);
newHeaders.set("x-api-key", env.ANTHROPIC_API_KEY);
newHeaders.delete("x-relay-token");
newHeaders.delete("cf-connecting-ip");
newHeaders.delete("cf-ray");
// 如果客户端没带 anthropic-version,给一个默认
if (!newHeaders.has("anthropic-version")) {
newHeaders.set("anthropic-version", "2023-06-01");
}
// 发起转发
const upstreamResponse = await fetch(url.toString(), {
method: request.method,
headers: newHeaders,
body: request.body,
// 关键:不能 buffer 流式响应
redirect: "follow",
});
// 透传响应(包括 streaming SSE)
const responseHeaders = new Headers(upstreamResponse.headers);
responseHeaders.set("Access-Control-Allow-Origin", "*");
return new Response(upstreamResponse.body, {
status: upstreamResponse.status,
statusText: upstreamResponse.statusText,
headers: responseHeaders,
});
},
};
注意几个关键点:
- 不要 buffer 响应体:直接把
upstreamResponse.body作为新 Response 的 body 传递,CF Worker 会自动透传流式数据 - 删除 Cloudflare 自动添加的 header:
cf-connecting-ip、cf-ray不该传给 Anthropic - 保留
anthropic-version:这是 Anthropic API 必需头,不能丢 x-relay-token不要透传:你的自定义鉴权头,转发前要删除
部署步骤
- 注册 Cloudflare 账号,登录 dashboard
- 左侧菜单进入 Workers & Pages
- 点击 Create Application → Create Worker
- 命名你的 Worker,比如
claude-relay - 创建后点击 Edit code,把上面 worker.js 全部内容粘贴进去
- 点击 Deploy 部署
- 回到 Worker 主页 → Settings → Variables and Secrets
- 添加两个 Secret 变量:
ANTHROPIC_API_KEY:你的官方 Anthropic Key(sk-ant-...)RELAY_TOKEN:你自定义的访问 token(用于客户端鉴权,比如 32 位随机串)
部署后,你会得到一个 https://claude-relay.YOUR_SUBDOMAIN.workers.dev 地址。
客户端怎么用
请求时把 Authorization / x-api-key 换成 x-relay-token,base URL 改成你的 Worker 地址:
curl https://claude-relay.YOUR_SUBDOMAIN.workers.dev/v1/messages \
-H "Content-Type: application/json" \
-H "x-relay-token: YOUR_RELAY_TOKEN" \
-H "anthropic-version: 2023-06-01" \
-d '{
"model": "claude-opus-4-5",
"max_tokens": 1024,
"messages": [{"role": "user", "content": "Hi"}]
}'
注意:这里上游的 x-api-key 是 Worker 内部自动注入的,客户端不需要也不应该带官方 Key。
自定义域名(强烈建议)
*.workers.dev 在国内部分线路被污染或速度差,绑定自己的域名能显著提升可用性。
- 把域名解析(A/CNAME)托管到 Cloudflare
- Worker → Settings → Triggers → Custom Domains → Add Custom Domain
- 填
relay.your-domain.com - Cloudflare 自动签发 SSL 证书
之后客户端用 https://relay.your-domain.com 即可。
Streaming(SSE)保持透传
Anthropic API 的流式响应是 SSE 协议,关键是响应体不能被 Worker 缓冲。上面代码用 new Response(upstreamResponse.body, ...) 直接传递 ReadableStream,已经做对了。
容易踩坑的写法(错误示例,不要这么写):
// 错误:会把流读完再返回,破坏 streaming
const text = await upstreamResponse.text();
return new Response(text, { ... });
配额与限制
Cloudflare Workers 免费版:
| 项 | 免费额度 | 备注 |
|---|---|---|
| 请求数 | 100,000 / 天 | 个人足够 |
| CPU 时间 | 10ms / 请求 | 反代请求几乎无 CPU |
| 出口流量 | 无限 | 但有公平使用条款 |
| 子请求 | 50 / 请求 | 反代单请求只占 1 |
重度用户超过 10 万次/天,升级 Workers Paid($5/月起),20 倍配额。
方案 B:VPS + Nginx 反代
适合:你有海外 VPS,想要更多控制(日志、限流、多 Key 轮询、审计),或者不信任 Cloudflare。
Nginx 配置
/etc/nginx/conf.d/claude-relay.conf 完整可用版本:
# 全局:限流 zone
limit_req_zone $binary_remote_addr zone=claude_relay:10m rate=10r/s;
# 上游
upstream anthropic_api {
server api.anthropic.com:443;
keepalive 32;
}
server {
listen 443 ssl http2;
server_name relay.example.com;
# SSL(Let's Encrypt)
ssl_certificate /etc/letsencrypt/live/relay.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/relay.example.com/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
# 防 HTTP 直连
if ($scheme = http) {
return 301 https://$host$request_uri;
}
location / {
# 鉴权(简单版)
if ($http_x_relay_token != "YOUR_RELAY_TOKEN_HERE") {
return 403;
}
# 限流
limit_req zone=claude_relay burst=20 nodelay;
# 注入官方 Key(这里直接写,生产建议用 njs / Lua 取 env)
proxy_set_header x-api-key "sk-ant-YOUR_OFFICIAL_KEY";
proxy_set_header anthropic-version "2023-06-01";
proxy_set_header Host api.anthropic.com;
# 删除客户端的中转 token,避免泄漏
proxy_set_header x-relay-token "";
# 反代核心
proxy_pass https://anthropic_api;
proxy_ssl_server_name on;
proxy_ssl_name api.anthropic.com;
# 关键:流式响应不能 buffer
proxy_buffering off;
proxy_cache off;
proxy_http_version 1.1;
proxy_set_header Connection "";
# 超时设置(Claude 长输出可能 5 分钟+)
proxy_connect_timeout 30s;
proxy_send_timeout 600s;
proxy_read_timeout 600s;
# 客户端断连不取消上游
proxy_ignore_client_abort off;
}
}
# HTTP 跳转 HTTPS
server {
listen 80;
server_name relay.example.com;
return 301 https://$host$request_uri;
}
部署步骤:
# 1. 安装 Nginx + Certbot
sudo apt update
sudo apt install -y nginx certbot python3-certbot-nginx
# 2. 申请 Let's Encrypt 证书
sudo certbot --nginx -d relay.example.com
# 3. 拷贝上面的配置到 /etc/nginx/conf.d/claude-relay.conf
# 4. 测试配置
sudo nginx -t
# 5. 重载
sudo systemctl reload nginx
关键参数解释
| 参数 | 作用 |
|---|---|
proxy_buffering off | 关闭缓冲,让 SSE 实时透传 |
proxy_read_timeout 600s | Claude 长输出可能 5+ 分钟,不要太短 |
proxy_http_version 1.1 | 启用持久连接,配合 keepalive |
limit_req_zone | 每 IP 限流,防止被刷 |
proxy_ssl_server_name on | 启用 SNI,否则 Anthropic 拒接 |
多 Key 轮询(进阶)
如果你有多个 Anthropic Key 想做负载均衡,可以用 Nginx + Lua(OpenResty)或者用 Node.js / Go 写一个简单的中间层。最简思路:
# 用 Nginx split_clients 做粗粒度轮询
split_clients "${remote_addr}${request_id}" $api_key {
33.3% "sk-ant-key1...";
33.3% "sk-ant-key2...";
* "sk-ant-key3...";
}
# 在 location 中使用
proxy_set_header x-api-key $api_key;
注意:多 Key 轮询本身不是问题,但如果你把 Key 共享给非授权用户使用,会违反 Anthropic ToS。建议只用于自己或团队成员。
IP 白名单(如果只是自己用)
更安全的做法是限制 IP:
location / {
allow 1.2.3.4; # 你的家庭 IP
allow 10.0.0.0/8; # 你的内网
deny all;
# ... 其它配置
}
方案 C:自建 OpenAI 兼容层
适合:你想把 Claude 暴露成 OpenAI 协议,给 Cursor、ChatBox、Continue、各种 OpenAI 客户端用。
常见开源项目
| 项目 | 特点 |
|---|---|
one-api | 老牌开源、多模型聚合、UI 管理 |
new-api | one-api 分支、更活跃、支持 Claude 原生协议 |
simple-one-api | 轻量版 |
openai-claude-proxy | 专注 OpenAI → Anthropic 协议转换 |
这类项目本质上做了两件事:
- 监听 OpenAI 风格的
/v1/chat/completions端点 - 把 OpenAI 请求转成 Anthropic 的
/v1/messages格式发出去,再把响应转回 OpenAI 格式
最小 Docker 部署示例(以 new-api 为例)
version: "3"
services:
new-api:
image: calciumion/new-api:latest
container_name: new-api
restart: unless-stopped
ports:
- "3000:3000"
environment:
- TZ=Asia/Shanghai
- SQL_DSN=root:password@tcp(mysql:3306)/new-api
- REDIS_CONN_STRING=redis://redis:6379
volumes:
- ./data:/data
depends_on:
- mysql
- redis
mysql:
image: mysql:8.0
container_name: new-api-mysql
restart: unless-stopped
environment:
- MYSQL_ROOT_PASSWORD=password
- MYSQL_DATABASE=new-api
volumes:
- ./mysql:/var/lib/mysql
redis:
image: redis:7
container_name: new-api-redis
restart: unless-stopped
部署后:
- 浏览器访问
http://YOUR_VPS:3000,初始管理员账号注册 - 后台添加渠道:选 Anthropic,填官方 Key
- 生成对外的 OpenAI 兼容 Token
- 客户端把 OpenAI base URL 改成
http://YOUR_VPS:3000/v1,模型选claude-opus-4-5之类
重要风险
自建 OpenAI 兼容层、暴露给非自己使用的人,是典型的 Anthropic ToS 违规场景——本质上你成了一个小型中转商。这一段写出来不是鼓励你做,而是让你知道:
- 自用(自己 + 自己的客户端):合规风险低
- 小团队内部共享:灰色
- 对外售卖 / 公开注册:明确违反 ToS
请清楚自己在做什么。
Claude Code 接入自建中转
Claude Code 通过 ANTHROPIC_BASE_URL 环境变量切换后端,自建好后接入很简单。详细背景见 Claude Code 代理配置指南。
Cloudflare Worker 方案
由于 CF Worker 用的是自定义 x-relay-token,而 Claude Code 内部用 x-api-key,最简单的做法是:让你的 Worker 同时接受 x-api-key(把 x-api-key 当作 relay token 校验):
// 改写鉴权部分
const clientKey = request.headers.get("x-api-key") || request.headers.get("authorization")?.replace("Bearer ", "");
if (!env.RELAY_TOKEN || clientKey !== env.RELAY_TOKEN) {
return new Response("forbidden", { status: 403 });
}
// 然后用官方 Key 覆盖
newHeaders.set("x-api-key", env.ANTHROPIC_API_KEY);
这样 Claude Code 端配置:
# Linux / macOS
export ANTHROPIC_BASE_URL="https://relay.your-domain.com"
export ANTHROPIC_API_KEY="YOUR_RELAY_TOKEN" # 注意:这里是 relay token,不是官方 key
claude
# Windows PowerShell
$env:ANTHROPIC_BASE_URL = "https://relay.your-domain.com"
$env:ANTHROPIC_API_KEY = "YOUR_RELAY_TOKEN"
claude
或者写进 ~/.claude/settings.json:
{
"env": {
"ANTHROPIC_BASE_URL": "https://relay.your-domain.com",
"ANTHROPIC_API_KEY": "YOUR_RELAY_TOKEN"
}
}
Claude Code 在国内的安装与运行问题,可以参考 Claude Code 国内安装教程。
自建避坑清单
整理几个真实会踩的坑:
1. 流式响应被 buffer
症状:Claude Code / SDK 收不到 streaming,要等响应全部完成后一次性收到。
原因:
- Nginx 没设
proxy_buffering off - 中间有 CDN(除 CF)做了 buffer
- Worker 代码用
.text()/.json()读完了再返回
解决:上面给的代码都已经处理,复制时不要改。
2. 超时太短
Claude 长输出(特别是 Opus + Extended Thinking)可能 5-10 分钟。Nginx 默认 60s proxy_read_timeout 会直接掐断。
解决:proxy_read_timeout 600s 起步。Cloudflare Worker 单请求最长 30s(Free)/ CPU 时间限制,长 streaming 是受 Worker 整体规则限制的,重度用户用 VPS 方案更稳。
3. SNI 问题
Nginx 反代 HTTPS 上游时,如果不设 proxy_ssl_server_name on,会因为 SNI 缺失被 Anthropic 拒接(TLS 握手阶段)。
4. anthropic-version 丢失
不带这个 header,Anthropic 返回 400。给客户端没带的情况留个默认值。
5. CF Worker 502 / 1101
CF Worker 异常通常因为代码抛了未捕获异常。开发期间在 dashboard 看实时 logs,加 try-catch 包裹整段逻辑。
6. 断线重连
客户端如果在 streaming 中途断开,上游可能继续消耗 Token。可以考虑在 Worker 里用 request.signal 监听断连并 abort 上游 fetch:
const upstreamResponse = await fetch(url.toString(), {
method: request.method,
headers: newHeaders,
body: request.body,
signal: request.signal, // 客户端断连自动 abort 上游
});
7. CDN 节点污染
CF 的某些 IP 段在国内被污染。如果你的自定义域名也是 CF 代理(橙云),可以:
- 试试不同的 IP 段
- 用 [iP查询工具] 找延迟低的优选 IP
- 或者只 DNS 不代理(灰云)+ 自建一层
流量监控建议
自建好后,建议加个基本的监控:
| 监控项 | 工具 / 方式 |
|---|---|
| 调用次数 / 每日 | CF Worker dashboard 自带、Nginx access log |
| Token 消耗 | 拦截响应解析 usage 字段 |
| 错误率 | 监控 4xx/5xx 占比 |
| 延迟分布 | P50/P95/P99 |
| 上游异常 | Anthropic 限流 / 故障告警 |
为什么这个重要:自建意味着 Key 直接挂你账户上,如果你的 relay token 泄漏被滥用,账单会很难看。监控异常用量是防止账单爆炸的最后一道防线。
可选做法:
- CF Worker 用 Workers Analytics + Logpush 到 R2
- Nginx 用 nginx-prometheus-exporter + Grafana
- 简单点直接
tail -f /var/log/nginx/access.log
FAQ
Q:自建中转算违反 Anthropic ToS 吗? 自用、不转售、不共享给陌生人,本质上等同于”你给自己设了个网络代理”,ToS 风险很低。但如果你把它当成业务对外卖、对公众开放注册,那就是典型的 ToS 违规。
Q:Cloudflare Worker 免费额度够用吗? 对个人开发者基本够。10 万次/天的请求量意味着每秒约 1.2 次,正常编码使用远到不了这个量。重度调用考虑升级 Paid 或换 VPS 方案。
Q:CF Worker 在国内访问稳定吗? 近年部分地区线路有波动,建议绑定自定义域名 + 准备好备用 VPS 方案。重要场景不要把鸡蛋放一个篮子。
Q:VPS 选哪里? 日本东京、新加坡、香港线路通常对国内最友好。AWS、GCP、Vultr、Linode、DigitalOcean 都有这些区域机房,选延迟低的即可。
Q:能不能在国内 VPS 上搭中转?
技术上能搭,但国内 VPS 出网到 api.anthropic.com 依然受限。必须再叠一层境外出口(自己再租海外 VPS 转发,或用 IP 代理服务),意义不大。
Q:自建中转需要懂多少技术? CF Worker 方案:会复制粘贴 + 注册 CF 账号即可。VPS Nginx 方案:要熟悉 Linux、Nginx、SSL 证书。new-api 方案:要懂一点 Docker。
Q:自建后还能给团队成员用吗? 小团队内部使用,技术上完全可以——加一个用户级 token 管理就行。但要注意:Anthropic ToS 中关于”Key 共享”的边界很模糊,团队内部不对外的使用,通常风险较低;规模一大或对外,就明确违规了。
Q:我没有官方 API Key 怎么办? 没办法自建,因为自建就是给你自己的 Key 做代理。先解决官方账号问题——海外信用卡、海外手机号是核心门槛。或者考虑 Anthropic Pro/Max 订阅(仅 Web/桌面端,无法用于自建)。