开发者日常卡顿往往不只来自 GitHub。代码拉取、Docker 镜像下载、npm 依赖安装、语言包管理器访问,以及 CI 构建中的外部资源请求,可能分别经过不同的程序、不同的代理入口和不同的 DNS 解析路径。只在桌面客户端里点击“连接”,并不代表终端命令、容器守护进程或远程构建任务已经使用了同一条线路。

更稳妥的做法,是先建立清晰的网络分层:桌面客户端负责系统或应用流量,终端通过环境变量或 Git 配置使用本地代理,Docker 需要单独配置 daemon,npm 则通过包管理器配置代理或使用可信镜像源。本文以 Windows、macOS、Linux 上常见的开发场景为主,也说明 Clash Verge、sing-box、Shadowrocket 等兼容客户端在配置时应注意什么。

先确认客户端与本地代理基础

开发者网络方案的第一步不是修改 Git 或 Docker,而是确认 VPN 客户端已经正确取得线路,并且本机确实存在可用的代理入口。Windows、macOS、Android、iOS 与 Linux 官方客户端通常适合直接连接账户订阅;如果需要精细控制规则,也可以将订阅导入 Clash Verge、sing-box、Shadowrocket 等兼容客户端。不同客户端支持的订阅格式、协议和规则语法可能不同,导入前应以客户端文档和服务面板说明为准。

常见协议包括 Shadowsocks、VMess、Trojan、VLESS、Hysteria2 与 WireGuard。它们不是“速度档位”,而是不同的连接与传输方案。Shadowsocks 配置相对简洁,常用于规则型客户端;VMess、VLESS 与 Trojan 常见于基于 TLS 或其他传输参数的组合;Hysteria2 依赖 UDP 和 QUIC 特性,公共网络限制 UDP 时可能无法使用;WireGuard 则需要客户端能够识别对应的密钥、地址和路由字段。协议兼容不等于线路一定可用,握手参数、DNS、路由和本地防火墙同样重要。

90+

国家覆盖

200+

线路数量

不限

同时在线设备

连接后先不要立即修改一堆规则。可以打开站内的 IP 查询页面,确认出口地区是否发生预期变化,再检查客户端显示的本地 HTTP 或 SOCKS5 监听地址。很多客户端默认只开启系统代理,不一定自动接管所有终端程序;另一些客户端启用 TUN 模式后会改变更多系统流量。开发环境中,建议先记下原有代理设置,方便出现异常时恢复。

GitHub 访问与 Git 命令分别配置

浏览器能够打开 GitHub,并不说明 Git 命令一定走了代理。浏览器可能使用系统代理,Git 则可能直接调用 HTTPS 或 SSH 连接。排查时应先区分仓库地址:以 https:// 开头的远程地址通常可以通过 Git 的 HTTP 代理设置处理;以 git@ssh:// 开头的地址使用 SSH,需要配置 SSH 自己的代理方式。

为 HTTPS 仓库设置代理

假设兼容客户端提供本机 HTTP 代理地址,可以使用类似下面的命令。端口只是示例,必须替换为客户端实际显示的端口:

git config --global http.proxy http://127.0.0.1:PORT
git config --global https.proxy http://127.0.0.1:PORT

git config --global --get http.proxy
git config --global --get https.proxy

如果本地代理要求用户名和密码,不建议把凭据直接写入全局配置,因为 Git 配置文件可能被其他进程或备份工具读取。更安全的做法是让客户端在本机监听无需再次认证的端口,或者使用操作系统凭据管理与 Git Credential Manager。完成测试后,可以使用 git config --global --unset 删除不再需要的代理设置,避免离开当前网络环境后 Git 仍尝试连接失效端口。

Git LFS、子模块和发布脚本可能使用独立的网络请求。主仓库可以正常拉取,但 LFS 对象或子模块仍然失败时,应分别查看它们的远程地址与日志,不要只重复执行 git clone。企业网络还可能对大文件、证书检查或自定义 CA 做额外处理,遇到证书错误时不要贸然关闭 TLS 验证。

SSH 仓库不要照搬 HTTP 设置

SSH 不会读取 Git 的 HTTP 代理配置。需要使用 SSH 时,应在用户目录下的 SSH 配置中声明代理命令,具体写法取决于本地客户端提供的是 SOCKS5 还是 HTTP 代理。例如,支持通过本地 SOCKS5 转发的环境可以参考以下结构:

