乐于分享
好东西不私藏

不必TUN,丝滑使用 Codex App

不必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() 明确实现了这一逻辑。

三个问题,三个解法

问题
解法
境外 API(模型调用)被墙
设 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 对应关系

工具
镜像源
NO_PROXY 匹配
npm
registry.npmmirror.com npmmirror.com

 + .cn ✅
pip
pypi.tuna.tsinghua.edu.cn tuna.tsinghua.edu.cn

 + .cn ✅
Homebrew
mirrors.ustc.edu.cn ustc.edu.cn

 + .cn ✅
RubyGems
gems.ruby-china.com ruby-china.com

 ✅
Composer
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 编程工具的同伴。遇到坑也欢迎留言交流。