對開發者而言,VPN 的價值不只是讓 GitHub 頁面可以開啟。日常工作往往同時涉及 GitHub 程式碼與 Release 下載、Docker Hub 映像檔、npm 套件庫、海外 API、文件網站,以及 SSH 遠端主機。這些請求的協定、網域與傳輸特性並不相同,若所有流量都使用同一種模式處理,可能造成不必要的繞路,也可能讓公司內網、區域服務或本機開發環境受到影響。
比較實用的做法,是先把開發流程拆成幾類,再決定哪些流量需要代理、哪些流量保持直連。GitHub 的 HTTPS 與 SSH、Docker Registry 的映像檔層、npm 的套件索引與壓縮檔,通常不是同一組網域;即使瀏覽器能正常開啟 GitHub,也不代表終端機的 Git、Docker 或 npm 一定能使用同一條路徑。本文會從節點選擇、規則分流、命令列代理、SSH 設定與 CI 建置幾個角度整理可重複使用的方法。
開發流程中最常見的網路瓶頸
GitHub 使用者最容易注意到的是首頁、儲存庫與程式碼頁面載入速度,但真正影響開發效率的請求可能發生在其他地方。執行 git clone 或 git fetch 時,Git 需要持續傳輸大量物件;下載 Release 時,實際檔案可能位於不同的 CDN;使用 GitHub API 時,則需要穩定的 HTTPS 連線與正確的認證標頭。若只測試首頁,無法完整代表 Git 操作或 API 的狀態。
Docker 的情況更容易被低估。一個映像檔通常由多個 layer 組成,Docker CLI 會先取得 Registry 的資訊,再依序下載各個 layer。只要其中一個請求遭遇逾時、TLS 中斷或連線被重置,整個 pull 就可能失敗。重新執行指令有時能暫時完成,但若根本原因是路由或代理設定,反覆重試只會浪費時間,還可能留下不完整的本地 layer。
npm 下載則同時包含套件索引、metadata、tarball 與相依套件解析。專案使用的 registry 不一定是 npmjs.org,也可能由公司內部提供。若把所有 npm 請求一律送往外部代理,可能繞過內部 registry;若全部直連,海外套件的 metadata 或 tarball 又可能不穩。因此,npm 設定應與專案的 registry 策略一起考慮。
120+
國家覆蓋
240+
線路數
不限
裝置台數
30 天
無理由退款
| 工作項目 | 常見請求 | 容易出現的問題 | 優先檢查方向 |
|---|---|---|---|
| GitHub | HTTPS、Git、API、Release CDN | 頁面可開但 clone 或下載失敗 | DNS、Git 代理、出口路由與認證 |
| Docker | Registry API、映像檔 layer | pull 逾時、連線重置、部分 layer 失敗 | Docker daemon 是否真的使用代理 |
| npm | registry、metadata、tarball | 套件解析慢、下載失敗或憑證錯誤 | registry 與 proxy 設定是否一致 |
| 海外 API | HTTPS、WebSocket、長連線 | 逾時、回應中斷或地區判定不同 | 出口位置、DNS 與連線保持策略 |
節點與分流應該怎麼選
選擇節點時,出口地區只是其中一個條件。GitHub、Docker Hub 與 npm registry 的服務位置可能不同,距離出口較近不一定代表完整路徑較好。還要考慮本地網路到入口的品質、入口到出口的跨境區段、出口到目標服務的回程,以及 DNS 查詢是否與出口位置一致。若某個節點只對瀏覽器有效,卻無法穩定處理長時間的 Git 或 Docker 傳輸,就不適合作為開發工作的唯一節點。
一般來說,BGP 線路適合需要較廣泛互聯與彈性路由的情境;IEPL 等專線通常著重在跨境區段的獨立性與穩定性;CN2 等電信網路路徑則要視本地電信商、入口位置與實際回程判斷。這些名稱不能直接等同於速度排名,也不能保證每個海外服務都獲得相同結果。測試時應以實際要使用的 Git、Docker 或 API 目標為準。
規則分流可以把開發請求拆成幾個層次。GitHub 的主要網域、Docker Registry、npm registry 與特定 API 可以列入代理規則;公司內網、localhost、私有 DNS、區域銀行或本地套件源則保留直連。若使用 Clash Verge、sing-box 或 Shadowrocket 等相容客戶端,應先確認訂閱格式與核心支援的規則語法,再逐步加入目標網域,不要一次貼入來源不明的大型規則集。
- ✅ GitHub 網頁、Git HTTPS 與 Release 下載分開驗證,不以單一頁面結果代替全部測試。
- ✅ Docker 使用的 Registry 網域與映像檔來源先確認,再決定是否納入代理規則。
- ✅ npm 專案若使用公司內部 registry,先保留內部來源直連,避免憑證與權限流程被改變。
- ✅ 公司內網、localhost 與私有位址加入直連例外,避免開發服務被錯誤送到遠端出口。
- ❌ 不要同時啟動兩個 VPN 或代理客戶端,否則虛擬網卡、DNS 與系統路由可能互相覆蓋。
- ❌ 不要只依節點名稱中的國家或城市判斷品質,實際目標與連線時段更有參考價值。
協定方面,Shadowsocks 屬於較輕量的加密代理;VMess、Trojan 與 VLESS 常見於 Xray 類設定;Hysteria2 以 QUIC 與 UDP 為基礎,WireGuard 則是獨立的 VPN 協定。不同協定對客戶端核心、傳輸層與伺服器參數有不同要求。若公司網路或公共 Wi-Fi 對 UDP 有限制,Hysteria2 或 WireGuard 可能需要改用其他可用方案;這不是簡單更換節點名稱就能解決的問題。
終端機代理的實作步驟
圖形化客戶端連線成功後,命令列工具不一定會自動繼承代理。系統 VPN 模式可能接管所有流量,但規則模式常常只依賴應用程式設定或特定環境變數。開始修改前,先確認客戶端提供的本機 HTTP 或 SOCKS 入站位址與連接埠;這些值應以目前客戶端畫面為準,不要直接套用其他文章中的固定數字。
設定 Shell 環境變數
許多 CLI 工具會讀取 HTTP_PROXY、HTTPS_PROXY 與 ALL_PROXY。HTTP 代理通常適合處理 HTTPS 請求的 CONNECT 建立;SOCKS5 則可由支援 SOCKS 的程式直接使用。若工具只接受 HTTP 代理,就不能把 SOCKS 位址直接填入而期待它自動轉換。設定完成後,應只在目前終端機工作階段測試,確認沒有影響其他專案。
export HTTP_PROXY=http://127.0.0.1:本機HTTP連接埠
export HTTPS_PROXY=http://127.0.0.1:本機HTTP連接埠
export NO_PROXY=localhost,127.0.0.1,.local,公司內部網域
Windows PowerShell 可使用 $env:HTTPS_PROXY 設定目前工作階段;macOS、Linux 與其他類 Unix Shell 則常使用 export。這些變數不一定會被所有工具接受,因此測試結果要搭配工具自己的設定檔判讀。若終端機離開後不想保留代理,避免直接寫入全域 Shell 啟動檔;若確實需要長期使用,也應把公司內網與本機位址加入 NO_PROXY。
Git HTTPS 與 SSH 分開處理
Git HTTPS 可以透過 Git 自己的設定指定代理,例如以 git config --global http.proxy 寫入代理位址。這會影響所有 Git HTTPS 儲存庫,因此公司內部 Git 服務若不需要代理,應使用更細緻的主機設定或取消全域配置。遇到 TLS 憑證錯誤時,不要把關閉 SSL 驗證當成修復方式;先檢查系統時間、根憑證、代理是否攔截 TLS,以及目標服務的主機名稱。
SSH 不會讀取一般的 HTTP 代理變數。若 Git 儲存庫使用 SSH URL,通常需要在 ~/.ssh/config 中透過 ProxyCommand,將 SSH 流量交給支援 SOCKS 或 HTTP CONNECT 的工具。設定前要確認遠端主機名稱、使用者、金鑰檔案與指紋驗證都正確;代理只負責傳輸路徑,不會替你解決金鑰權限或帳號授權問題。
Host github.com
HostName github.com
User git
IdentityFile ~/.ssh/id_ed25519
ProxyCommand 代理工具 --host %h --port %p
完成後可用 ssh -T [email protected] 進行驗證。若顯示連線逾時,先檢查 ProxyCommand 是否存在、參數是否被 Shell 正確解析;若顯示權限拒絕,則應回到 SSH 金鑰與 GitHub 帳戶設定排查。不要把私密金鑰貼到聊天工具、專案儲存庫或 CI 設定中。
Docker 與 npm的代理設定差異
Docker CLI 與 Docker daemon 是兩個不同的角色。你在終端機設定 HTTPS_PROXY,不代表背景執行的 daemon 會使用相同代理;實際拉取映像檔通常由 daemon 發起。因此,在 Linux 上應檢查 daemon 的服務設定,在 Docker Desktop 上則檢查應用程式的代理選項與引擎設定。修改後需要重新載入服務,再透過日誌與實際的 docker pull 驗證,而不是隻看 CLI 是否能回應。
Dockerfile 內的建置步驟又是另一層。建置可能由 BuildKit、遠端 builder 或 CI runner 執行,與本機 daemon 的網路環境不同。若本機能拉取基礎映像檔,但 CI 失敗,應檢查 runner 的 DNS、代理環境、Registry 登入與建置器網路,而不是直接複製本機的 Docker 設定。對私有映像檔,也要確認代理不會改變認證流程或攔截需要驗證的連線。
npm 的設定可用 npm config get registry 檢查目前 registry,再用 npm config get proxy 與 npm config get https-proxy 確認代理狀態。專案若有 .npmrc,其設定可能覆蓋使用者層級配置;CI 也可能透過環境變數覆蓋本機結果。下載失敗時,先判斷是 registry 不可達、套件不存在、權限不足、憑證錯誤,還是單純的 tarball 傳輸中斷。
不要為了短期下載成功而長期關閉 npm 的嚴格 SSL 驗證,也不要把含有認證權杖的 registry URL 寫入公開儲存庫。更換 registry 後應重新執行鎖定檔一致性檢查,確認套件來源、完整性雜湊與專案要求沒有被意外改變。代理是網路路徑工具,不應取代套件簽章、權限與供應鏈安全措施。
CI 建置與安全的穩定做法
CI runner 的網路位置通常與開發者電腦不同,不能假設本機能 clone、pull 或安裝套件,Runner 就一定能完成相同流程。部署前應明確記錄需要存取的 Git 主機、Registry、套件來源與 API,並將代理設定作為受控的環境變數或 Secret 注入。日誌中可以保留錯誤類型、目標主機與時間,但不要輸出代理認證、SSH 私鑰、套件權杖或完整帶密碼的 URL。
CI 使用代理時,應優先採用最小範圍原則。只讓需要跨境或外部服務的工作使用代理,內部 Git、內部 Registry 與部署網路則依組織規則直連。若整個 Runner 都被全域代理接管,可能導致內部服務看到不預期的出口位址,也可能讓防火牆、白名單或稽覈紀錄難以對應。分流規則變更後,應在不含敏感資料的測試專案中先驗證。
對長時間下載,穩定性通常比單次速度更重要。Docker layer、npm tarball 與 Git packfile 都可能在傳輸中途失敗;若網路頻繁切換,應先固定測試環境,再比較不同節點與協定。當問題只出現在某個出口時,可更換出口地區;當所有出口都失敗,則要回頭檢查本地 DNS、代理入站、憑證與工具版本。若只有特定服務異常,還要考慮該服務的限流、認證或區域政策。
- ✅ 先用最小測試驗證 DNS、TCP、TLS,再進行完整 clone、pull 或套件安裝。
- ✅ 為 CI 分別保存代理、Registry 與 SSH 的設定,避免一份全域設定互相覆蓋。
- ✅ 定期檢查訂閱更新後的節點名稱、協定相容性與規則是否仍符合工作流程。
- ✅ 需要多人或多台裝置使用時,可在 Windows、macOS、iOS、Android 與 Linux 上採用相容客戶端,但仍要依平台重新確認背景執行與系統代理行為。
- ❌ 不要把 VPN 當成 CI 供應鏈安全方案,權限、金鑰、套件完整性與稽覈仍需獨立管理。
若希望減少手動維護,應選擇能提供訂閱連結匯入的官方客戶端或相容工具,再依需要使用 Clash Verge、sing-box、Shadowrocket 等客戶端。匯入前先確認來源可信,並保留原始訂閱管理方式;訂閱更新後,重新檢查規則分流與關鍵工作流,不要只看節點列表是否增加。對開發者來說,最終目標是建立可解釋、可回復、可在不同平台重現的網路設定,而不是追求某個無法驗證的速度數字。