文章 ·
Codex CLI 代理设置:浏览器能用,终端里的 Codex 却连不上或提示地区不支持
浏览器里 ChatGPT 用得好好的,终端里的 Codex 却一直重连、登录时报 Token exchange failed,或者直接提示地区不支持。多数情况下原因很简单:Codex 是终端程序,它按环境变量决定走不走代理,不看浏览器用的是哪条线路;终端没设代理变量,Codex 就从你本机的网络直接出去。
OpenAI 的 Codex 文档目前没有专门讲代理,环境变量页也没有列出 HTTPS_PROXY 这类变量。下面关于变量的规则来自 openai/codex 仓库的源码(对照 2026-09-29 发布的 0.159.2 版),来自 GitHub issue 的用户说法会单独注明。
Codex 认哪些代理变量
- HTTPS_PROXY / https_proxy:Codex 访问 OpenAI 用的都是 HTTPS 和 WSS,这是最关键的一个。只设
http_proxy不够,普通 HTTPS 请求不看它。 - ALL_PROXY / all_proxy:没设 HTTPS_PROXY 时作为后备。这一点和 Claude Code 不同,Claude Code 不读 ALL_PROXY。
- NO_PROXY / no_proxy:列在里面的地址不走代理,建议写上
localhost,127.0.0.1,::1。 - 大小写:两种都认,同时存在时 Codex 先取大写;curl 正好相反,先取小写。两套值不一样时,curl 测到的出口和 Codex 实际用的会对不上,所以只留一套,或者写成同一个值。
- SOCKS:官方没有写是否支持。源码里 Codex 的 HTTP 客户端没有开启 SOCKS 功能,WebSocket 连接能识别
socks5://,两边不一致;GitHub 上也有用户报告改用 HTTP 代理后恢复正常(#20844、#16360)。代理地址请统一写http://。 - 系统代理:不要指望 Codex 读它。源码里让 Codex 遵循系统代理(包括 PAC)的开关
respect_system_proxy标为开发中、默认关闭;codex doctor在 macOS 上发现系统代理开着却没用上时,也会直接提示「A macOS system proxy is configured but unused」。
变量写在哪
macOS / Linux:在 ~/.zshrc 或 ~/.bashrc 里加下面几行,端口换成你代理软件的 HTTP / 混合端口,然后开一个新终端再启动 Codex:
export https_proxy=http://127.0.0.1:7890 export http_proxy=http://127.0.0.1:7890 export no_proxy=localhost,127.0.0.1,::1
Windows PowerShell:只对当前窗口生效的写法,按微软文档用 $env::
$env:HTTPS_PROXY = "http://127.0.0.1:7890" $env:HTTP_PROXY = "http://127.0.0.1:7890" $env:NO_PROXY = "localhost,127.0.0.1,::1" codex
想长期生效,写进用户级环境变量,之后新开的终端才会带上:
[Environment]::SetEnvironmentVariable('HTTPS_PROXY', 'http://127.0.0.1:7890', 'User')
[Environment]::SetEnvironmentVariable('HTTP_PROXY', 'http://127.0.0.1:7890', 'User')
[Environment]::SetEnvironmentVariable('NO_PROXY', 'localhost,127.0.0.1,::1', 'User')
另外两个要知道的位置:
- ~/.codex/.env:Codex 启动时会读这个文件,把里面的变量写进自己的进程,而且会覆盖终端里的同名变量(源码
codex-rs/arg0/src/lib.rs,官方文档未写)。代理端口改了而这里没改,Codex 会一直连一个没人监听的端口,报 Connection refused(macOS 上是 os error 61,Windows 上是 10061),GitHub 上有多起这样的报告(#38885、#44517)。 - config.toml 没有代理项:给 Codex 自身设代理的配置项还只是一个未采纳的功能请求(#6060)。
shell_environment_policy.set只影响 Codex 帮你运行的命令,管不到 Codex 自己的连接。
~/.codex/.env 压过终端变量,系统代理和 config.toml 都管不到 Codex 自己的连接。也可以把代理软件切到 TUN / 增强模式,由它接管全部流量,终端就不用单独设置。
登录:浏览器能登,终端还要再连一次
按官方认证文档,codex login 会打开浏览器,登录后浏览器通过本机回调(默认 localhost:1455)把凭据交回 Codex。源码里,拿到回调之后,Codex 进程还要自己去 auth.openai.com 换取令牌,这一步走的是终端的网络设置。所以会出现浏览器那边登录成功、终端却报 Token exchange failed 的情况;#10466 下有多位用户说,最后查出是终端没走代理(用户经验,不是官方结论)。
- 远程机器、无图形界面,或者本机网络拦住了 localhost 回调:官方建议用设备码登录
codex login --device-auth(测试阶段,需要先在 ChatGPT 的安全设置里开启)。 - 登完用
codex login status确认当前登录方式;登录失败时,日志目录里的codex-login.log记录了过程。
沙箱里的命令是另一回事
Codex 自己和 OpenAI 通信,与 Codex 替你运行的命令(npm install、git、curl 等)是两条路。官方安全文档写明,CLI 和 IDE 扩展默认的 workspace-write 沙箱不给命令联网,需要时在 config.toml 里打开:
[sandbox_workspace_write] network_access = true
- 命令默认继承 Codex 进程的全部环境变量(
shell_environment_policy.inherit默认是 all),代理变量会跟着传下去;改成core或none时不会,需要用shell_environment_policy.set补上。 - 打开实验性的
features.network_proxy后,命令会经过 Codex 自带的代理按域名放行,allow_upstream_proxy默认允许它再接到环境变量里的上游代理。官方同时说明,这个代理不管 Codex 客户端自己的模型请求和登录请求。 - 源码显示,Windows 沙箱在禁网时会给命令补上指向
http://127.0.0.1:9的代理变量。在命令输出里看到这个地址,说明是沙箱没开网,不是你的代理写错了。
IDE 扩展和桌面应用
官方文档说 CLI 和 IDE 扩展共用同一套配置和登录缓存。但从程序坞、开始菜单启动的图形程序,不一定能拿到写在 ~/.zshrc 里的变量,GitHub 上有不少相关报告(#30695、#34955)。这类场景下,TUN 模式最省事;用 ~/.codex/.env 的,记得和代理软件的端口保持一致。
怎么确认出口
先弄清 Codex 连的是哪个域名。源码里,用 ChatGPT 账号登录时,模型请求发往 chatgpt.com/backend-api/codex;用 API key 时发往 api.openai.com/v1;登录换令牌走 auth.openai.com。
macOS / Linux,在运行 Codex 的同一个终端里:
curl -sL ipjudge.org/cc | bash
脚本会列出终端里的代理变量,用 curl 按这些变量分别访问 api.openai.com 和 chatgpt.com 的诊断地址,显示它们看到的 IP 和地区,地区是中国大陆、香港、澳门时标红;和 Anthropic 那边出口不一致、macOS 系统代理开着但终端没用上,也会提示,并给出不走代理时的出口做对照。只读,不安装、不修改、不上传。要注意它测的是 curl:不读 ~/.codex/.env,大小写优先顺序也和 Codex 相反,这两处要自己对一下。
Windows PowerShell 里写 curl.exe(Windows PowerShell 5.1 里的 curl 是 Invoke-WebRequest 的别名),看 ip= 和 loc= 两行:
curl.exe -s https://chatgpt.com/cdn-cgi/trace curl.exe -s https://api.openai.com/cdn-cgi/trace
想确认 Codex 进程自己读到了哪些变量,运行 codex doctor,网络一项会列出它看到的代理变量;这个结果已经算上了 ~/.codex/.env。
出口确认之后,地区要在 OpenAI 的支持名单里,中国大陆、香港、澳门不在名单内;名单页还写明,在名单以外的地区访问可能导致账号被封禁或暂停。报错的具体含义见 unsupported_country_region_territory 是什么意思。
常见问题
设了 ALL_PROXY=socks5://…,curl 能用,Codex 却不稳定?
Codex 会读 ALL_PROXY,但它的 HTTP 客户端没有开启 SOCKS 支持,部分连接会出问题。改成代理软件的 HTTP / 混合端口,写成 http://127.0.0.1:端口。
浏览器登录成功,终端报 Token exchange failed,怎么办?
换令牌这一步由 Codex 进程在终端里完成。先确认终端设了 HTTPS_PROXY,再重新 codex login;回调本身不通时改用 codex login --device-auth。
终端里什么都没设,Codex 为什么还在走代理?
查一下 ~/.codex/.env。Codex 启动时会读它,并覆盖终端里的同名变量。
Codex 能直接用 macOS 或 Windows 的系统代理吗?
不要依赖。让 Codex 遵循系统代理的 respect_system_proxy 还在开发中,默认关闭,社区反馈开了之后也不是所有连接都会走系统代理(#39237)。设环境变量或用 TUN 模式更可靠。
相关:Claude Code / Codex 出口检测 · Claude Code 代理设置 · ChatGPT、Claude 看到的是哪个 IP · ChatGPT 专项检测 · 检测方法
想知道你自己的 IP 属于哪一类?
免费检测我的 IP