软件开发者使用 Clash 时,真正需要解决的往往不是浏览器能否打开网页,而是终端里的开发工具是否稳定:GitHub 仓库拉取超时、git push 卡在认证阶段、SSH 连接频繁断开,或者 Homebrew 下载依赖速度极慢。浏览器代理正常,并不代表命令行程序已经正确使用代理,因为 Git、SSH、Homebrew 和包管理器通常各自读取不同的代理配置。
本文以常见的 Clash Verge、Clash Verge Rev、Clash for Windows、ClashX 和 Mihomo 为例,建立一套适合日常开发的代理工作流。你将学会如何确认 Clash 端口、为终端设置临时或永久代理、让 Git 使用 HTTP 或 SOCKS5、通过 SSH 的 ProxyCommand 连接代码托管平台,并为 Homebrew 配置稳定的下载路径。示例默认 Clash 的 HTTP 代理端口为 7890、SOCKS5 端口为 7891,实际使用时请以客户端面板显示的端口为准。
先确认 Clash 端口与基础连通性
配置开发工具之前,第一步不是修改 Git,而是确认 Clash 本身正在运行,并且本机代理端口可以被终端访问。不同客户端的端口名称可能略有区别:Clash Verge 通常在设置或运行状态页显示 HTTP、SOCKS 和混合端口;Mihomo 配置文件中常见字段是 mixed-port、port 与 socks-port。
如果配置了 mixed-port,同一个端口一般可以同时接受 HTTP 代理和 SOCKS5 请求,适合简化终端设置。例如:
mixed-port: 7890 # HTTP 与 SOCKS5 共用 allow-lan: false # 仅本机使用时更安全 mode: rule log-level: info
端口确认后,可以用 curl 测试代理是否真的生效。测试时建议同时访问一个国内站点和一个需要代理的开发服务,这样能区分「端口没有监听」与「规则或节点不可用」两类问题。
# HTTP 代理测试 curl -I -x http://127.0.0.1:7890 https://github.com # SOCKS5 代理测试,使用 socks5h 让域名解析也交给代理 curl -I --proxy socks5h://127.0.0.1:7891 https://github.com # 查看当前 Clash 是否能访问 GitHub API curl -x http://127.0.0.1:7890 https://api.github.com
socks5h 会把域名解析请求一起交给代理端处理,可以减少本地 DNS 污染或解析失败。若只写 socks5,部分工具可能先在本地解析域名,再把 IP 发给代理。为终端建立可控的代理环境
Git、Homebrew、npm、pip、cargo 等命令行工具通常能够读取标准环境变量。最常用的是 HTTP_PROXY、HTTPS_PROXY 和 ALL_PROXY。其中,HTTPS_PROXY 虽然名称中包含 HTTPS,但它表示「访问 HTTPS 目标时使用的代理」,代理地址本身仍然可以是普通 HTTP 代理。
临时设置适合偶尔使用代理的场景。关闭当前终端窗口后,设置通常会自动失效,不会影响其他程序。
# HTTP 代理方式,适合 Git 和大多数命令行工具 export HTTP_PROXY=http://127.0.0.1:7890 export HTTPS_PROXY=http://127.0.0.1:7890 # 需要 SOCKS5 时使用 socks5h,支持域名由代理解析 export ALL_PROXY=socks5h://127.0.0.1:7891 # 检查变量是否生效 env | grep -i proxy
如果你长期需要代理,可以将设置写入 shell 配置文件。macOS 和大多数 Linux 发行版的新终端默认使用 zsh,配置文件通常是 ~/.zshrc;使用 Bash 时则可能是 ~/.bashrc。不建议无条件把代理写死在所有环境中,最好用函数控制开关,避免在公司网络、服务器或不需要代理的环境里产生意外影响。
# 写入 ~/.zshrc 或 ~/.bashrc proxy_on() { export HTTP_PROXY=http://127.0.0.1:7890 export HTTPS_PROXY=http://127.0.0.1:7890 export ALL_PROXY=socks5h://127.0.0.1:7891 echo "Clash proxy enabled" } proxy_off() { unset HTTP_PROXY HTTPS_PROXY ALL_PROXY unset http_proxy https_proxy all_proxy echo "Clash proxy disabled" } # 重新加载配置 source ~/.zshrc # 使用 proxy_on proxy_off
环境变量名称最好同时设置大写和小写版本,因为不同工具的实现并不完全一致。有些程序只读取大写变量,有些程序只读取小写变量。如果发现终端中的某个工具不听从代理设置,可以先检查变量是否存在,再查看该工具自身的代理配置。
Git:HTTP 与代理配置
通过 HTTPS 地址克隆仓库时,Git 可以直接使用 HTTP 代理或 SOCKS5 代理。推荐先使用 Git 自己的配置,而不是只依赖全局环境变量,因为这样可以明确控制 Git 行为,也方便在不同项目之间切换。
# HTTPS 仓库使用 HTTP 代理 git config --global http.proxy http://127.0.0.1:7890 git config --global https.proxy http://127.0.0.1:7890 # 如果客户端支持,也可以使用 SOCKS5 git config --global http.proxy socks5h://127.0.0.1:7891 git config --global https.proxy socks5h://127.0.0.1:7891 # 查看当前 Git 代理 git config --global --get-regexp 'http.*proxy'
如果只希望 GitHub 使用代理,而不希望公司 GitLab、内网代码仓库或国内镜像跟随代理,可以使用按域名匹配的配置。这样可以减少不必要的绕行,也避免内网地址因代理无法访问。
# 清除全局代理,避免所有 Git 仓库都走代理 git config --global --unset http.proxy git config --global --unset https.proxy # 仅对 github.com 生效 git config --global http.https://github.com.proxy http://127.0.0.1:7890 git config --global https.https://github.com.proxy http://127.0.0.1:7890 # 删除按域名配置 git config --global --unset http.https://github.com.proxy git config --global --unset https.https://github.com.proxy
设置完成后,用 git ls-remote 测试远程仓库比直接执行 git clone 更方便,因为它只读取远程引用,不会先下载完整项目。
- 执行
git remote -v,确认仓库地址是 HTTPS 还是 SSH。 - 对 HTTPS 仓库执行
git ls-remote https://github.com/组织名/项目名.git。 - 如果返回分支和标签列表,说明 Git 的 HTTPS 代理已经生效。
- 如果提示认证失败,优先检查 Token、凭据管理器或账户权限,不要把认证问题误判为代理问题。
SSH 仓库的代理与 ProxyCommand
很多开发者发现浏览器和 HTTPS Git 都能使用,但 SSH 地址仍然连接超时。原因是 SSH 不会自动读取 Git 的 HTTP 代理配置。对于 [email protected]:组织名/项目名.git 这类地址,需要在 SSH 配置中明确指定代理命令。
Clash 通常不会直接提供一个名为「SSH 代理」的独立开关,而是通过 SOCKS5 端口转发 SSH TCP 连接。OpenSSH 自带的 nc 或系统中的 netcat 可以作为中间程序;不同系统的参数略有差异,macOS、Linux 和较新的 Windows OpenSSH 通常可以使用以下写法。
# GitHub SSH over Clash SOCKS5 Host: github.com HostName: github.com User: git Port: 22 ProxyCommand: nc -x 127.0.0.1:7891 %h %p IdentityFile: ~/.ssh/id_ed25519 IdentitiesOnly: yes
其中,%h 会被替换为目标主机名,%p 会被替换为目标端口。IdentitiesOnly yes 可以避免 SSH 代理一次尝试过多密钥,减少出现 Too many authentication failures 的概率。如果你的系统中没有支持 -x 参数的 netcat,可以安装兼容版本,或改用 Python、connect-proxy 等本地转发工具。
配置完成后,先不要直接推送代码,使用详细日志测试连接:
# 查看 SSH 详细连接过程 ssh -vT [email protected] # 查看当前仓库使用的远程地址 git remote -v # 测试仓库远程引用 git ls-remote [email protected]:组织名/项目名.git
如果日志显示连接已经建立,但随后提示权限拒绝,说明代理链路大概率正常,问题转向 SSH 密钥或 GitHub 账户授权。可以使用 ssh-add -l 查看当前已加载的密钥,并检查公钥是否已经添加到代码托管平台。相反,如果日志停留在连接阶段并持续超时,则应检查 SOCKS5 端口、Clash 规则和节点可用性。
Homebrew 与依赖管理工具
Homebrew 的访问通常包含两类请求:访问 Git 仓库获取 Formula、Cask 元数据,以及从镜像或 GitHub Releases 下载实际软件包。只设置一个环境变量并不一定覆盖所有请求,因此建议先让终端代理正常工作,再根据下载日志判断具体失败环节。
在 macOS 或 Linux 上,Homebrew 通常会读取终端中的 http_proxy、https_proxy 和 all_proxy。可以先用代理函数启用环境,再执行更新或安装:
# 同时设置大小写变量,兼容不同工具 export http_proxy=http://127.0.0.1:7890 export https_proxy=http://127.0.0.1:7890 export all_proxy=socks5h://127.0.0.1:7891 # 检查 Homebrew 环境和仓库状态 brew config brew doctor # 更新索引并安装软件 brew update brew install wget
如果 Homebrew 报错来自 Git 操作,可以检查 Homebrew 仓库地址和 Git 代理配置;如果 Git 操作成功但二进制下载失败,则可能是下载域名没有命中代理规则,或当前节点不适合大文件传输。建议在 Clash 的连接面板中观察实际请求域名,再为相关域名调整规则,而不是盲目让所有流量都走代理。
同一套终端代理也可以服务其他开发工具,但每个工具的配置方式仍有差异:
- npm:使用
npm config set proxy和npm config set https-proxy,也可以读取环境变量。 - pnpm:通常继承 npm 配置,但应通过
pnpm config get proxy确认实际值。 - pip:可以使用
--proxy参数或pip.ini、pip.conf配置。 - cargo:一般读取系统代理变量,也可以在
~/.cargo/config.toml中单独指定。 - Docker:Docker 守护进程与当前 shell 是两个环境,终端变量不会自动传递给后台服务,需要单独配置 daemon 代理。
规则分流与常见故障排查
开发者代理不应该简单理解为「所有流量都走代理」。更合理的方式是让 GitHub、GitLab、代码发布平台和必要的依赖下载域名走代理,国内镜像、局域网地址和公司内部服务直连。这样可以降低延迟、节省节点带宽,也减少访问内网服务时的路由冲突。
可以在 Clash 配置中为常见开发平台增加域名规则,并将它们放在通用规则之前。策略组名称需要替换为你自己的实际名称。
rules: - DOMAIN-SUFFIX,github.com,PROXY - DOMAIN-SUFFIX,githubusercontent.com,PROXY - DOMAIN-SUFFIX,githubassets.com,PROXY - DOMAIN-SUFFIX,gitlab.com,PROXY - DOMAIN-SUFFIX,github.io,PROXY - DOMAIN-SUFFIX,lan,DIRECT - IP-CIDR,192.168.0.0/16,DIRECT,no-resolve - IP-CIDR,10.0.0.0/8,DIRECT,no-resolve - MATCH,DIRECT
排查时可以按照「端口、环境变量、工具配置、规则、认证」的顺序进行,不要一次修改多个地方。下面是最常见的故障与处理方向:
- curl 连接拒绝:通常表示端口错误、Clash 未启动,或客户端只监听了其他端口。先在面板确认 HTTP、SOCKS5 或混合端口。
- 浏览器正常但 Git 不通:浏览器可能使用了系统代理或 TUN 模式,而终端没有代理变量。执行
env | grep -i proxy并检查 Git 配置。 - HTTPS Git 可以用但 SSH 不通:Git 的 HTTP 代理不会作用于 SSH,需要在
~/.ssh/config中添加ProxyCommand。 - SSH 报认证失败:检查密钥路径、公钥授权和
ssh-add状态。代理连接成功不等于账户认证成功。 - Homebrew 更新成功但安装下载失败:观察失败 URL,确认该域名是否命中代理规则,并检查节点是否支持稳定的大文件传输。
- 内网 GitLab 无法访问:检查是否错误地设置了全局代理,必要时清除 Git 全局代理,改用按域名配置。
- 切换网络后配置失效:确认 Clash 的系统代理、TUN 模式和终端代理是否重复启用。多层代理可能导致连接循环或延迟增加。
curl 验证代理端口,再用 git ls-remote 验证 Git,最后用 ssh -vT 验证 SSH。每一步只验证一个环节,定位问题会比直接反复执行 git clone 更快。完成配置后,建议把个人开发环境整理成一份可迁移的清单:记录 Clash 的 HTTP 和 SOCKS5 端口、终端开关函数、Git 的全局或按域名代理、SSH 配置中的密钥路径,以及需要直连的内网域名。这样即使更换客户端或电脑,也只需要替换端口和节点名称,不必重新摸索整套工作流。对于团队环境,则应避免把个人代理地址、密钥和包含敏感信息的配置提交到仓库中。
Clash 在开发场景中的价值,不只是让某个网页加载更快,而是把 Git、SSH、Homebrew 和各种依赖工具纳入统一、可观察、可切换的网络路径。先确认端口,再选择合适的协议;让 HTTPS 工具使用 Git 或环境变量代理,让 SSH 通过 SOCKS5 的 ProxyCommand 转发,同时用规则把外网开发平台与内网服务合理分流,就能在稳定性、安全性和速度之间取得更好的平衡。