高效流程与个人知识系统

不开系统代理和 TUN,单独让 Codex、Claude Code、Chrome 走代理

· Zx

局部代理工作流封面图,展示 Codex、Claude Code 和 Chrome 分别接入本机代理端口。
代理CodexClaude CodeChrome

很多人用 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 200HTTP/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

使用时注意两点:

  1. 先用 Command + Q 完全退出普通 Codex。
  2. 以后从这个代理启动器打开 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. 验证是否配置成功

建议按这个顺序验证:

  1. Clash Verge 不开系统代理,不开 TUN,只保持本机代理端口可用。
  2. Chrome 打开 Google、ChatGPT、Claude、X 等网站,确认能访问。
  3. Chrome 打开国内网站,确认速度正常。
  4. 完全退出 Codex,再用代理启动器打开 Codex,发送一条消息。
  5. 新开终端执行 claude,确认 Claude Code 能正常联网。

如果这些都正常,就说明已经实现了“局部代理”。

6. 常见问题

还需要打开 Clash Verge 吗?

需要让 Clash Verge 或它的后台核心提供本机代理端口。

但不需要打开:

  • 系统代理
  • TUN 模式
  • 全局 VPN

可以理解为:

Clash Verge 负责提供 127.0.0.1:7897
Codex / Claude Code / Chrome 自己按需使用这个端口
其他 App 默认不走代理

为什么有时不开代理 Codex 也能回复?

常见原因有三个:

  1. 当前网络可以直连。
  2. Clash Verge 界面没开,但后台核心还在运行。
  3. 当前 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 Codeclaude() 函数临时注入代理变量只影响 Claude Code
Codex 桌面版Chromium 启动参数指定代理只影响该 Codex 进程
ChromeZeroOmega 自动切换只影响命中网站
其他 App不配置代理默认直连

我现在更倾向这种局部代理方案:需要代理的工具自己走代理,不需要代理的应用完全不动。

这样网络环境更干净,也更容易排查问题。