教學 2026-04-14 · 約 17 分鐘閱讀

WSL2 走不通 Windows 上的 Clash?鏡像網路與連接埠轉發逐步修復

許多人在 Windows 裡用瀏覽器上網正常,一進 WSL2(例如 Ubuntu)執行 apt updatecurlgit cloneDocker 拉映像卻卡住——常見原因不是「Clash 壞了」,而是子系統與宿主機之間的網路邊界沒對齊:localhost 指到不同命名空間、代理只綁在 127.0.0.1、或防火牆擋掉從虛擬網卡來的連線。本篇在假設您已依 Windows 端 Clash 安裝教學 完成訂閱與模式切換的前提下,用可重現的順序整理:鏡像網路模式、如何取得正確的宿主 IPAllow LAN/mixed-port代理環境變數,以及必要時的 netsh 連接埠轉發,讓終端與容器儘量與 Windows 使用同一套 Clash 出口。

為什麼「Windows 能上、WSL2 不能」這麼常見

WSL2 的核心是輕量虛擬機器與虛擬網路。預設情況下,子系統裡的 127.0.0.1 指向Linux 網路命名空間自己,而不是您正在執行 Clash 的那個 Windows 使用者空間。於是您在 PowerShell 裡測 127.0.0.1:7890 成功,在 WSL 裡同樣指令卻失敗——這不是魔術,而是兩套回環介面。

另一條常見斷點是「Clash 只聽本機」。若 HTTP/SOCKS 入站綁在 127.0.0.1,從 WSL 虛擬網卡送過來的封包目的位址是宿主在虛擬區網上的 IP,而不是回環位址;此時需要讓 Clash 對區網介面開放入站(常見選項名稱如 Allow LAN),或改走鏡像網路localhost 語意對齊。還有一類是防火牆規則:Windows Defender Firewall 可能允許本機程式連線,但對「從 WSL 子網進來」的連線仍要明確放行。

排查心法

一次只改一個變因:先確認「WSL 能 ping/連到宿主 IP 與代理埠」,再談規則分流、DNS 或 TUN。把鏈路拆成可達性 → 代理握手 → 策略命中三段,會比同時改三處設定快很多。

鏡像網路模式與傳統 NAT 有什麼差

在較新的 Windows 11 與 WSL 版本中,可啟用鏡像網路(mirrored networking):讓子系統與宿主共享更接近「同一張網路視角」的行為,包含對 localhost 的互通支援。對「只想讓 WSL 裡的 CLI 指到 127.0.0.1:埠 就能打到 Windows 上的 Clash」這種需求,鏡像模式往往是最省心的底座。

若您仍使用傳統 NAT 模型,則要把代理位址寫成Windows 在虛擬區網上的 IP(常見作法是讀取 /etc/resolv.conf 裡的 nameserver 欄位,它多半指向宿主;仍以您機器上實際輸出為準),或使用 ip route 觀察預設閘道。不同組建與自訂 .wslconfig 會改變細節,請以當前 WSL 發行說明為準,不要硬抄過期截圖。

在您的使用者目錄建立或編輯 .wslconfig(與 Linux 家目錄無關,位於 Windows 使用者資料夾下),可加入下列片段以啟用鏡像模式(實際鍵名與可用性請對照您安裝的 WSL 版本文件):

# ~/.wslconfig on Windows (merge with your existing file)
[wsl2]
networkingMode=mirrored

存檔後請在 Windows 端執行 wsl --shutdown,再重新開啟發行版,讓設定生效。若鏡像模式與公司 VPN 或第三方虛擬網卡衝突,可暫時還原並改走下文「宿主 IP + Allow LAN」路線。

Windows 端 Clash:mixed-port、Allow LAN 與綁定位址

無論使用哪種圖形前端,核心概念一致:WSL 要連進來,Clash 的入站必須在可從虛擬區網抵達的位址上聆聽。多數使用者會使用 mixed-port(同埠提供 HTTP 與 SOCKS)或分開的 portsocks-port

  • 若僅綁 127.0.0.1,在 NAT 模式下 WSL 通常打不進來
  • 啟用 Allow LAN(或同等選項)後,常見於綁 0.0.0.0,讓區網與虛擬網卡可連線。
  • 開放區網入站代表同一區網其他裝置也可能連到您的代理埠;請只在信任的網路環境使用,並考慮防火牆限制來源 IP。與「刻意讓手機走電腦代理」不同情境可參考 區網 mixed-port 與 Allow LAN 專文。

安全提醒

Allow LAN 屬於擴大攻擊面的設定。若您會帶筆電到公共網路,請在離開前關閉,或搭配防火牆僅允許虛擬交換器子網,而非整個公共區網。

代理環境變數:http_proxy、ALL_PROXY 與 no_proxy

aptcurlwget、許多語言套件管理器而言,最通用的接軌方式是標準環境變數。假設 mixed-port 為 7890,而您已確認從 WSL 可連到宿主(鏡像模式下可用 127.0.0.1;NAT 模式下請替換成實際宿主 IP):

