GitHub 與 npm 終端逾時?為 Clash 設定 HTTP 代理與 Git 代理(Windows/macOS/Linux)
許多人已用 Clash 讓瀏覽器順利開 GitHub,卻在終端機執行 git clone、npm install 或 curl 時仍遇到逾時、TLS 握手卡住或偶發連線重試。原因很常見:圖形介面的「系統代理」不會自動餵給所有命令列工具,而這些工具預設往往直連。本篇假設您的訂閱與規則已能正常上網,專注說明如何把終端流量對齊到 Clash 在本機開出的 HTTP(或 mixed)/SOCKS 埠,並補上 Git 專用 proxy 與 npm 設定,讓開發流程與瀏覽器一致;若您使用的是 WSL2 與 Windows 宿主機埠轉發,請一併參考站內 WSL2 與 Clash 連通專文,兩篇互補。
為什麼瀏覽器正常,終端卻不行
Clash 類客戶端常透過「系統代理」把作業系統層的 HTTP/HTTPS 導向本機埠,但這條鏈路主要服務會讀取系統代理設定的應用程式。許多終端工具(含 Git、部分版本的 curl、各種 CLI)要嘛完全不理會系統代理,要嘛只在偵測到 HTTP_PROXY 等環境變數時才走代理。另一種情況是:您開了 TUN 模式,理論上全系統封包會進內核轉發;但若實際仍只在「系統代理」層工作、或 TUN 未涵蓋該 shell 的網路命名空間(容器、SSH 遠端 shell、部分 CI 環境),終端仍可能直連。
因此,最穩定的做法是在 shell 層明確寫出代理 URL,必要時再為 Git、npm 各寫一組設定,避免「同一台機器、同一條訂閱,瀏覽器與終端卻走不同出口」的割裂體驗。接下來我們先對齊 Clash 監聽埠,再談環境變數與工具別名設定。
先確認 Clash 監聽哪個埠
開啟 Clash 設定檔或圖形介面中的「連接埠/埠」頁面,記下兩個數字:HTTP 或 mixed-port(常見為 7890),以及SOCKS 埠(若與 mixed 分開,常見為 7891)。若您只啟用 mixed-port,通常同一個埠同時接受 HTTP 與 SOCKS5,寫 http://127.0.0.1:PORT 或 socks5://127.0.0.1:PORT 皆可依工具支援度選用。
實務建議
對 Git、npm、curl 等以 HTTPS 為主的流量,優先使用 HTTP 代理 URL(http://127.0.0.1:7890);若某工具只認 SOCKS,再改用 socks5://。兩邊埠號請以您本機實際設定為準,切勿硬抄教學數字。
HTTP_PROXY、HTTPS_PROXY 與 ALL_PROXY
多數遵循慣例的程式會讀取下列變數(大小寫並存較保險,因實作不一):
HTTP_PROXY/http_proxy:明文 HTTP 與部分程式對「代理伺服器」的預設入口。HTTPS_PROXY/https_proxy:HTTPS 請求常走此變數指向的同一台本機代理(Clash 會再向外建 TLS)。ALL_PROXY/all_proxy:部分工具用於「全部協定」的後備;可設為與 HTTP 相同,或 SOCKS URL。NO_PROXY/no_proxy:排除清單,避免內網、本機 registry、公司 Git 走代理。
設定時請統一使用 127.0.0.1(或 WSL/Docker 情境下的宿主 IP),並帶上正確通訊埠。設完後可用 curl -I https://github.com 觀察是否仍長時間卡住;若 Clash 連線日誌出現對應請求,代表終端已經過代理。
macOS 與 Linux:bash/zsh 暫時與永久設定
當前工作階段暫時生效(關閉終端後消失):
# Replace 7890 with your Clash HTTP or mixed port
export http_proxy="http://127.0.0.1:7890"
export https_proxy="http://127.0.0.1:7890"
export HTTP_PROXY="$http_proxy"
export HTTPS_PROXY="$https_proxy"
export ALL_PROXY="socks5://127.0.0.1:7890"
export all_proxy="$ALL_PROXY"
export no_proxy="localhost,127.0.0.1,::1"
export NO_PROXY="$no_proxy"
若要永久寫入,將上述 export 行加入 ~/.zshrc 或 ~/.bashrc,存檔後執行 source ~/.zshrc。若您同時使用多種 shell,請只改實際登入時會載入的那份設定檔,避免重複定義與除錯困難。
內網與公司 Git
請在 NO_PROXY 中加入內網網段或主機名(例如 *.corp.example、10.0.0.0/8 視環境而定),否則內部程式庫與 registry 會被誤送進公開節點,造成認證失敗或路徑外洩風險。
Windows:PowerShell 與命令提示字元
在 PowerShell 中可對當前視窗設定:
$env:HTTP_PROXY="http://127.0.0.1:7890"
$env:HTTPS_PROXY="http://127.0.0.1:7890"
$env:ALL_PROXY="socks5://127.0.0.1:7890"
$env:NO_PROXY="localhost,127.0.0.1"
若需使用者層級永久環境變數,可透過「系統內容 → 環境變數」圖形介面新增,或使用 setx(注意 setx 寫入後需新開終端才讀得到)。Windows Terminal 若混用 WSL,請記得:WSL 內的 shell 讀的是 Linux 側設定,與 PowerShell 的 $env: 互不通用;WSL 若要連宿主 Clash,請改設 WSL 可達的 IP 與埠,細節見前述 WSL2 專文。
Git:http/https proxy 與還原
Git 有獨立的設定項,適合長期固定,不必每次開 shell 都依賴全域 export。HTTP/HTTPS 儲存庫常用:
git config --global http.proxy http://127.0.0.1:7890
git config --global https.proxy http://127.0.0.1:7890
若您只用 SSH([email protected]:)clone,上述 http.proxy 不會影響 SSH;SSH 需改 ~/.ssh/config 的 ProxyCommand 搭配 nc/connect-proxy 等,屬另一條路徑。要取消 Git 代理:
git config --global --unset http.proxy
git config --global --unset https.proxy
建議用 git config --global -l 複查,避免舊值殘留導致「只有 Git 特別慢」。
npm、yarn、pnpm 與 registry
npm 會讀取環境變數中的代理;也可明確寫入設定檔:
npm config set proxy http://127.0.0.1:7890
npm config set https-proxy http://127.0.0.1:7890
若公司使用內部 registry,請確認 registry 指向內網 URL 且該主機已列入 NO_PROXY。yarn 與 pnpm 同樣支援 HTTP_PROXY 或各自 config 指令;遇到只認其中一種的情況時,以工具官方文件為準。安裝完套件後若長期不需要代理,記得 npm config delete proxy 等,避免影響在家網路環境下的安裝速度。
Docker、Go 模組與其他常見 CLI
Docker 拉取映像時,daemon 端與客戶端行為分離:桌面版 Docker Desktop 有時可沿用系統代理,Linux 上的 dockerd 則常需在服務設定中另寫 HTTP_PROXY,與互動式 shell 的 export 不是同一層。若只有 docker pull 失敗而主機 curl 正常,請優先檢查 daemon 環境檔而非重複改 zshrc。
Go 的模組下載會尊重 GOPROXY 與 HTTP_PROXY;在無法直連 proxy.golang.org 的網路下,除了改用公司允許的 module proxy,也可讓 go env -w GOPROXY=... 與終端代理並存,避免只改一邊仍卡在 checksum 或 metadata。Python pip 可使用 pip install --proxy 或環境變數;Rust cargo 常透過 HTTP_PROXY 或 [http.proxy] 設定。重點仍是:確認實際發請求的那個行程有讀到代理,而不是假設「開了 Clash 就全自動」。
NO_PROXY 常見寫法對照
| 情境 | 建議寫入 NO_PROXY 的片段 |
|---|---|
| 本機服務與測試站 | localhost,127.0.0.1,::1 |
| 內部 Git/npm registry 主機名 | 以逗號分隔的 FQDN,必要時含萬用字元前綴 |
| Kubernetes、Docker 內部 DNS | 該叢集專用網域與服務名稱 |
仍逾時時的排查順序
- 在 Clash 中確認規則是否將
github.com、npmjs.org導向預期策略組,並觀察日誌是否有對應連線。 - 確認終端內
echo $https_proxy(或 Windows 的echo %HTTPS_PROXY%)是否為預期 URL。 - 嘗試只設
HTTPS_PROXY為 HTTP 代理 URL,避免錯用 SOCKS 導致握手異常。 - 若懷疑 DNS,請交叉參考 DNS 與 fake-ip 排查,排除解析與規則競合。
- 在伺服器或無 GUI 環境,可改參考 Linux 無頭部署,讓 Clash 本體與訂閱更新也穩定。
常見問題
只有 Git 慢,curl 正常
多半是 git config 仍指向舊代理或錯埠。請 git config --global -l | grep -i proxy 檢查並清理。
代理後出現憑證或 MITM 相關錯誤
請確認是否啟用會解密 TLS 的中間人工具;Clash 預設不替 HTTPS 解密。若公司防火牆掃描 HTTPS,需依 IT 規範匯入根憑證,與本篇代理 URL 設定無衝突但需分開處理。
已開 TUN 還需要環境變數嗎
若 TUN 已完整攔截該 shell 的流量,理論上可不設;但若您發現仍有工具繞過,保留 HTTP_PROXY 可作雙重保險。容器與遠端開發環境通常仍需顯式設定。
小結與下載
讓終端走 Clash 的核心是對齊本機監聽埠,並以 HTTP_PROXY/HTTPS_PROXY(及必要的 ALL_PROXY)讓命令列與瀏覽器共用同一套出口;Git 與 npm 再各自寫入 proxy,可減少每次手動匯出環境的負擔。與「只談 WSL2 埠轉發」不同,本篇聚焦三系統通用的 shell 與工具設定,適合日常本機開發;WSL 與宿主 IP 請另對照專文。