打开了代理,浏览器访问 GitHub 没问题,但终端里 git clone 还是超时。这是系统代理的局限:它只处理支持 HTTP 代理协议的应用层请求,命令行工具默认不走它。
解决这个问题有两条路:让所有工具走 TUN 模式,或者逐个给工具配置代理。
01 为什么系统代理不够用
macOS 和 Windows 的”系统代理”设置,本质上是一个约定:告诉支持这个约定的应用,HTTP/HTTPS 请求应该发给代理端口。
浏览器、Electron 应用(VS Code、Figma)默认会读这个设置。但大多数命令行工具不会——它们直接发起 TCP 连接,不查系统代理配置。
结果就是:代理客户端开着,终端工具仍然直连。
02 TUN 模式:一劳永逸
TUN 模式在网络层拦截所有流量,包括 UDP 和绕过系统代理的 TCP 连接。开启之后,git、npm、pip、curl、Docker——所有工具的网络请求都经过代理,不需要任何额外配置。
这是最简洁的方案。如果你经常在终端做开发工作,TUN 模式应该是默认开启的状态,而不是偶尔需要时再想起来打开。
Terraka 在 macOS 和 Windows 上都支持 TUN 模式。具体开启步骤参见TUN 模式配置指南。
开启 TUN 模式需要管理员权限,首次启动时会弹权限请求。这是正常行为——TUN 模式需要在系统网络层安装虚拟网卡驱动。
03 手动配置各工具代理
如果你不想用 TUN 模式,或者在 Linux 上(暂不支持 TUN),可以逐个给工具配置代理。
Terraka 默认监听:
- HTTP 代理:
127.0.0.1:7890 - SOCKS5 代理:
127.0.0.1:7891
(可在 Terraka 设置里确认或修改端口号)
04 git
临时设置(仅当前终端会话):
export https_proxy=http://127.0.0.1:7890
export http_proxy=http://127.0.0.1:7890
永久设置 git 全局代理:
git config --global http.proxy http://127.0.0.1:7890
git config --global https.proxy http://127.0.0.1:7890
只对 GitHub 生效:
git config --global http.https://github.com.proxy http://127.0.0.1:7890
取消代理:
git config --global --unset http.proxy
git config --global --unset https.proxy
如果你用 SSH 协议克隆(git@github.com:...),需要额外配置 ~/.ssh/config:
Host github.com
ProxyCommand nc -x 127.0.0.1:7891 %h %p
(nc 需要支持 SOCKS,macOS 自带版本支持,Linux 需要 netcat-openbsd)
05 npm / yarn / pnpm
# npm
npm config set proxy http://127.0.0.1:7890
npm config set https-proxy http://127.0.0.1:7890
# yarn
yarn config set proxy http://127.0.0.1:7890
yarn config set https-proxy http://127.0.0.1:7890
# pnpm
pnpm config set proxy http://127.0.0.1:7890
pnpm config set https-proxy http://127.0.0.1:7890
取消:
npm config delete proxy
npm config delete https-proxy
如果你在用 nrm 管理镜像源,切换到 npmjs 官方源时记得同时设置代理,避免直连超时。国内开发一个常见的最佳实践是:访问 npm 官方源时走代理,访问 taobao/cnpm 镜像时直连。
06 pip
pip install package-name --proxy http://127.0.0.1:7890
永久配置,编辑(或创建)~/.config/pip/pip.conf(macOS/Linux)或 %APPDATA%\pip\pip.ini(Windows):
[global]
proxy = http://127.0.0.1:7890
07 Docker
Docker 的代理配置分两部分:拉取镜像(Docker daemon 的网络请求)和容器内的网络请求。
拉取镜像(daemon 代理):
编辑(或创建)~/.docker/config.json:
{
"proxies": {
"default": {
"httpProxy": "http://127.0.0.1:7890",
"httpsProxy": "http://127.0.0.1:7890",
"noProxy": "localhost,127.0.0.1"
}
}
}
或者在 Docker Desktop 里:Settings → Resources → Proxies,手动填入。
容器内代理:
docker run -e http_proxy=http://host.docker.internal:7890 \
-e https_proxy=http://host.docker.internal:7890 \
image-name
注意:容器内用 host.docker.internal 访问宿主机(macOS/Windows Docker Desktop 支持),Linux 上需要用 --network=host 或宿主机的实际内网 IP。
08 环境变量方式
很多命令行工具都遵循 http_proxy / https_proxy 环境变量,可以在 shell 配置文件里统一设置:
# 在 ~/.zshrc 或 ~/.bashrc 里添加
export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890
export no_proxy=localhost,127.0.0.1,::1
重新打开终端后生效。这个方式覆盖面广,curl、wget、go get 等工具基本都支持。
最省事的方案是 TUN 模式。但如果你在 CI 环境或远程服务器上,手动配置环境变量是更通用的方案。
命令行工具不走系统代理是一个高频痛点,特别是在网络受限的环境里做开发。TUN 模式是桌面端最简洁的解法;如果需要精细控制,逐工具配置也不复杂,几条命令的事。