為什麼「Windows 有代理,WSL2 卻像沒開」?
Clash 在 Windows 上常見的接管方式,是寫入系統代理或透過TUN 虛擬網卡把流量導進核心。 然而 WSL2 本質上是在輕量虛擬機裡跑 Linux 核心,子系統內的程式不會自動讀取 Windows「網際網路選項」那套設定。
另一個高頻誤解是:在 WSL 裡設定 http_proxy=http://127.0.0.1:7890。
若 Clash 的 Mixed 埠實際監聽在 Windows 主機上,WSL 內的 127.0.0.1 只會打到子系統本機,不會自動轉送到 Windows。
因此正確思路是:先找出從 WSL 看過去,Windows 主機的 IP,再把代理 URL 指向 http://該IP:埠號。
若您尚未在 Windows 桌面端完成基礎安裝,建議先對照 Clash Verge Rev Windows 完整安裝與設定教學,確認訂閱、系統代理與埠號;本文假設您已能在 Windows 瀏覽器端穩定走代理。
1Windows 端:確認 Clash 埠與「允許區域連線」
在 Clash Verge Rev 等客戶端中,記下本機代理埠:常見為 Mixed Port(同時涵蓋 HTTP 與 SOCKS 的混合埠,例如 7890),或分開的 HTTP/SOCKS 埠。
請以您介面上實際顯示為準,下文以 7890 作為範例。
關鍵開關是Allow LAN(允許區域網路/允許來自區域的連線):若代理只綁在 127.0.0.1,WSL2 透過虛擬網路連過來時會被拒於門外。
開啟 Allow LAN 後,Clash 通常會改為在 0.0.0.0:埠號 監聽,讓同一台電腦上的其他網路命名空間(含 WSL2)得以連入。
安全提醒:Allow LAN 會讓區域網路上的其他裝置「有機會」連到您的代理埠。請僅在信任的區網環境使用,並搭配 Clash 的存取控制與防火牆規則。
2WSL2 內取得 Windows 主機位址
最穩定的做法之一,是讀取 WSL 自動產生的 /etc/resolv.conf 裡的 nameserver 欄位:在典型 WSL2 安裝下,它往往指向Windows 主機在虛擬網路上的位址。
grep nameserver /etc/resolv.conf | awk '{print $2}'
將輸出記為 WIN_HOST(例如 172.x.x.x)。若您升級過 Windows 或自訂過 WSL 網路,少數環境可能需要改用其他方式解析主機位址;此時可先以 ping WIN_HOST 或 curl 小流量測試連通性。
另可將下列兩行寫進 ~/.bashrc 或 ~/.zshrc,讓每次開 shell 都自動帶入主機 IP(變數名稱可自訂):
export WIN_HOST=$(grep nameserver /etc/resolv.conf | awk '{print $2}')
export PROXY_URL="http://${WIN_HOST}:7890"
3環境變數:讓終端機與多數 CLI 走代理
多數透過 HTTP/HTTPS 下載的工具會讀 http_proxy、https_proxy(大小寫變體亦常見)。
建議一併設定 ALL_PROXY 給需要 SOCKS 或泛用代理的程式,並用 no_proxy 排除區網與本機,避免內網服務被誤送代理。
export http_proxy="http://${WIN_HOST}:7890"
export https_proxy="http://${WIN_HOST}:7890"
export HTTP_PROXY="$http_proxy"
export HTTPS_PROXY="$https_proxy"
export ALL_PROXY="socks5://${WIN_HOST}:7890"
export NO_PROXY="localhost,127.0.0.1,::1,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16"
若您的 Clash 僅提供 HTTP 混合埠而沒有在同一埠上提供 SOCKS,請把 ALL_PROXY 改成與 http_proxy 一致,或依客戶端實際通訊協定調整。
設定完畢後,可用下列指令粗測出口是否已變更(實際 IP 會隨節點而變):
curl -s https://ipinfo.io/ip
4Git:全域或儲存庫層級的 http(s) 代理
Git 不一定會讀取您 shell 裡的環境變數(視版本與編譯選項而定),因此建議顯式寫入 Git 設定,減少「以為有 proxy、其實沒吃到」的情況。
git config --global http.proxy "http://${WIN_HOST}:7890"
git config --global https.proxy "http://${WIN_HOST}:7890"
若僅特定遠端需要代理,也可在單一儲存庫內使用 git config http.proxy ... 而不加 --global。
需要還原時,執行 git config --global --unset http.proxy 等指令即可。
使用 SSH([email protected]:)時,流量不會自動走 HTTP 代理;要嘛改為 HTTPS 遠端,要嘛為 SSH 另外配置 ProxyCommand 或改用支援 TUN/透明代理的架構。
更多開發工具與 GitHub/npm 分流概念,可延伸閱讀 Cursor 與 GitHub、npm 場景下的 Clash 分流思路,與本文「先把 WSL 連到 Windows 埠」互補。
5npm:registry 與 proxy 欄位
npm 會讀取環境變數,但實務上仍建議用 npm config 固定下來,避免不同 shell 或 GUI 啟動的程式行為不一致。
npm config set proxy "http://${WIN_HOST}:7890"
npm config set https-proxy "http://${WIN_HOST}:7890"
若公司內網另有 registry 鏡像,請確認 registry 與代理設定沒有互相打架;遇到 TLS 或憑證攔截時,才需斟酌調整 strict-ssl(不建議在不明網路環境貿然關閉)。
當您發現只有特定套件下載慢,請在 Clash 連線/日誌中觀察實際域名,必要時為該域名補規則;DNS 與規則一致性可對照 Meta 核心 DNS 防洩漏指南。
補充:與「localhost 轉發」有關的兩種方向
搜尋「WSL2 localhost 轉發」時,常會看到 .wslconfig 與 localhostForwarding 等關鍵字。
這多半描述的是從 Windows 連到 WSL 內監聽的服務時,是否能用 localhost:埠 直接存取。
本文主題是反向:從 WSL 連到 Windows 上的 Clash。 因此核心仍是主機 IP + 正確埠 + Allow LAN,與 UWP 應用程式那種 Loopback 沙盒議題屬不同層次。
問題排查:連不上時依序檢查
Windows 防火牆與安全軟體
若已開 Allow LAN 仍無法從 WSL 連到 WIN_HOST:7890,請在 Windows 上檢查防火牆是否允許該埠在「私人網路」上入站,並暫時排除第三方安全軟體攔截做對照測試。
埠號或協定不符
混淆 HTTP 埠與 SOCKS 埠時,會出現連線立即中斷或握手失敗。
請以 Clash 介面為準,必要時在 WSL 內用 curl -v --proxy http://WIN_HOST:埠 https://example.com 觀察錯誤訊息。
resolv.conf 變動
部分發行版會在開機或網路變更時改寫 /etc/resolv.conf。
若您發現 WIN_HOST 突然失效,請重新讀取 nameserver 並更新環境變數與 Git/npm 設定。
Windows TUN 與 WSL2 的期待值
在 Windows 上啟用 Clash 的 TUN,並不等於「WSL2 內每個封包都自動被同一條規則漂亮地畫好」。 對開發者而言,把 WSL 的 HTTP(S) 工具鏈指到本機代理埠通常仍是最透明、最好除錯的路徑。 若您希望從網路層統一接管,可再研究 Clash Verge Rev TUN 模式教學,但請保留「先驗證代理埠可達」這個基準測試。
驗收檢查清單
- Windows 上 Clash 正常,且已記下正確的 Mixed/HTTP 埠。
- 已開啟 Allow LAN,代理監聽範圍含區域介面。
- WSL 內已取得
WIN_HOST,且curl經代理可連外網。 git config與npm config的 proxy 指向http://WIN_HOST:埠。- Clash 連線日誌中可看到來自 WSL 的對應連線紀錄。
開源專案與下載來源
Clash 生態的核心與圖形介面多為開源專案,適合查閱授權、Issue 與變更紀錄。 客戶端安裝檔建議優先從 本站下載頁 取得,與自行從 Release 挑檔案分開看待即可。
結語
WSL2 內 Git、npm「不走代理」的根因,多半是網路邊界與 localhost 語意,而不是單一開關沒勾。 把流量導向 Windows 上正在監聽的 Clash,需要正確的主機位址、正確的埠、Allow LAN,以及工具鏈各自的 proxy 設定四者對齊。
相較於在子系統內再裝一套代理客戶端,多數情境下重用 Windows 已開好的 Clash更省心力:維護一份訂閱與規則即可,終端機與桌面共用同一套分流邏輯。