一、为什么浏览器通了,终端还在直连?
macOS「系统设置 → 网络 → 详细信息 → 代理」或 Clash 自带的「设置为系统代理」主要影响遵循系统代理栈的应用:多数图形界面浏览器会走这一套。而你在终端里运行的 curl、git、npm、pip 等,通常各自实现网络栈,默认只认进程环境变量或自身配置文件,不会去读系统代理 XML 或 PAC。除非某些工具显式集成「自动检测系统代理」(并不普遍),否则表现为:网页能开,CLI 仍按直连出口访问,在受限网络下就会超时或 TLS 握手失败。
另一条常见误解是「我开了 TUN 模式,为什么终端还不走核?」若 TUN 未真正接管该进程的流量、或规则把目标域名标成直连、或 DNS 仍解析到不可达地址,终端行为仍可能与浏览器不一致。本文聚焦最通用、与模式无关的一层:给 Shell 与常见工具链补上标准代理环境变量,让出站明确经过本机 Clash 混合端口;这样即使暂时不用 TUN,也能先把 curl / git / npm 跑通。更细的报错分类可对照《Clash 常见报错解决方案》。
二、先确认 Clash 监听地址与混合端口
打开你所用客户端的设置页或 config.yaml,记下 mixed-port(混合端口,常见 7890)或单独的 port(HTTP)。混合端口同时接受 HTTP 与 SOCKS 入站,对工具链兼容性最好,下文默认端口为 7890,请替换成你的实际值。确认服务监听在 127.0.0.1:7890 或 0.0.0.0:7890;仅本机终端使用时,127.0.0.1 足够。
若你还需要让局域网其他设备或虚拟机连入同一端口,需开启「允许局域网连接」一类选项,使 allow-lan 为 true,这与《Clash 开启局域网代理》中的思路一致。纯本机终端场景一般不必开放局域网,但若 curl -x 指向 127.0.0.1 仍拒绝连接,应检查是否误绑到了别的接口或端口被占用。
三、当前终端会话:export 标准代理变量
在 zsh 或 bash 中,可先临时导出(HTTP 代理 URI 指向混合端口,协议写 http:// 即可,由 Clash 负责向上游转发):
export HTTP_PROXY="http://127.0.0.1:7890"
export HTTPS_PROXY="http://127.0.0.1:7890"
export http_proxy="http://127.0.0.1:7890"
export https_proxy="http://127.0.0.1:7890"
export ALL_PROXY="http://127.0.0.1:7890"
export all_proxy="http://127.0.0.1:7890"
同时建议设置 NO_PROXY,避免访问内网 Git、公司 Registry、localhost 时误走代理:
export NO_PROXY="localhost,127.0.0.1,::1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16"
export no_proxy="localhost,127.0.0.1,::1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16"
内网网段列表可按环境增删;若某些工具不认 CIDR 写法,可改成逗号分隔的精确主机名。大小写成对设置能覆盖只认大写或只认小写的程序,减少「明明 export 了却不生效」的困惑。
四、用 curl 做最小验证
在已 export 的同一终端窗口执行:
curl -I --max-time 15 https://www.google.com/generate_204
若环境变量生效,请求应经 Clash 出站并在客户端连接列表中出现对应会话。也可显式指定代理对照测试:
curl -x http://127.0.0.1:7890 -I --max-time 15 https://www.google.com/generate_204
当「显式 -x 成功、仅靠环境变量失败」时,说明该次 curl 未读到变量(例如用了 sudo 导致环境被清洗),或当前 shell 配置文件里有覆盖。若两者皆失败,优先查 Clash 是否运行、端口是否一致、规则是否把目标设为直连且出口不可达。
五、Git:环境变量、http.proxy 与 SSH 分流
git 走 HTTPS 远程时,会尊重 HTTP_PROXY / HTTPS_PROXY,因此上一节的 export 往往已足够。若你希望与 Shell 解耦,可仅对 Git 设置:
git config --global http.proxy http://127.0.0.1:7890
git config --global https.proxy http://127.0.0.1:7890
若只有部分 HTTPS 远程需要代理(例如仅 GitHub),可为该 URL 单独指定,避免其它 origin 误走代理:
git config --global http.https://github.com.proxy http://127.0.0.1:7890
内网 origin 请勿设置对应键,或显式清空。若远程是 SSH([email protected]:),HTTPS 代理不会生效,需要改用 HTTPS 远程地址,或为 SSH 配置 ProxyCommand 走 nc / connect 经本地 SOCKS,这与 HTTP 代理是两条路径,勿混用。团队规范若禁止全局 git config,可仅在项目目录使用 --local。
六、npm、yarn 与 pnpm
npm 会读取环境变量,因此全局限定在 Shell 里 export 通常即可。若需写入用户配置:
npm config set proxy http://127.0.0.1:7890
npm config set https-proxy http://127.0.0.1:7890
取消时使用 npm config delete proxy 与 npm config delete https-proxy。yarn(v1)可用 yarn config set proxy;pnpm 同样优先继承环境变量。注意公司内网 Registry 若域名在 NO_PROXY 中,应避免再被代理拦截。若仅 npm 失败而 curl 正常,优先检查 registry 是否指向内网、证书替换、以及是否有 .npmrc 覆盖了代理相关项。
七、写入 ~/.zshrc:持久化与一键关闭
将 export 块追加到 ~/.zshrc 后执行 source ~/.zshrc 或新开终端即可长期生效。建议用注释包一层,便于切换:
# Clash proxy (toggle manually)
export HTTP_PROXY="http://127.0.0.1:7890"
export HTTPS_PROXY="http://127.0.0.1:7890"
export ALL_PROXY="http://127.0.0.1:7890"
export NO_PROXY="localhost,127.0.0.1,::1"
需要恢复直连时,可在当前会话 unset HTTP_PROXY HTTPS_PROXY ALL_PROXY http_proxy https_proxy all_proxy,或临时注释上述行。若使用多个配置文件(.zprofile、.zshenv),注意加载顺序,避免后加载文件把代理清空。使用 sudo 执行命令时,若系统配置了安全路径,可能看不到你的代理变量,必要时应在 root 侧单独评估风险后再设置,或避免对需代理的命令加 sudo。
八、何时用 SOCKS5 与 ALL_PROXY
部分 CLI 仅识别 SOCKS5。Clash 若单独暴露 SOCKS 端口(例如 7891),可设:
export ALL_PROXY="socks5://127.0.0.1:7891"
与 HTTP 混用时,以工具文档为准:有的优先读 HTTPS_PROXY,有的只看 ALL_PROXY。混合端口场景下统一写 http://127.0.0.1:7890 通常最简单;若遇到某工具坚持 SOCKS,再为该工具单独导出 SOCKS 地址,避免全局把 ALL_PROXY 改成 SOCKS 导致只认 HTTP 代理的程序异常。
九、排错清单(按顺序做)
① 本机 curl -x http://127.0.0.1:端口 是否成功;② 同一终端 env | grep -i proxy 是否出现预期值;③ Clash 连接日志是否有来自本机的入站;④ 规则是否将测试域名指向错误策略组;⑤ DNS 是否为 fake-ip 与工具预期不一致;⑥ 是否混用 sudo、CI 环境、或 IDE 内置终端未加载 .zshrc。逐项缩小范围后,多数「终端直连」问题都能落在「变量未加载」「端口写错」「Git SSH 与 HTTPS 混淆」三类之一。
十、小结
macOS 终端代理的核心是接受「系统代理 ≠ 终端默认行为」这一事实,把 HTTPS_PROXY、HTTP_PROXY 与可选的 ALL_PROXY 统一指到 Clash 混合端口,并用 NO_PROXY 保护内网与本地回环;git 代理与 npm 代理可在环境变量之外再加一层专用配置,以便项目级与团队级管理。相比反复切换系统面板,在 Shell 层显式控制更清晰,也与 Docker、CI 等场景的配置方式一致。若你希望用图形界面查看端口、连接记录与规则命中,减少手写配置出错,可从本站获取 macOS 客户端:→ 立即免费下载 Clash,开启流畅上网新体验