很多人用 AI 工具时会直接打开系统代理或 TUN。
这样确实省事,但副作用也明显:所有 App 都可能被代理接管,国内软件变慢,部分客户端异常,排查网络问题时也更混乱。
我现在更推荐一种更克制的配置方式:
Clash Verge 只提供本机代理端口,不打开系统代理,不打开 TUN;需要代理的应用自己指定代理。
最终效果是:
- Codex 桌面版:通过专用启动器走代理。
- Claude Code CLI:只在运行
claude时临时走代理。 - Chrome:通过 ZeroOmega 只让指定网站走代理。
- 其他国内软件和普通网站:默认直连。
下面以 macOS + Clash Verge 为例,代理端口使用 127.0.0.1:7897。如果你的端口不同,把文中的 7897 替换成自己的端口即可。
1. 先确认本机代理端口可用
先确认 Clash Verge 或代理核心正在运行,并且本机端口能连通。
nc -vz 127.0.0.1 7897
如果返回类似下面这样,说明端口可用:
Connection to 127.0.0.1 port 7897 succeeded!
也可以用代理访问 Google 验证:
curl -x http://127.0.0.1:7897 -I https://www.google.com --max-time 12
能返回 HTTP/2 200 或 HTTP/1.1 200,基本就说明代理链路正常。
注意,这一步只要求代理工具提供本机端口,不需要开启系统代理,也不需要开启 TUN。
2. Claude Code:只在运行时临时注入代理
我不希望整个终端会话默认走代理,所以没有直接在 shell 里永久 export HTTP_PROXY。
更稳的做法是:给 claude 包一层函数,只在执行 Claude Code 时临时注入代理环境变量。
编辑 ~/.zshrc:
# 本机代理端口。端口不同的话,只改这里即可。
export LOCAL_PROXY_HOST="127.0.0.1"
export LOCAL_PROXY_PORT="7897"
# 开启当前终端会话的代理,适合临时调试 curl、npm 等命令。
function proxy_on() {
export ALL_PROXY="socks5://${LOCAL_PROXY_HOST}:${LOCAL_PROXY_PORT}"
export HTTPS_PROXY="http://${LOCAL_PROXY_HOST}:${LOCAL_PROXY_PORT}"
export HTTP_PROXY="http://${LOCAL_PROXY_HOST}:${LOCAL_PROXY_PORT}"
export NO_PROXY="localhost,127.0.0.1,::1"
export all_proxy="$ALL_PROXY"
export https_proxy="$HTTPS_PROXY"
export http_proxy="$HTTP_PROXY"
export no_proxy="$NO_PROXY"
echo "代理已开启: $HTTP_PROXY"
}
# 关闭当前终端会话的代理,避免其他命令误走代理。
function proxy_off() {
unset ALL_PROXY HTTPS_PROXY HTTP_PROXY NO_PROXY
unset all_proxy https_proxy http_proxy no_proxy
echo "代理已关闭"
}
# Claude Code 专用包装:只在 claude 进程内注入代理变量。
function claude() {
local proxy_http="http://${LOCAL_PROXY_HOST}:${LOCAL_PROXY_PORT}"
local proxy_socks="socks5://${LOCAL_PROXY_HOST}:${LOCAL_PROXY_PORT}"
local proxy_bypass="localhost,127.0.0.1,::1"
# 部分非交互终端里 TERM 可能为空或 dumb,这里补一个可用终端类型,避免 CLI 渲染异常。
if [[ -z "${TERM:-}" || "$TERM" == "dumb" ]]; then
HTTP_PROXY="$proxy_http" HTTPS_PROXY="$proxy_http" ALL_PROXY="$proxy_socks" NO_PROXY="$proxy_bypass" \
http_proxy="$proxy_http" https_proxy="$proxy_http" all_proxy="$proxy_socks" no_proxy="$proxy_bypass" \
TERM=xterm-256color command claude "$@"
else
HTTP_PROXY="$proxy_http" HTTPS_PROXY="$proxy_http" ALL_PROXY="$proxy_socks" NO_PROXY="$proxy_bypass" \
http_proxy="$proxy_http" https_proxy="$proxy_http" all_proxy="$proxy_socks" no_proxy="$proxy_bypass" \
command claude "$@"
fi
}
保存后执行:
source ~/.zshrc
之后直接运行:
claude
Claude Code 会走 127.0.0.1:7897,但终端里的其他命令不会被强制代理。
3. Codex 桌面版:用启动参数指定代理
Codex 桌面版是 Electron / Chromium 应用,可以通过 Chromium 启动参数指定代理。
命令方式如下:
open -na "/Applications/Codex.app" --args \
--proxy-server="http://127.0.0.1:7897" \
--proxy-bypass-list="localhost;127.0.0.1;[::1]"
为了不用每次手动输入命令,可以做一个单独的 macOS 启动器,例如 Codex Proxy Launcher.app。
启动器里的 AppleScript 逻辑可以写成这样:
(*
* Codex 代理启动器。
*
* 用途:通过 Chromium 启动参数打开 Codex,并仅让本次启动的 Codex 进程走本机代理。
* 参数:无。
* 返回值:无。
* 失败场景:Codex.app 不存在、代理端口未监听,或 macOS open 命令执行失败。
*)
on run
set codexPath to "/Applications/Codex.app"
set proxyServer to "http://127.0.0.1:7897"
set bypassList to "localhost;127.0.0.1;[::1]"
-- 代理参数只注入 Codex 进程,避免影响系统代理、TUN 或其他应用的网络访问。
do shell script "open -na " & quoted form of codexPath & " --args --proxy-server=" & quoted form of proxyServer & " --proxy-bypass-list=" & quoted form of bypassList
end run
使用时注意两点:
- 先用
Command + Q完全退出普通 Codex。 - 以后从这个代理启动器打开 Codex。
这个方式不会打开系统代理,也不会影响其他 App,只影响通过这个启动器启动的 Codex 进程。
4. Chrome:用 ZeroOmega 只代理指定网站
Chrome 我用 ZeroOmega 做自动切换。
核心思路是:
- 默认直连。
- 只有指定域名走代理。
- 本地地址永远绕过代理。
代理情景模式可以这样配:
协议:http
服务器:127.0.0.1
端口:7897
绕过列表:
127.0.0.1
::1
localhost
自动切换模式里,默认规则设为直连:
defaultProfileName: direct
然后把需要代理的网站加入规则,例如:
*.google.com
*.youtube.com
*.openai.com
*.chatgpt.com
*.anthropic.com
*.claude.ai
*.x.com
*.twitter.com
*.github.com
这样 Chrome 访问国内网站时仍然直连,只有命中的网站才会走 127.0.0.1:7897。
5. 验证是否配置成功
建议按这个顺序验证:
- Clash Verge 不开系统代理,不开 TUN,只保持本机代理端口可用。
- Chrome 打开 Google、ChatGPT、Claude、X 等网站,确认能访问。
- Chrome 打开国内网站,确认速度正常。
- 完全退出 Codex,再用代理启动器打开 Codex,发送一条消息。
- 新开终端执行
claude,确认 Claude Code 能正常联网。
如果这些都正常,就说明已经实现了“局部代理”。
6. 常见问题
还需要打开 Clash Verge 吗?
需要让 Clash Verge 或它的后台核心提供本机代理端口。
但不需要打开:
- 系统代理
- TUN 模式
- 全局 VPN
可以理解为:
Clash Verge 负责提供 127.0.0.1:7897
Codex / Claude Code / Chrome 自己按需使用这个端口
其他 App 默认不走代理
为什么有时不开代理 Codex 也能回复?
常见原因有三个:
- 当前网络可以直连。
- Clash Verge 界面没开,但后台核心还在运行。
- 当前 Codex 会话已经建立连接,短时间内还能继续使用。
如果新开 Codex 或 Claude Code 后连接失败,再打开 Clash Verge,但仍然不用开系统代理和 TUN。
端口不是 7897 怎么办?
把所有 7897 替换成你的实际端口。
常见端口有:
7890
7897
1087
以你的代理工具设置页面为准。
7. 回滚方式
如果不想继续使用这套方案:
- Claude Code:删除或注释
~/.zshrc里的claude()包装函数,然后source ~/.zshrc。 - Codex:直接从
/Applications/Codex.app打开,不用代理启动器。 - Chrome:把 ZeroOmega 切回
direct,或删除自动切换规则。 - Clash Verge:继续保持系统代理和 TUN 关闭即可。
最终配置清单
| 工具 | 配置方式 | 影响范围 |
|---|---|---|
| Clash Verge | 只提供本机代理端口 127.0.0.1:7897 | 不接管系统 |
| Claude Code | claude() 函数临时注入代理变量 | 只影响 Claude Code |
| Codex 桌面版 | Chromium 启动参数指定代理 | 只影响该 Codex 进程 |
| Chrome | ZeroOmega 自动切换 | 只影响命中网站 |
| 其他 App | 不配置代理 | 默认直连 |
我现在更倾向这种局部代理方案:需要代理的工具自己走代理,不需要代理的应用完全不动。
这样网络环境更干净,也更容易排查问题。