Host github.com
    HostName github.com
    User git
    Port 22
    ProxyCommand nc -x 127.0.0.1:SOCKS_PORT -X 5 %h %p

部分系统没有预装支持该参数的 nc,或者客户端只提供 HTTP 端口。这时可以改用客户端文档推荐的转发工具,或暂时将仓库远程地址改成 HTTPS。修改前先用 ssh -T [email protected] 检查握手,观察失败发生在 DNS、代理转发、SSH 密钥还是远端权限。GitHub Token、SSH 私钥和代理凭据都不应写入项目脚本或提交记录。

GitHub 配置结论:先确认仓库使用 HTTPS 还是 SSH,再为对应程序设置代理;浏览器能访问并不能代替命令行验证。

Docker Hub 与镜像拉取的分层处理

Docker 是开发环境中最容易出现“客户端已连接但拉取仍失败”的部分。执行 docker pull 时,真正发起请求的通常是 Docker daemon,而不是当前终端窗口。即使终端已经设置了 HTTP_PROXY,daemon 也可能没有继承这些变量。因此需要分别检查 Docker CLI、Docker daemon、Docker Desktop 以及容器内部进程。

如果使用 Docker Desktop,应在其网络或代理设置中查看是否启用系统代理或手动代理,并在修改后重新启动相关服务。Linux 上常见的 systemd 管理方式则需要为 Docker 服务配置代理环境,然后重新加载服务配置。示例结构如下,真实文件位置和管理方式应以发行版说明为准:

[Service]
Environment="HTTP_PROXY=http://127.0.0.1:PORT"
Environment="HTTPS_PROXY=http://127.0.0.1:PORT"
Environment="NO_PROXY=localhost,127.0.0.1,.local"

# 修改服务配置后重新加载并重启 Docker

NO_PROXY 很重要。它可以让本机服务、局域网仓库、内部域名和 Kubernetes API 不必绕过不必要的代理。写得过宽可能导致应走代理的域名被直连,写得过窄则可能让内部开发服务无法访问。修改后可通过 docker info 查看 daemon 的代理状态,再执行一个公开基础镜像的拉取测试。不要把一次成功拉取误认为所有私有仓库、镜像层和认证流程都没有问题。

镜像源、认证与构建阶段

镜像拉取涉及 Registry 地址、认证服务和镜像层下载。即使 Registry 首页能够访问,认证端点或某个 CDN 域名仍可能被分流到错误路径。私有仓库还需要检查登录凭据是否过期,以及 Docker 是否使用了正确的凭据存储。若团队使用内部镜像仓库,应优先按团队网络策略配置,而不是把所有请求强行发送到公共代理。

docker build 又多了一层区别:构建过程中的 RUN 命令是在构建容器内执行的。主机 daemon 能拉取基础镜像,不表示构建脚本中执行的包管理器也能访问外部站点。可以通过构建参数临时传递代理,但要避免将带认证的代理 URL 写入镜像层、构建日志或最终镜像环境。对长期项目,更适合在构建系统中使用受控的 BuildKit Secret、内部缓存或可信制品仓库。

npm、终端环境变量与包管理器配置

npm 的网络请求通常由 Node.js 进程直接发起,不一定跟随桌面客户端的系统代理。最容易维护的方式,是在当前终端会话中设置代理变量,先完成一次验证,再决定是否写入用户级 shell 配置。macOS、Linux 和 Windows PowerShell 的命令格式不同,复制前应确认使用的终端类型。

# macOS / Linux
export HTTP_PROXY=http://127.0.0.1:PORT
export HTTPS_PROXY=http://127.0.0.1:PORT
export NO_PROXY=localhost,127.0.0.1

# Windows PowerShell
$env:HTTP_PROXY="http://127.0.0.1:PORT"
$env:HTTPS_PROXY="http://127.0.0.1:PORT"
$env:NO_PROXY="localhost,127.0.0.1"

npm 也支持独立配置。例如:

npm config set proxy http://127.0.0.1:PORT
npm config set https-proxy http://127.0.0.1:PORT
npm config get registry
npm ping

如果公司或团队规定使用内部 npm Registry,应优先设置 registry,并按照仓库要求处理认证。公共 Registry、内部 Registry 与 Git 依赖可能走不同的地址;安装普通包成功,不代表 package.json 中的 Git URL、二进制下载地址或 postinstall 脚本也能访问。出现安装卡住时,先查看 npm 的详细日志,区分 DNS、TLS、代理拒绝、权限错误和包本身不存在。

