🚪 面向 Codex、Claude Code 等 CLI 的轻量显式代理。把出网统一收口到你的 VPS,并在出口侧做 Basic Auth、目标白名单和审计。
推荐架构:代理核心跑在 VPS,client 只连本地入口;出网、鉴权、目标限制和审计都留在 VPS。
当前有两种 mode:
proxy mode:标准显式代理用法,适合Claude Code/Codex CLI和其他支持HTTP(S)_PROXY的 CLIclaude mode:类似cc-gateway的集中 OAuth 方案,当前仅支持Claude Code
- 只想让
codex、claude code这类命令走代理,不影响机器上的其他程序 - 想把模型访问统一收口到自己的 VPS,并加上白名单和审计
- 想保留 SSH 隧道接入,但比普通 SSH / SOCKS 多一层出口控制
- 想给
Claude Code增加一个带集中 OAuth 的本地入口,同时尽量不改现有显式代理架构
git clone这个仓库- 把 SEND_THIS_TO_LLM.md 这个文件直接发给 LLM
- 回答它追问的少量配置问题
- 它会读取仓库里的部署示例,完成服务端部署,并返回客户端配置
两条链路共用同一个 VPS 出口控制核心:
proxy mode:CLI 只看到本地HTTP_PROXY/HTTPS_PROXYclaude mode:Claude Code只看到本地ANTHROPIC_BASE_URL,本地claude-client对接 VPS 上的 Claude OAuth broker,请求再通过现有显式代理出网
cp deploy/vps.example.yaml deploy/vps.yaml先改:
users[0].password- 不想用默认账号,再改
users[0].username - 要放行额外域名,再改
runtime.dest_suffix_allowlist
示例已经包含常见模型服务域名:
.claude.ai.claude.com.anthropic.com.openai.com.openrouter.ai.chatgpt.com.github.com.githubusercontent.com.githubcopilot.com.ghcr.io
默认示例还会通过 runtime.dest_host_allowlist 放行精确主机 storage.googleapis.com,用于兼容 Claude Code 仍在迁移中的 legacy 下载路径;同时默认放行 Github 常见 API / 下载域族、远程 GitHub MCP 的 .githubcopilot.com,以及本地 Docker 方式安装 GitHub MCP 时会用到的 .ghcr.io,避免用户还要手动补白名单。
不建议直接把白名单放空或改成近似全放开。更稳的做法是按产品域族放行,比如 Claude 用 .anthropic.com、.claude.com、.claude.ai,再补必要的精确 host。
如果 Claude Code 提示无法连接 platform.claude.com,说明你当前部署的白名单里还没有放行 .claude.com。把它加入 runtime.dest_suffix_allowlist 后重新执行部署。
如果你要启用 claude mode 的集中 OAuth,再额外改:
claude_oauth.enabled: trueclaude_oauth.refresh_token
启用后,VPS 会在 admin listener 上提供一个 Claude OAuth broker。它集中持有 refresh_token,本地 claude-client 通过 admin tunnel 拉取短期 access_token;这部分用法可以看作是对 cc-gateway 集中 OAuth 思路的简化复用。
执行部署:
go run ./cmd/codex-gateway deploy vps
systemctl --user status codex-gateway.service --no-pager如果 VPS 上没有可用的 systemd --user,把 service_scope: system 写进 deploy/vps.yaml,再以 root 重新执行。
这会生成 .env、config/users.txt、二进制和对应的 systemd 服务。
如果你把这个代理给 codex、claude code 这类会并发开很多 HTTPS 隧道的 CLI 使用,不要把 runtime.max_conns_per_ip 设得太低。经验值建议从 128 起步;16 这类通用代理级别的限制很容易触发 429,然后在客户端重试时表现成“特别慢”。
先复制示例:
cp deploy/client.example.yaml deploy/client.yaml至少先改:
ssh.userssh.hostproxy.password- 如果你改了服务端用户名,再把
proxy.username一起改掉
然后根据要启用的 mode 选择:
mode: proxy:旧用法,只生成 tunnel + proxy env +codex-gateway-proxymode: claude:只生成 Claude rewrite 相关组件mode: both:同时生成两套入口
claude mode 会额外生成:
- admin tunnel service
- 本地
codex-gateway claude-clientservice claude.envclaude-client.yamlcodex-gateway-claudewrapper
如果你要接多台 VPS,proxy mode 可以在 deploy/client.yaml 里配置 endpoints 做 client 侧 failover。claude mode 当前只支持单个 endpoint。
执行部署:
go run ./cmd/codex-gateway deploy client如果本机不适合 systemd --user,也可以改成 service_scope: system 后以 root 安装。
如果只想生成文件,不立即 build / restart:
go run ./cmd/codex-gateway deploy vps --write-only
go run ./cmd/codex-gateway deploy client --write-only默认会写到 ~/.config/codex-gateway/,其中 claude mode 相关文件通常是:
~/.config/codex-gateway/claude.env~/.config/codex-gateway/claude-client.yaml
先打通到 VPS 的本地隧道:
ssh -NT \
-L 127.0.0.1:8080:127.0.0.1:8080 \
<ssh.user>@<ssh.host>然后在当前 shell 设置代理环境变量:
export HTTP_PROXY=http://<proxy.username>:<proxy.password>@127.0.0.1:8080
export HTTPS_PROXY="$HTTP_PROXY"这种方式下,直接在当前 shell 启动 client,无需运行 deploy client。
claude mode 需要两条本地 tunnel:
ssh -NT \
-L 127.0.0.1:8080:127.0.0.1:8080 \
-L 127.0.0.1:19090:127.0.0.1:9090 \
<ssh.user>@<ssh.host>然后准备 claude-client.yaml,或者先用 deploy client --write-only 生成一份,再手工启动:
codex-gateway claude-client -config ~/.config/codex-gateway/claude-client.yaml最后给 Claude Code 注入本地入口:
export ANTHROPIC_BASE_URL=http://127.0.0.1:11443
export CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC=1
export CLAUDE_CODE_OAUTH_TOKEN=gateway-managed
claude如果只想热更新白名单、目标端口、源地址白名单或代理认证用户,不想重启代理进程,可以用 SIGHUP:
- 修改
deploy/vps.yaml - 只重写服务端生成文件:
go run ./cmd/codex-gateway deploy vps --write-only- 给正在运行的服务发送
SIGHUP:
systemctl --user kill -s HUP codex-gateway.service如果你用的是 system scope:
sudo systemctl kill -s HUP codex-gateway.service如果你是手工启动二进制:
kill -HUP <pid>SIGHUP 会重新加载 .env、AUTH_USERS_FILE、SOURCE_ALLOWLIST_CIDRS、DEST_PORT_ALLOWLIST、DEST_HOST_ALLOWLIST、DEST_SUFFIX_ALLOWLIST 和 ALLOW_PRIVATE_DESTINATIONS。监听地址、TLS、超时、日志、metrics 等非运行时配置仍然需要 restart 才会生效。
按 mode 启动:
proxy mode:在已经设置代理环境变量的 shell 里直接运行codexproxy modewrapper:通过~/.local/bin/codex-gateway-proxy codexproxy mode多入口:~/.local/bin/codex-gateway-proxy --endpoint backup codexclaude modewrapper:通过~/.local/bin/codex-gateway-claude claudeclaude mode手工 sidecar:先启动codex-gateway claude-client -config ...,再运行claude
这个 mode 是可选的,而且是和现有 proxy mode 隔离实现的。旧的显式代理路径不需要改;只有在你明确启用 claude mode 时,client 才会多出一个本地 claude-client。
它的工作方式是:
Claude Code请求先到 client 本地claude-clientclaude-client在本地完成 Claude Code 所需的请求 rewriteclaude-client通过 admin tunnel 从 VPS OAuth broker 拉短期 token- 真正的上游请求仍然通过本地 proxy tunnel 进入现有
codex-gateway显式代理,再出网到api.anthropic.com
可以把它理解为:claude mode 在不改现有显式代理数据面的前提下,提供了一个类似 cc-gateway 的集中 OAuth 入口,并顺带处理 Claude Code 需要的那部分 rewrite。
本地 claude-client 还提供:
/_health/_verify
如果你已经习惯了现有 proxy mode,可以完全不启用这个能力;如果你需要 Claude Code 的集中 OAuth,再切到 mode: claude 或 mode: both。
- 标准显式代理:HTTP forwarding + HTTPS
CONNECT - 安全控制:Basic Auth、源 IP allowlist、每 IP 并发限制
- 出口约束:目标 host / suffix / port allowlist
- SSRF 防护:DNS 解析后二次校验,默认拒绝私网和保留地址
- 可观测性:JSON 日志、
/healthz、可选/metrics - 多入口接入:
proxy mode支持 client 侧多 VPS failover,可按入口切换 - Claude 专用 mode:本地轻量 reverse proxy、集中 OAuth、请求 rewrite
- 部署友好:单二进制、Docker、Compose、YAML 一键部署
如果你只想把流量绕到 VPS,普通 SSH 隧道或 SOCKS 代理通常就够了。codex-gateway 补的是面向 LLM CLI 的控制面:
- SSH / SOCKS 提供通道;
codex-gateway增加 Basic Auth、源 IP 和并发控制 - 普通代理主要做转发;
codex-gateway还能限制 host / suffix / port,只放行指定模型域名 - 普通代理通常不做 DNS 结果复检;
codex-gateway默认拒绝解析到私网或保留地址的目标 - SSH 登录日志不是代理审计;
codex-gateway记录用户名、目标、状态码、字节数和耗时 - 内置 client wrapper,可让只有
codex这类指定命令走代理;无需全局设置代理 - 对
Claude Code,还可以额外加一层本地claude-client,把集中 OAuth 收进可控链路
换句话说:SSH 解决“怎么到 VPS”;codex-gateway 解决“放行什么、如何审计”;claude mode 进一步补上了 Claude Code 的集中 OAuth。
proxy mode是显式代理,不是通用厂商 API Gateway- 默认监听
127.0.0.1,推荐通过 SSH / WireGuard / 私网入口访问 - 不做 HTTPS MITM
claude mode只对Claude Code做本地 reverse proxy 和 rewrite,VPS 只集中管理 OAuth refresh token- 默认配置保守,先最小放行,再按需扩容
claude mode 的集中 OAuth 设计参考了 motiful/cc-gateway。这里的实现保持了 codex-gateway 原有的显式代理数据面,只把 Claude 相关入口做成可选的本地 sidecar。
- 环境变量方式:.env.example
- 服务端一键部署 YAML:deploy/vps.example.yaml
- 客户端一键部署 YAML:deploy/client.example.yaml
- Docker / Compose:docker-compose.yml