對開發者來說,網路問題往往不是「整台電腦都不能上網」,而是集中出現在幾個非常具體的工作流程:GitHub 拉取停在某個百分比、git push 長時間沒有回應、SSH 連線逾時、Homebrew 更新速度極慢,或是瀏覽器可以開啟網站,但終端機裡的工具卻完全無法連線。這些情況通常與終端機是否使用代理、Git 與 SSH 是否共用代理設定、公司內網是否需要直連有關。
本文以 Clash、Clash Verge、Clash Verge Rev 與 Mihomo 為例,整理開發者最常用的代理設定方式。你會看到如何確認 Clash 的本機代理埠、設定 Shell 環境變數、為 Git 配置 HTTP 代理、讓 SSH 透過 SOCKS5 連線,以及如何避免代理設定影響公司 GitLab、區域網路與內部套件伺服器。
先理解開發者工具的代理路徑
在開始修改設定前,先確認不同工具的網路請求並不一定走同一條路徑。瀏覽器通常會讀取作業系統或 Clash 的系統代理;終端機程式則可能完全忽略系統代理,只讀取環境變數;Git 會讀取自己的全域設定,也可能繼承環境變數;OpenSSH 則有獨立的設定檔,不會自動使用 Git 的 HTTP 代理。
- 瀏覽器與一般桌面應用程式:通常透過 Clash 的系統代理或 TUN 模式接管流量。
- Shell 與命令列工具:常見做法是設定
HTTP_PROXY、HTTPS_PROXY與ALL_PROXY。 - Git over HTTPS:可以使用 Git 的
http.proxy,也可以繼承 Shell 的代理變數。 - Git over SSH:需要在 SSH 設定檔中透過 SOCKS5、HTTP CONNECT 或其他跳板方式建立連線。
- Homebrew:部分下載會使用 curl、git 或 Ruby 相關元件,實際是否走代理取決於環境變數與工具版本。
Clash 常見的本機埠包括 HTTP 代理 7890、SOCKS5 7891,但不同客戶端與自訂設定可能使用其他埠號。不要直接套用範例中的數字,應先在 Clash 的設定頁、一般設定或外部控制器中確認目前的 mixed-port、port 或 socks-port。
7890,可以執行 curl -I -x http://127.0.0.1:7890 https://github.com。如果能收到 HTTP 標頭,代表代理本身可用;若失敗,應先檢查 Clash 是否啟動、埠號是否正確,以及目前策略組是否有可用節點。設定終端機的通用代理
對命令列工具而言,環境變數是最方便的入口。HTTP_PROXY 和 HTTPS_PROXY 通常使用 HTTP 代理格式;ALL_PROXY 則可指定 SOCKS5。為了避免大小寫差異造成部分程式讀不到設定,建議大小寫版本一起設定。
export HTTP_PROXY=http://127.0.0.1:7890 export HTTPS_PROXY=http://127.0.0.1:7890 export ALL_PROXY=socks5://127.0.0.1:7891 export http_proxy="$HTTP_PROXY" export https_proxy="$HTTPS_PROXY" export all_proxy="$ALL_PROXY" curl -I https://github.com
以上設定只在目前的終端機工作階段有效,關閉視窗後便會消失。若你每天都需要代理,可以將其放入 Zsh 或 Bash 的啟動檔案,例如 macOS 常用的 ~/.zshrc,Linux 則可能使用 ~/.bashrc 或 ~/.zshrc。修改後執行 source ~/.zshrc 讓設定立即生效。
# ~/.zshrc export HTTP_PROXY=http://127.0.0.1:7890 export HTTPS_PROXY=http://127.0.0.1:7890 export ALL_PROXY=socks5://127.0.0.1:7891 # 套用設定 source ~/.zshrc # 檢查是否已載入 env | grep -i proxy
Windows PowerShell 可以使用 $env: 語法設定目前工作階段的變數。若使用 Windows Terminal 啟動 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:7891" curl.exe -I https://github.com
unset HTTP_PROXY HTTPS_PROXY ALL_PROXY http_proxy https_proxy all_proxy。長期保留代理可能導致公司內網、localhost 或區域網路服務連線異常。為 Git HTTPS 設定代理
GitHub、GitLab 和 Bitbucket 都可能透過 HTTPS 提供遠端倉庫。當你使用 git clone https://...、git fetch 或 git push 時,Git 可以直接使用自己的代理設定。這種方式比單純設定 Shell 變數更明確,也方便只針對 Git 生效。
git config --global http.proxy http://127.0.0.1:7890 git config --global https.proxy http://127.0.0.1:7890 git config --global --get http.proxy git config --global --get https.proxy
如果代理是 SOCKS5,可以使用 socks5h,其中 h 代表讓代理伺服器解析目標域名。這對 DNS 受到污染或本地解析結果不可靠的環境尤其重要。
git config --global http.proxy socks5h://127.0.0.1:7891 git config --global https.proxy socks5h://127.0.0.1:7891 git ls-remote https://github.com/example/project.git
如果只需要為某一個倉庫設定代理,不建議使用 --global。在該倉庫目錄執行以下命令即可,設定會寫入專案的 .git/config,不會影響其他專案。
cd ~/Projects/sample-project git config http.proxy http://127.0.0.1:7890 git config https.proxy http://127.0.0.1:7890 # 移除目前倉庫的代理 git config --unset http.proxy git config --unset https.proxy
若你的公司內部 GitLab 可以直連,建議建立例外,讓公開服務走 Clash、內部網域保持直連。Git 支援依 URL 前綴指定代理,例如:
git config --global http.proxy http://127.0.0.1:7890 git config --global https.proxy http://127.0.0.1:7890 git config --global http.https://gitlab.corp.example.com.proxy "" git config --global https.https://gitlab.corp.example.com.proxy "" git config --global --list | grep -E "proxy|gitlab"
讓 Git SSH 透過 Clash 連線
使用 SSH 遠端網址時,Git 不會讀取 http.proxy。例如 [email protected]:owner/project.git 實際上會呼叫 OpenSSH,因此必須在 ~/.ssh/config 中設定代理。Clash 的 SOCKS5 埠通常是最方便的選擇。
# ~/.ssh/config
Host github.com
HostName github.com
User git
Port 22
ProxyCommand nc -X 5 -x 127.0.0.1:7891 %h %p
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
macOS 通常內建支援帶有 SOCKS5 功能的 nc。部分 Linux 發行版的 netcat 參數不同,如果執行測試時出現未知選項,可以改用 connect-proxy、ncat 或系統套件提供的對應工具。配置完成後,先不要直接執行推送,應使用詳細模式確認 SSH 是否真的經過代理。
ssh -T -v [email protected] git remote -v git fetch origin git push origin main
如果公司網路封鎖 TCP 22 埠,而 GitHub 的 HTTPS 仍可使用,可以讓 SSH 連到 GitHub 提供的 443 埠。這仍然是 SSH 協定,只是改用較容易通過防火牆的連接埠。
# ~/.ssh/config
Host github.com
HostName ssh.github.com
User git
Port 443
ProxyCommand nc -X 5 -x 127.0.0.1:7891 %h %p
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
ssh -T [email protected] 測試身份驗證,再用 ssh -vT [email protected] 查看代理命令是否成功,最後才檢查 Git remote、分支權限與 SSH 金鑰。不要把「網路連不上」和「金鑰沒有權限」混為同一個問題。Homebrew 下載與更新加速
Homebrew 的工作包含更新 formula 索引、拉取 Git 倉庫、下載 bottle 二進位套件,以及執行部分由 curl 或其他下載器完成的請求。因此只設定某一個工具,未必能覆蓋整個流程。最簡單的方式是先在目前終端機設定 HTTP、HTTPS 與 SOCKS5 代理,再執行 Homebrew 命令。
export HTTP_PROXY=http://127.0.0.1:7890 export HTTPS_PROXY=http://127.0.0.1:7890 export ALL_PROXY=socks5://127.0.0.1:7891 brew update brew outdated brew install wget brew upgrade
在 Apple Silicon Mac 上,Homebrew 通常位於 /opt/homebrew;Intel Mac 常見路徑則是 /usr/local。如果你以圖形介面啟動的工具無法讀取 Shell 裡的代理變數,這不一定是 Clash 失效,而可能是該程式與終端機使用了不同的環境。此時應優先確認 Clash 的系統代理或 TUN 模式,而不是盲目重複設定。
Homebrew 還可能需要從 GitHub、GitHub Releases、各套件上游站點下載檔案。若 brew update 可以完成,但安裝某個套件時卡住,應查看錯誤訊息中的實際下載網址,再用帶代理的 curl 單獨測試該網址,這樣可以區分是節點問題、DNS 問題還是上游伺服器暫時異常。
公司內網與公開服務的分流策略
開發者最容易忽略的是「代理不是越多越好」。公開 GitHub、套件註冊表與文件網站可能需要代理,但公司 GitLab、Jira、內部 Docker Registry、VPN 網段與本機開發服務通常應該直連。若所有流量都送到境外節點,可能造成內網服務無法解析、認證失敗,甚至觸發公司安全系統的異常登入警報。
- 將
localhost、127.0.0.1、*.local與公司內部網域設定為直連。 - 對常見私有網段
10.0.0.0/8、172.16.0.0/12、192.168.0.0/16保留 DIRECT 規則。 - 公司 GitLab 若使用自訂網域,應以完整網域加入 Clash 的直連規則或 Git 的代理例外。
- 使用 TUN 模式時,確認 DNS 劫持與路由設定不會把 VPN 內的 DNS 請求送到錯誤出口。
- 不要把公司憑證、私有套件下載網址或內部原始碼傳送到不受信任的第三方代理。
export NO_PROXY="localhost,127.0.0.1,::1,.local,.corp.example.com" export no_proxy="$NO_PROXY" # 測試內網服務是否不經代理 curl -I https://gitlab.corp.example.com
NO_PROXY 的匹配方式會因程式而異,有些工具支援網域後綴,有些工具對萬用字元的行為不同。遇到內網連線問題時,可以先用完整主機名稱測試,再逐步縮小範圍。若 Clash 本身開啟了 TUN 模式,環境變數的排除並不一定能阻止 TUN 接管,因此仍需同步檢查規則與模式。
常見故障排查流程
當 Git、SSH 或 Homebrew 出現問題時,建議按照由底層到上層的順序排查,不要一開始就修改大量設定。
- 確認 Clash 正常運作:檢查客戶端是否啟動、策略組是否有可用節點,並確認 HTTP 與 SOCKS5 埠號。
- 測試代理本身:使用
curl -x指定代理請求 GitHub 或其他目標網站。 - 檢查環境變數:執行
env | grep -i proxy,確認沒有錯誤的舊埠號或已失效的遠端代理。 - 檢查 Git 層設定:使用
git config --show-origin --get-regexp 'http.*proxy',確認代理來自全域設定、目前倉庫或其他檔案。 - 檢查 SSH 詳細日誌:使用
ssh -vT,觀察 ProxyCommand、DNS、TCP 連線與金鑰驗證分別在哪一步失敗。 - 檢查分流規則:確認目標網域沒有被錯誤匹配到 REJECT、DIRECT 或不適合的節點策略。
- 清理不必要的永久設定:問題解決後,移除不再需要的 Git 全域代理與 Shell 變數,避免日後內網服務出現難以追蹤的錯誤。
常見錯誤訊息也能提供方向:Could not resolve host 多半與 DNS 或代理解析有關;Connection timed out 通常涉及路由、埠號或節點不可用;Permission denied (publickey) 則代表已經連到 SSH 服務,但金鑰身份驗證失敗。把錯誤發生的層級分清楚,通常比更換大量節點更有效。
總結來說,Clash 對開發者的價值不只是讓瀏覽器開啟網站,而是把 Git、SSH、Homebrew 與其他命令列工具納入一套可控的流量管理流程。公開服務可以透過代理改善連線,公司的內部網路則保留直連;Git HTTPS 使用明確的 HTTP 代理,Git SSH 使用獨立的 SOCKS5 設定,兩者分開管理,後續排錯會簡單許多。完成設定後,建議保留一組可重複執行的測試命令,當網路環境或 Clash 設定變更時,就能快速定位問題。