npm 配置文件可能位于用户目录,开发机备份、终端录屏和 CI 日志都有可能暴露其中的 Token。检查配置时可以使用 npm config list,但分享输出前应遮盖认证字段。若只是临时测试,优先使用当前会话变量或命令行参数,测试结束后关闭终端,避免全局配置影响其他项目。

让终端代理保持可控

全局代理适合快速判断“当前网络是否能够访问目标”,但不一定适合长期开发。包管理器、内部 Git、数据库、容器 Registry 和本地调试服务经常需要不同的路由。建议把代理设置拆成项目文档中的可选步骤,并明确哪些域名应放进 NO_PROXY。在 Clash Verge 或 sing-box 中,可以用规则组区分代码托管、包仓库、容器服务和本地网络;Shadowrocket 更适合移动端临时验证,不宜把手机上的规则文件未经检查地复制到桌面端。

  1. 先启动一个已确认来源的兼容客户端,并导入订阅。
  2. 确认本地 HTTP 或 SOCKS5 监听地址,再只在当前终端设置代理变量。
  3. 分别执行 Git 远程检查、npm ping 和 Docker 信息检查。
  4. 根据失败的具体组件调整代理,不要一次修改系统代理、DNS 和规则模式。
  5. 测试完成后清理临时变量,确认内部服务仍能通过 NO_PROXY 访问。

CI 构建中的代理、缓存与长期维护

本地开发正常而 CI 失败,通常不是同一个问题的重复表现。CI Runner 可能位于不同地区、不同网络出口和不同权限环境中,也可能根本没有安装桌面客户端。工作流中的 Git checkout、npm install、Docker build、镜像推送和测试脚本,可能分别由不同 Action、插件或子进程发起。应先确认 Runner 是否被允许使用代理,再决定在哪里注入配置。

对于 CI,代理地址、访问 Token 和 Registry 密码应存放在平台提供的 Secret 或变量管理中,避免直接写入 YAML。环境变量可以传递给构建步骤,但要检查日志是否会回显完整命令。第三方依赖下载还可以通过锁定依赖版本、包缓存、Docker layer cache 和内部制品仓库降低对外部网络的依赖。缓存不是凭据存储,缓存键和缓存内容仍要避免包含 Token 或私有源响应。

分流规则在 CI 中尤其需要谨慎。公共依赖可能需要代理,内部 Git、内网 API 和私有 Registry 则可能要求直连或专用网络。可以将这些目标明确列入 NO_PROXY,并在构建日志中只记录域名、状态码和失败阶段,不记录完整请求头。若使用自托管 Runner,还要限制本机代理监听范围,避免代理端口暴露给同一网络中的其他设备。

开发环节 实际发起请求的组件 优先检查内容
GitHub HTTPS Git 客户端 http.proxy、https.proxy、凭据与证书
GitHub SSH SSH 客户端 Host 配置、ProxyCommand、密钥权限
Docker pull Docker daemon daemon 代理、Registry、认证与 DNS
npm install Node.js 与 npm registry、代理变量、Git 依赖与脚本
CI 构建 Runner、Action 与构建容器 Secret 注入、日志脱敏、缓存和 NO_PROXY

成本控制也应纳入方案设计。日常只拉取代码、安装少量依赖的设备,可以选择月订阅中的 ¥9.9/月含 60GB;依赖较多、经常构建镜像的团队成员,可以根据实际用量考虑 ¥18/月含 250GB 或 ¥28/月含 500GB。流量按开通日每月重置,中途升级差价折算成剩余天数。若使用周期不固定,也可以考虑用完为止、永久不过期的流量包:¥158/300GB、¥358/1000GB、¥658/3000GB。实际选择应以开发机、容器下载和 CI 是否共用账户为依据,不要只看单次下载速度。

PeeVPN 支持 Windows、macOS、iOS、Android 与 Linux,同时在线设备数不限台数,节点覆盖 90+ 国家、200+ 线路。注册无需邮箱地址,可使用用户名与密码完成账户创建;支付方式包括支付宝、微信与 USDT,并提供 30 天无理由退款。开发环境中仍应遵循最小权限原则:不同用途尽量使用独立凭据,订阅链接只导入可信客户端,项目仓库和 CI 日志不要保存任何真实密钥。

最终检查结论:稳定的开发网络不是把所有流量都交给代理,而是让 Git、Docker、npm、CI 和内部服务各自走清楚、可验证、可撤销的路径。