10. 安全加固
CPA 一旦泄露,等于把你的 ChatGPT/Gemini/Claude 账号的 API 调用权交了出去——账号风控、配额耗尽是小事,部分上游会因此封号。必须认真做这一节。
威胁模型
- 8317(API + 面板)泄露 → 任何人能用你的 API key 打模型
- 9090(mihomo 控制)泄露 → 任何人能改你的代理路由、看你流量
- 1455 / 8085 / 54545(OAuth 回调)泄露时间窗短,但理论上能劫持登录流程
/root/CLIProxyAPI/auths/*.json泄露 → OAuth refresh token 被盗,等于上游账号被偷
必做项
1. 用足够强的 API key
config.yaml → api-keys:
api-keys:
- "sk-cpa-$(openssl rand -hex 24)" # 自己生成,至少 32 字符不要用 sk-test、sk-12345 这类。
2. 用足够强的管理面板密码
remote-management:
secret-key: "$(openssl rand -hex 16)" # 自己生成3. 安全组只放白名单
云厂商安全组里:
| 端口 | 来源 |
|---|---|
| 22 | 你的公网 IP |
| 8317 | 你的公网 IP / 客户端机器 IP |
| 9090 | 不开放 或 你的公网 IP |
| 其它(1455 等) | 不开放,登录时走 SSH 隧道 |
4. 系统防火墙再加一层
云厂商安全组之外,系统防火墙也建议开。CentOS/Rocky/OpenCloudOS:
firewall-cmd --permanent --add-port=22/tcp
firewall-cmd --permanent --remove-service=dhcpv6-client
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=你的公网IP port port=8317 protocol=tcp accept'
firewall-cmd --reload5. 走 SSH 隧道访问管理面板
最干净的方式:把 allow-remote 关掉,远程访问全走 SSH:
remote-management:
allow-remote: false# 本地
ssh -L 8317:127.0.0.1:8317 root@服务器IP
# 浏览器开 http://127.0.0.1:8317/management.html8317 永远不暴露公网,安全组也可以只对自己 IP 开(用来给客户端调用 API)。
推荐项
6. 套 HTTPS(Caddy 反代最简单)
直接 http://你的服务器IP:8317 是明文,API key 在 header 里走外网,建议套 TLS。最省事是 Caddy:
# 假设你有域名 cpa.example.com 已解析到服务器
docker run -d \
--name caddy \
--restart unless-stopped \
-p 443:443 -p 80:80 \
-v /root/caddy/Caddyfile:/etc/caddy/Caddyfile \
-v /root/caddy/data:/data \
caddy:latest/root/caddy/Caddyfile:
cpa.example.com {
reverse_proxy 127.0.0.1:8317
@admin path /management.html /v0/management/*
handle @admin {
# 限制管理面板只允许你自己 IP
@allowed_ip {
remote_ip 你.的.公.IP
}
handle @allowed_ip {
reverse_proxy 127.0.0.1:8317
}
respond 403
}
}Caddy 自动申请 Let’s Encrypt 证书。客户端把 base URL 改成 https://cpa.example.com,安全组关掉 8317 对外(只让 Caddy 在 443 暴露)。
7. fail2ban / 限流
如果你坚持把 8317 开放给较广 IP 段(比如团队),加个 fail2ban 防爆破:
dnf install -y fail2ban或者用 nginx + limit_req_zone 加个简单速率限制。
8. OAuth 凭据文件加权限
chmod 700 /root/CLIProxyAPI/auths
chmod 600 /root/CLIProxyAPI/auths/*.json只有 root 能读,避免容器内 / 共享主机的其它服务捎带读到。
9. 监控异常
定期看:
# 失败请求
docker logs cli-proxy-api 2>&1 | grep -E "warn|error" | tail -50
# 不寻常的客户端 IP
docker logs cli-proxy-api 2>&1 | grep -oE '\| +[0-9.]+ +\|' | sort -u或者在管理面板的 Usage 看每个凭据的 token 用量,异常飙升就调查。
不要做
- ❌ 把 9090 直接开到 0.0.0.0/0(无 secret,有人扫到立刻接管)
- ❌ 把 secret-key 存进 git / 截图发群
- ❌ 把
auths/*.json备份到任何公开存储 - ❌ 在共享 VPS 上跑(其它租户能看到端口)
- ❌ 把 API key 写进客户端代码 push 到 GitHub(即使私库也不要)
备份清单
万一想换机器/重装:
tar czf cpa-backup-$(date +%F).tgz \
/root/CLIProxyAPI/config.yaml \
/root/CLIProxyAPI/auths/ \
/root/mihomo/config.yaml把 tgz 用 GPG 加密:
gpg --symmetric --cipher-algo AES256 cpa-backup-2026-05-09.tgz
# 输出 cpa-backup-2026-05-09.tgz.gpg
shred -u cpa-backup-2026-05-09.tgz加密后才能放云盘 / Git。