Codex 代理配置完整教程:浏览器能开 ChatGPT,Codex 却一直重连怎么办(2026)
OpenAI 的 Codex 有三种形态:命令行工具 Codex CLI、桌面 App(Codex Desktop),以及 VS Code 等编辑器里的插件。它们底层都是同一个用 Rust 写的后台程序,负责和 OpenAI 服务器通信。国内用户最常遇到的情况是:浏览器打开 chatgpt.com 一切正常,Codex 却每条消息都卡在「正在重新连接 1/5 … 5/5」,最后报 Connection failed: error sending request 或 stream disconnected before completion。
这几乎都不是节点或账号的问题,而是 Codex 根本没有走到代理上。本文以科技熊推荐的电脑客户端 Clash Verge Rev(科技熊版) 为例(Windows 教程、macOS 教程),界面上的名称都按它来写;用其它客户端的,原理完全一样,对照找到同名功能即可。截至 2026 年 10 月,Codex 版本约为 0.16x。
一、先弄清:Codex 只认环境变量,不认系统代理
Clash Verge Rev 首页「科技熊工作室」卡片上有一个「浏览器 / 整机」的切换:
- 浏览器:客户端把代理地址写进系统的代理设置,浏览器和大多数图形界面程序会主动去读它,所以网页能正常打开。
- 整机:客户端建一块虚拟网卡(也就是 TUN 模式),在系统层面接管所有程序的流量,不管程序读不读代理设置。
Codex 的后台程序默认不读系统代理设置,它只认下面几个标准环境变量:
| 变量 | 作用 |
|---|---|
HTTPS_PROXY |
HTTPS 请求走的代理,包括 wss:// 的 WebSocket 长连接 |
HTTP_PROXY |
明文 HTTP 请求走的代理 |
ALL_PROXY |
兜底,上面两个都没设时使用 |
NO_PROXY |
不走代理的地址,如 localhost,127.0.0.1,::1 |
所以在「浏览器」模式下,浏览器能用、Codex 连不上,是意料之中的事。解决办法有两条,任选其一:
- 切到「整机」:让虚拟网卡把 Codex 的流量也接过去,不用设任何变量(第二节)。
- 保持「浏览器」,给 Codex 设环境变量:把 Codex 指向 Clash Verge Rev 的混合代理端口(第三节)。
Codex 源码里已经有一个「读取系统代理」的开关(config.toml 里 [features] 下的 respect_system_proxy),但截至本文仍标记为「开发中」、默认关闭,不建议依赖它。
一个最容易被忽略的地方:~/.codex/.env
Codex 启动时、在做任何网络请求之前,会读取 Codex 目录下的 .env 文件,把里面的每一行都写进自己的环境变量(这段逻辑在 Codex 源码 codex-rs/arg0/src/lib.rs 的 load_dotenv() 里,只跳过 CODEX_ 开头的变量)。也就是说:
- 只要
.env里有同名变量,它会覆盖系统里设好的环境变量。 - 在 Windows 上这个文件是
%USERPROFILE%\.codex\.env,macOS / Linux 上是~/.codex/.env(如果设了CODEX_HOME,则在那个目录下)。
一个真实案例:用户的 Clash Verge Rev 混合代理端口是 7897,系统环境变量也改对了、反复检查了三遍,Codex 却一直报 os error 10061。最后发现是早年按某篇教程在 .codex\.env 里写过 HTTPS_PROXY=http://127.0.0.1:7890(7890 是很多旧教程里的端口),Codex 每次启动都用它覆盖了正确的值,所有请求都打到一个没有程序在监听的端口上。
这个坑在「整机」模式下同样存在:只要 Codex 读到了代理变量,它就会先去连那个本机端口,端口不对照样被拒绝,虚拟网卡也帮不上忙。所以配置原则只有一条:代理只写在一个地方,而且端口要和 Clash Verge Rev 显示的一致。
两个相关的小知识
- 只在启动时读一次。 环境变量和
.env都只在进程启动那一刻读取。改完之后,已经在运行的 Codex 感知不到。桌面 App 关掉窗口后通常还留在托盘 / 菜单栏里,必须从托盘图标彻底退出再重开;CLI 要关掉终端窗口新开一个。 - WebSocket 优先,HTTPS 兜底。 Codex 和服务器之间优先建立
wss://长连接,失败后退回普通 HTTPS,此时 CLI 会提示Falling back from WebSockets to HTTPS transport。一条长连接要保持好几分钟,比网页请求更怕两件事:本机代理端口不通,以及会话途中出口 IP 变了。
二、最省事的做法:切到「整机」
适合 Windows 和 macOS 上的大多数人:
- 打开 Clash Verge Rev,在首页「科技熊工作室」卡片上把范围从「浏览器」切到「整机」,模式保持「规则」(卡片下方会显示「所有应用海外流量走代理」)。
- 第一次切到「整机」时,客户端会提示安装一个随应用附带的系统服务,需要输入一次电脑的管理员密码。装好后会自动开启整机代理。
- 先按第五节的命令检查一遍,确认系统环境变量和
~/.codex/.env里没有写错端口的代理变量;有的话删掉,或改成 Clash Verge Rev 显示的端口。 - 从托盘图标彻底退出 Codex 再重新打开,CLI 则新开一个终端。
这样 Codex 的请求会被虚拟网卡接管,再按订阅里的分流规则送到 ChatGPT 分组,不需要设置任何环境变量。同一台电脑上的 Claude Code、Cursor、git、npm 等工具也会一并走代理。
两点说明:
- Linux 版的卡片上没有这个切换,Linux 用户请用第三节的环境变量方法。
- 「整机」接管的是所有程序的海外流量。国内网站在「规则」模式下照常直连,不消耗流量;别切到「全局」,否则国内流量也会走代理并计入流量。
三、保持「浏览器」:给 Codex 设环境变量
不想装系统服务、只想让 Codex 单独走代理,或者用的是 Linux,就给 Codex 设环境变量。
第 1 步:看 Clash Verge Rev 的混合代理端口
打开 Clash Verge Rev 首页,滚到最下方的「Clash 信息」卡片,看「混合代理端口」这一行。科技熊版默认是 7897,同一张卡片的「系统代理地址」会显示 127.0.0.1:7897。混合端口同时接受 HTTP 和 SOCKS 两种请求,下面统一写成 http://127.0.0.1:7897;如果你的卡片上显示的不是 7897,把下文所有 7897 换成你看到的数字。
顺便确认出口地区。用 Cloudflare 的 trace 接口看出口落在哪:
# Windows PowerShell 里要写 curl.exe,避免被 PowerShell 的 curl 别名接管
curl.exe -x http://127.0.0.1:7897 https://chatgpt.com/cdn-cgi/trace
重点看两行:loc= 是出口地区,ip= 是出口 IP。中国大陆、香港、澳门不在 OpenAI 的支持地区内,出口落在这些地方会直接 403;台湾、美国、日本、新加坡等可以。注意,这条命令用 -x 手动指定了端口,它证明的是「7897 → 节点 → OpenAI」这条链路是通的,不能证明 Codex 用的也是这个端口。
第 2 步:按系统设置
Windows:用「用户级环境变量」,一次设置,对 CLI、桌面 App、编辑器插件都生效。在 PowerShell 或 CMD 里执行:
setx HTTP_PROXY "http://127.0.0.1:7897"
setx HTTPS_PROXY "http://127.0.0.1:7897"
setx NO_PROXY "localhost,127.0.0.1,::1"
setx 写入的值只对之后新开的程序生效。接着检查 .env(没有这个文件就什么都不显示):
Get-Content $env:USERPROFILE\.codex\.env -ErrorAction SilentlyContinue
里面如果有 HTTP_PROXY、HTTPS_PROXY、ALL_PROXY 之类的行,要么删掉整个文件(Remove-Item $env:USERPROFILE\.codex\.env,前提是里面没有你需要的其它设置),要么把端口改成 7897。然后从任务栏托盘图标彻底退出 Codex 再重开,终端和 VS Code 也整个重开。
只想在当前终端里临时用一次:
$env:HTTPS_PROXY = "http://127.0.0.1:7897"
$env:HTTP_PROXY = "http://127.0.0.1:7897"
codex
macOS / Linux 的 CLI:把变量写进 shell 配置文件(macOS 默认 zsh 用 ~/.zshrc,bash 用 ~/.bashrc),保存后 source ~/.zshrc 或新开终端:
export HTTP_PROXY="http://127.0.0.1:7897"
export HTTPS_PROXY="http://127.0.0.1:7897"
export NO_PROXY="localhost,127.0.0.1,::1"
macOS 桌面 App:从程序坞或「应用程序」里点开的 App 不会读 ~/.zshrc,所以只在 shell 里设变量,CLI 能用、桌面 App 照样连不上。这种情况正好可以用 .env:把同样的三行(去掉 export)写进 ~/.codex/.env,桌面 App 和 CLI 启动时都会读到。
mkdir -p ~/.codex
cat > ~/.codex/.env <<'EOF'
HTTP_PROXY=http://127.0.0.1:7897
HTTPS_PROXY=http://127.0.0.1:7897
NO_PROXY=localhost,127.0.0.1,::1
EOF
选了 .env 就把 ~/.zshrc 里那几行删掉,只留一处。以后端口变了,只改这一个文件。
WSL:WSL2 里的 127.0.0.1 默认指的是 WSL 自己,不是 Windows。最简单的是在 Windows 上把 Clash Verge Rev 切到「整机」;或者在 %USERPROFILE%\.wslconfig 里设 networkingMode=mirrored(镜像网络,Windows 11 22H2 及以上),之后 WSL 里的 127.0.0.1:7897 就能直接连到 Windows 上的 Clash Verge Rev。
用 http:// 还是 socks5://? 用 http://。Codex 的 GitHub issue 里有 Windows 用户反馈,变量写成 socks5:// 时流式输出和上下文压缩相关的请求会出错,换成 http:// 后明显好转。
四、安装与登录这两步也要过代理
安装。 Codex CLI 用 npm 安装:
npm install -g @openai/codex
npm 本身也要能连上 registry:在「整机」模式下直接装即可;在「浏览器」模式下,先在同一个终端里设好上面的代理变量,或者临时换国内镜像 npm install -g @openai/codex --registry=https://registry.npmmirror.com。装完用 codex --version 确认。桌面 App 从 OpenAI 官网下载。
登录。 执行 codex login(或第一次运行 codex)会打开浏览器让你登录 ChatGPT 账号,登录完成后浏览器会跳回本机 localhost:1455,由 Codex 在本地接收登录结果。两个要点:
NO_PROXY里要有localhost,127.0.0.1,否则本机回调有可能被错误地送进代理。- 浏览器和 Codex 必须在同一台机器上。通过 SSH 登录的服务器、容器、部分 WSL 环境里,浏览器跳不回来,可以改用设备码登录:
codex login --device-auth,在任意设备的浏览器里输入屏幕上的代码即可(个人账号需先在 ChatGPT 的设置里允许设备码登录,团队工作区需管理员开启)。
用 API Key 的,从标准输入传入,避免 Key 留在命令历史里:
printenv OPENAI_API_KEY | codex login --with-api-key
五、分组:在「💬ChatGPT」里固定一个节点
科技熊下发的配置里,ChatGPT 与 Codex 的流量(chatgpt.com、ws.chatgpt.com 等 OpenAI 域名)都走「💬ChatGPT」这个分组。它默认是自动选择 AI 节点,而且切换门槛设得很高,平时很少换节点。
Codex 一次 WebSocket 会话要保持好几分钟,中途换了出口 IP,服务端可能认为会话异常,表现就是断流、重连;同一个账号的出口 IP 频繁在多个地区之间跳,本身也更容易触发风控。跑长任务时更稳的做法是:
- 打开 Clash Verge Rev 的「代理」页,找到「💬ChatGPT」分组,手动点选一个固定节点(台湾、美国等支持地区的节点都可以,台湾、美国节点有家宽 IP)。
- 到「连接」页点「关闭全部」,清掉旧连接,让 Codex 用新节点重新连。
想确认 Codex 实际连到了哪台服务器,看「连接」页最右边的「目标地址」列:同一个分组在十几分钟里出现好几个不同的地址,就说明它在切换。
六、排查:从外到内,一层只回答一个问题
网络问题最忌讳一上来就改配置。正确的做法是从外到内一层层验证,每层拿到确定的证据再往下走:
| 层 | 要回答的问题 | 怎么查 |
|---|---|---|
| 1 | Codex 的流量进没进 Clash Verge Rev? | 「连接」页搜 chatgpt,看「进程」列是不是 Codex |
| 2 | 出口能不能用? | curl.exe -x http://127.0.0.1:7897 https://chatgpt.com/cdn-cgi/trace 看 loc= |
| 3 | 出口稳不稳? | 「连接」页的「目标地址」列,或多跑几次 trace 对比 ip= |
| 4 | 报错到底在说什么? | 读错误码,见下表 |
| 5 | Codex 实际读到了哪个端口? | 盘点全部配置来源(下面的命令),和「Clash 信息」卡片上的混合代理端口对照 |
第 1 层用到的「进程」列,科技熊下发给 Clash Verge Rev 的配置已经打开了(find-process-mode: always),能直接看到每条连接是哪个程序发起的。浏览器、Codex 桌面 App 的界面层、Codex 的后台进程各自的连接一目了然:如果只看到浏览器和界面层在连 chatgpt.com,后台进程一条都没有,就说明后台在直连,回到第二、三节处理。
第 5 层的命令(Windows PowerShell),一次把 Codex 可能读到代理的地方全查一遍:
# 当前会话、用户级、系统级的代理变量
Get-ChildItem env: | ? Name -match proxy
[Environment]::GetEnvironmentVariables("User").GetEnumerator() | ? Name -match proxy
[Environment]::GetEnvironmentVariables("Machine").GetEnumerator() | ? Name -match proxy
# Codex 自己的文件
Get-Content $env:USERPROFILE\.codex\.env -ErrorAction SilentlyContinue
Select-String -Path $env:USERPROFILE\.codex\config.toml -Pattern proxy -ErrorAction SilentlyContinue
# 7897 端口有没有程序在监听
Test-NetConnection 127.0.0.1 -Port 7897 | Select TcpTestSucceeded
macOS / Linux 对应的是 env | grep -i proxy、cat ~/.codex/.env、grep -i proxy ~/.codex/config.toml 和 nc -z 127.0.0.1 7897 && echo ok。几处的端口不一致,Codex 会以 .env 里的为准。较新版本的 Codex 还自带诊断命令 codex doctor,它的连接性检查会列出检测到的代理变量和系统代理状态,可以和上面的手工检查互相印证。
常见报错速查
| 报错 | 含义 | 先查哪里 |
|---|---|---|
| 正在重新连接 n/5 / Reconnecting… | 断开后的自动重试,本身不是原因 | 看它下面一行的具体报错 |
Connection failed: error sending request |
请求没能发出,底层原因被包了一层 | 用 CLI 复现,拿到更具体的错误码 |
os error 10061 / 目标计算机积极拒绝 |
本机这个端口没有程序在监听 | 变量和 .env 里写的端口,是否等于「Clash 信息」卡片上的混合代理端口 |
os error 10060 / 连接超时 |
发出去了,对方一直没响应 | 代理没生效、在直连;切到「整机」或设环境变量 |
Falling back from WebSockets to HTTPS transport |
wss 长连接没建起来 | HTTPS_PROXY 是否设了、是否生效 |
stream disconnected before completion |
流式输出中途断开 | 括号里的系统错误码;「💬ChatGPT」分组是否在切换节点 |
| HTTP 403 | 出口地区不在支持范围 | trace 的 loc=,换台湾、美国等节点 |
关于 10061 值得多说一句:如果问题出在节点、出口或 OpenAI 那边,请求已经交给了 Clash Verge Rev,Codex 收到的会是 502、超时或 TLS 错误;能让 Codex 直接收到「本机端口拒绝连接」的,几乎只有一种情况——它连的那个本机端口根本没开。看到 10061,直接去查端口配置,不用再怀疑节点。
还是查不出来,可以在 Clash Verge Rev 里把诊断信息发给科技熊在线客服:客户端会把当前模式、整机代理是否开启、节点选择等状态一并带上,排查会快很多。
七、几条经验
- 配置来源要全量盘点。 同一个设置往往有多个来源和覆盖顺序:系统级、用户级、进程继承、程序自己的配置文件。只查「我设过的那一处」,很容易漏掉真正生效的那一处。
- 分清「链路通」和「程序用了这条链路」。
curl -x手动指定端口,只能证明那个端口后面的链路是好的;要证明程序的行为,得看「连接」页的进程列和程序自己报的错。 - 读懂错误码,比猜原因快。 笼统的
error sending request没有信息量,os error 10061一句话就把范围缩到了本机端口。 - 能解释现象的原因,不一定是根因。 节点自动切换是真实存在的问题,也能解释重连,但解释不了 10061。每提出一个假设,都检查它能否解释全部症状。
- 改完配置要彻底重启。 托盘里残留的旧进程会让人误以为「改了没用」。
关于线路的选择
Codex 对网络的要求,归结起来是三点:出口落在 OpenAI 支持的地区、长连接期间不中途换出口、本机代理端口和程序配置对得上。第三点照上面的步骤做一遍就能解决,前两点取决于线路。
科技熊每个节点提供 [专线](走 BGP IEPL 专线)和经海外中转的 [备线] 两条线路,备线只按同节点专线的四分之一计流量(最低 0.5x);台湾、美国节点有家宽(住宅)IP。用 ChatGPT / Codex 需要钻石尊爵及以上套餐;希望出口只有自己在用的,可以加购家宽独享 IP(说明)。新用户有 ¥1 体验(1GB / 1 天,不含 AI 节点),可以先测一下连接质量。是否选择由你判断。
ChatGPT 网页端的访问、注册和充值问题,可以看 ChatGPT 国内怎么稳定使用;同样跑在终端里的 Claude Code,代理配置思路相近但有几处关键差别,见 Claude Code 代理配置教程。Clash Verge Rev 的分流、连接页和日志页怎么用,见 Clash Verge Rev 进阶指南。
本文最后更新:2026-10-26
