Back to Blog
· 2 min read

从 ClashX 到 Clash Verge:为什么网页正常,Codex 却无法联网

AI工具 网络

最近把 mac 上使用多年的 ClashX 换成了 Clash Verge,主要原因是 ClashX 最近经常性 timeout,使用其它工具测试节点没问题,推测可能是年久失修(这个项目已经长期不维护了)的缘故,所以干脆换个试试,Clash Verge 仍在更新,也采用了 Mihomo 内核。

切换后遇到了了一些网络方面的问题。GitHub、YouTube、chatgpt.com 都能在浏览器里正常打开,只有 Codex 无法联网,命令行配置代理的环境变量也不行,Git 等工具倒是可以正常使用,经过一番波折,在 ChatGPT的帮助下,在 ~/.codex/.env 里补上代理变量,Codex 才恢复正常。

网页能访问,不代表 Codex 能联网

一开始把 chatgpt.com 和 Codex 当成了同一条网络连接,以为在 rules 中给 chatgpt.com 域名配置上 PROXY 就可以了,但实际不行,它们走的并不是同一条网络链路。

浏览器访问 chatgpt.com 时,请求由 Chrome 或 Safari 发出。浏览器通常会读取 macOS 系统代理,所以 Clash Verge 只要成功接管系统代理,GitHub、YouTube 和 ChatGPT 网页就能访问。

Codex 则包含本机运行的进程,还会调用 Git、curl、npm 等命令。它们各自使用网络库,常见做法是读取 HTTP_PROXYHTTPS_PROXYALL_PROXY。这些进程不一定采用 macOS 系统代理,也不会因为浏览器能联网就自动获得同一条网络路径。

访问方式请求由谁发出常见代理来源
chatgpt.com浏览器macOS 系统代理
Codex 会话ChatGPT/Codex 本机进程进程环境、应用网络配置
Codex 执行命令Git、curl、npm 等子进程shell 或继承的环境变量
TUN 模式虚拟网卡接管流量Clash Verge 路由规则

同一台 Mac 上没有一份能被所有程序强制共享的代理状态。浏览器有自己的网络进程、连接池和缓存,它成功访问 GitHub,只能证明浏览器到 Clash Verge 的路径正常。Codex 是否能联网,要看 Codex 进程启动时继承了什么环境,以及它调用的工具是否识别这些变量。

环境变量还有时间差。写入 ~/.zshrc 后,新开的终端可以读到它,但从 Finder 启动的 GUI 应用不会重新读取 shell 配置。已经运行的 ChatGPT/Codex 也不会自动更新环境。这正是网页一直正常,而 Codex 仍然超时的常见原因。

当前 Clash Verge 的 TUN 是关闭的。因此,那些没有读取系统代理或环境变量的连接会尝试直连。浏览器照常工作,Codex 超时,也就不矛盾了。

Codex 配置中的 network_access = true 也不是代理开关。它只决定沙箱是否允许联网,不负责把请求送到 Clash Verge。

以前没有 .env,为什么 7890 能用

旧 ClashX 的代理端口是 7890,并启用了自动设置系统代理。排查 shell 历史时,发现自己曾手动执行过:

export https_proxy=http://127.0.0.1:7890
export http_proxy=http://127.0.0.1:7890
export all_proxy=socks5://127.0.0.1:7890

所以以前没有 ~/.codex/.env,codex 走代理是通过环境变量配置的。系统代理 cover 了浏览器和部分应用,shell 环境又兼顾了部分命令行程序。它们碰巧都指向 7890,看起来就像 ClashX 直接支持了 Codex 走代理。

换成 Clash Verge 后,Mixed Port 变成 7897。当前只有 7897 在监听,7890 和 7898 都没有服务。如果旧进程仍保存着 7890,或者 Codex 没有读到新的环境变量,就会连接失败。

~/.codex/.env 中增加:

HTTP_PROXY=http://127.0.0.1:7897
HTTPS_PROXY=http://127.0.0.1:7897
ALL_PROXY=socks5://127.0.0.1:7897
NO_PROXY=localhost,127.0.0.1,::1

7897 是 Mixed Port,可以同时处理 HTTP 和 SOCKS5。

如果还要让独立终端中的 Git、curl 和 npm 使用代理,可以在 ~/.zshrc 里设置对应的小写变量。修改 .env 或端口后,要完全退出并重新打开 ChatGPT/Codex,因为已经运行的 GUI 进程不会自动更新环境。

测试时先确认端口:

lsof -nP -iTCP:7897 -sTCP:LISTEN
scutil --proxy
env | rg -i '^(http|https|all|no)_proxy='

再显式通过代理访问 OpenAI API:

curl -I --proxy http://127.0.0.1:7897 \
  https://api.openai.com/v1/models

如果返回 401 Unauthorized,说明网络和 TLS 已经连通,只是请求没有 API 凭据。超时、连接被拒绝或 DNS 失败才属于网络问题。

这次故障和 Clash Verge 本身的兼容性无关。浏览器、Codex 本机进程和命令行工具只是碰巧运行在同一台 Mac 上,它们并不共享一个统一的代理开关。

参考