不必TUN,丝滑使用 Codex App
两个环境变量 + 一行配置,让 Codex App 在国内网络下跑通,不影响系统其他应用。
你如果遇到:在终端里跑 Codex cli 正常,但切到 App,模型调用开始超时,npm install 转圈转半天。第一直觉一定是加Proxy!
今天折腾研究了一下—— 其实 Codex 的 HTTP 客户端用的是 Rust 生态的 reqwest,它会读系统代理环境变量,但前提是你得设对。
所以,我下面的方法中不需要 TUN 模式、不搞全局代理,只看怎么精准控制建造一个受控可用的运行环境。
先搞清楚 Codex 的网络模型
很多人搞混一件事:Codex CLI 和 Codex App 不是两个程序。
从 GitHub 仓库 openai/codex 可以看到,整个核心代码在 codex-rs/ 下,是纯 Rust 写的。npm 上的 @openai/codex 只是一个薄薄的 Node.js 启动器(约 12KB),实际拉下来的是捆绑的 Rust 原生二进制(约 200MB)。App 就是同一个二进制,通过 codex app 启动桌面 GUI 模式。
这对网络配置意味着什么?
-
Codex 的 API 调用走 reqwest这个 Rust HTTP 库 reqwest
默认读取 HTTP_PROXY/HTTPS_PROXY/NO_PROXY环境变量- 不会
读 Node.js 那套 NODE_EXTRA_CA_CERTS之类的东西
另外,Codex 在 workspace-write 沙箱模式下内置了一个网络策略代理(源码位于 codex-rs/network-proxy/),用于管控沙箱内的网络访问。这个代理模块也会读取 HTTP_PROXY / HTTPS_PROXY 环境变量来连接上游——源码中 upstream.rs 的 ProxyConfig::from_env() 明确实现了这一逻辑。
三个问题,三个解法
|
|
|
|---|---|
|
|
HTTPS_PROXY 指向本地代理 |
|
|
NO_PROXY 排除镜像域名 |
|
|
config.toml 中打开 network_access(OpenAI 官方文档确认) |
全程不改系统网络设置,只在启动 Codex App 的 shell 进程中注入环境变量。
动手之前
① 确认代理可用
curl -x http://127.0.0.1:7890 https://www.google.com -I
返回 200 即正常。端口换成你自己的。
② 确认沙箱网络已放行
编辑 ~/.codex/config.toml(没有就新建),加上:
[sandbox_workspace_write]network_access = true
这个配置在 OpenAI 官方文档中有明确说明。也可以启动时通过命令行传入:
codex --config sandbox_workspace_write.network_access=true
启动脚本 (MAC环境,Window环境需要做替换)
#!/bin/bash# ========== 代理地址(改成你自己的) ==========PROXY_ADDR="你的Proxy服务地址"# ========== 注入代理环境变量 ==========export HTTP_PROXY="$PROXY_ADDR"export HTTPS_PROXY="$PROXY_ADDR"export http_proxy="$PROXY_ADDR"export https_proxy="$PROXY_ADDR"# ========== 直连排除列表 ==========# .cn 通配覆盖所有国内域名;加具体镜像站域名双重保险export NO_PROXY="localhost,127.0.0.1,::1,.local,.cn,npmmirror.com,tuna.tsinghua.edu.cn,ustc.edu.cn,ruby-china.com,aliyun.com"export no_proxy="$NO_PROXY"# ========== 注入包管理器镜像源 ==========export NPM_CONFIG_REGISTRY="https://registry.npmmirror.com"export PIP_INDEX_URL="https://pypi.tuna.tsinghua.edu.cn/simple"export HOMEBREW_BREW_GIT_REMOTE="https://mirrors.ustc.edu.cn/brew.git"export HOMEBREW_BOTTLE_DOMAIN="https://mirrors.ustc.edu.cn/homebrew-bottles"# ========== 启动 Codex App ==========/Applications/Codex.app/Contents/MacOS/Codex &
关于 SOCKS5:Codex 使用的 reqwest库没有启用 socks feature,设置ALL_PROXY=socks5://...会被静默忽略。代理地址只支持 HTTP/HTTPS。
Windows 用户怎么办?
Windows 下可从 Microsoft Store 或 GitHub Releases 下载安装,方式不影响后续配置。用 PowerShell 脚本设置环境变量后启动即可:
# codex-proxy.ps1$PROXY_ADDR = "http://127.0.0.1:7890"$env:HTTP_PROXY = $PROXY_ADDR$env:HTTPS_PROXY = $PROXY_ADDR$env:NO_PROXY = "localhost,127.0.0.1,::1,.local,.cn,npmmirror.com,tuna.tsinghua.edu.cn,ustc.edu.cn,ruby-china.com,aliyun.com"$env:NPM_CONFIG_REGISTRY = "https://registry.npmmirror.com"$env:PIP_INDEX_URL = "https://pypi.tuna.tsinghua.edu.cn/simple"codex
Windows 下没有 Homebrew,脚本中去掉了对应的镜像变量。启动命令用 codex替代了 macOS 的二进制路径。
镜像与 NO_PROXY 对应关系
|
|
|
|
|---|---|---|
|
|
registry.npmmirror.com |
npmmirror.com
.cn ✅ |
|
|
pypi.tuna.tsinghua.edu.cn |
tuna.tsinghua.edu.cn
.cn ✅ |
|
|
mirrors.ustc.edu.cn |
ustc.edu.cn
.cn ✅ |
|
|
gems.ruby-china.com |
ruby-china.com
|
|
|
mirrors.aliyun.com |
aliyun.com
|
所有镜像域名均在 NO_PROXY 中,请求不会绕代理。
怎么验证
用脚本启动 Codex App 后,让它执行一个依赖安装(比如 npm install express),然后做三件事:
看连接
lsof -i -nP | grep -i codex
-
大量 127.0.0.1:7890→ 代理在工作 ✅ -
访问镜像站时远端是你本机 IP → 直连生效 ✅
看代理日志
Clash / V2Ray 日志中应能看到 API 请求,但不应出现镜像站域名。
凭感觉
下载速度正常、模型调用不超时,就对了。
常见疑问
Q: 为什么不直接开 TUN 模式?
TUN 劫持整个系统流量,容易跟公司 VPN、虚拟机等冲突。环境变量注入只在当前进程内生效,干净可控。
Q: 需要设 NODE_USE_ENV_PROXY=1 吗?
不需要。Codex 的 HTTP 客户端是 Rust 的 reqwest,不读 Node.js 环境变量。
Q: WebSocket 怎么办?
WebSocket 初始握手是 HTTP Upgrade 请求,通过 HTTP CONNECT 隧道走代理。配好 HTTPS_PROXY,代理会为 WebSocket 目标地址建立 CONNECT 隧道,升级后的 WebSocket 帧在隧道内透明传输。
Q: 沙箱里还是没网?
检查 ~/.codex/config.toml 是否确实写了 network_access = true。这个最容易漏。
Q: 为什么去掉了 SOCKS5?
查了 Codex 源码,它使用的 reqwest 没有启用 socks feature,SOCKS5 代理设置不会生效。只支持 HTTP/HTTPS 代理。
写在最后
这套方案就三件事:
-
境外 API 走专属Proxy -
国内源直连 -
沙箱放行
全锁在一个脚本里,不爽就删,不留痕迹。
有用的话欢迎转发给同样在折腾 AI 编程工具的同伴。遇到坑也欢迎留言交流。
夜雨聆风