# Replace host if not using mirrored localhost
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:7890"
export no_proxy="localhost,127.0.0.1,::1"

說明:http_proxyhttps_proxy 讓多數 HTTP 用戶端走 Clash 的 HTTP 入站;需要 SOCKS 的程式則看 ALL_PROXY。若您的核心將兩者拆在不同埠,請改成實際埠號。no_proxy 用於排除內部 registry、公司 Git、區網資產,避免無謂繞路。

將上述寫入 ~/.bashrc~/.zshrc 可登入自動生效;團隊腳本可改以 direnv 等方式隔離,避免把敏感出口設定擴散到不需要代理的專案。

apt 與 Docker:誰讀環境變數、誰要自己設定

APT

apt 有時不繼承互動式 shell 的環境變數。較穩的做法是在 /etc/apt/apt.conf.d/ 新增設定檔(需 sudo):

# /etc/apt/apt.conf.d/95proxy — adjust host:port
Acquire::http::Proxy "http://127.0.0.1:7890/";
Acquire::https::Proxy "http://127.0.0.1:7890/";

NAT 模式下請把 127.0.0.1 換成宿主 IP。更新完執行 sudo apt update 驗證。

Docker Engine 與 docker pull

Docker Desktop 的 WSL2 後端裡,守護行程跑在獨立脈絡;僅在您的互動 shell 匯出 http_proxy,不一定會讓 docker pull 走代理。常見作法包括:為 Docker 服務設定 systemd drop-in(在 Linux 原生機)或使用 Docker Desktop 提供的 代理/資源介面;核心仍是讓拉映像的那個守護行程看見代理,而不是只有您的 bash。

建置映像時的 docker build 可透過 --build-arg 傳入 HTTP_PROXY 等變數;與「系統守護行程拉映像」是分開課題。若您改在 Linux 伺服器無圖形環境跑 Clash,可銜接 Linux 無頭環境 Meta 核心一文的路徑,但與「Windows 宿主 + WSL2」組合的邊界不同,請勿混用設定檔路徑。

仍連不上時:netsh 連接埠轉發作為橋接

少數環境下,即使 Allow LAN 已開,從 WSL 連宿主 IP 埠仍逾時。可在以系統管理員身分執行的 PowerShell 使用連接埠轉發,把對外介面上的埠轉到本機 Clash 實際聆聽處(以下為示意,埠號請替換):

# Run in elevated PowerShell — example only
netsh interface portproxy add v4tov4 listenaddress=0.0.0.0 listenport=7890 connectaddress=127.0.0.1 connectport=7890
netsh advfirewall firewall add rule name="WSL Clash forward" dir=in action=allow protocol=TCP localport=7890

完成測試後,若不再需要請刪除對應 portproxy 與防火牆規則,避免長期暴露。此段屬於進階排錯,請先完成基本連通性檢查再使用。

DNS 與 fake-ip:別讓最後一哩掉進解析坑

當 TCP 連代理已通,但特定域名仍怪異,請回頭查 Clash 的 DNS 模式與 fake-ip 行為;與 WSL 無關的類似症狀可對照 DNS 與 fake-ip 排查。WSL 內 /etc/resolv.conf 若被自動產生,請勿在不明原因下硬改為公網 DNS 而繞過內網解析需求。

實務檢查清單

  1. Windows 瀏覽器可上網且 Clash 日誌有流量——確認宿主側正常。
  2. 決定路線:鏡像網路(優先)或 NAT + 宿主 IP。
  3. 確認 mixed-port/Allow LAN 與實際聆聽位址;由 WSL curl -v 測代理埠。
  4. 設定 http_proxyhttps_proxyALL_PROXY 與合適的 no_proxy
  5. apt 另加 apt.conf.d;Docker 改守護行程或 Desktop 設定。
  6. 仍失敗再評估防火牆與 netsh portproxy,並記錄還原步驟。

常見問題

鏡像模式開了,仍無法用 127.0.0.1

請確認 WSL 與 Windows 版本符合功能前提、已 wsl --shutdown 重啟;並用 ss -lntp(Windows 上對應工具)核對 Clash 實際綁定位址是否仍限縮在本機。

Git SSH 不走 http_proxy

SSH 協定需透過 ncProxyCommand 或改走 HTTPS 遠端;與 HTTP 代理環境變數無直接關係。

通了但很慢

瓶頸可能在節點品質、規則把大量流量導向高延遲策略組,或 DNS 反覆逾時;請用 Clash 日誌看策略命中連線目標

下一步

把 WSL2 與 Windows 的代理鏈路對齊後,您就能在一致出口下開發、拉套件與建置映像。若您尚未在 Windows 完成客戶端安裝,建議從 Clash for Windows 安裝教學開始。

立即免費下載 Clash,開啟更可控的分流體驗

同一套 Clash,兩邊都能用

鏡像網路或宿主 IP + Allow LAN,再把環境變數與 apt/Docker 設定補齊。

下載 Clash