先決定要用哪種網路模式
WSL2 預設是 NAT 模式,發行版和 Windows 不共用回送位址,所以在 WSL 裡填 127.0.0.1 加連接埠一定連不上。這是最常見的踩坑點。
較新的 Windows 11 支援鏡像網路模式:在使用者目錄的 .wslconfig 裡替 wsl2 段加上 networkingMode=mirrored,重新啟動 WSL 之後 127.0.0.1 就能直接用,這是最省事的做法。留在 NAT 模式的話,得用 Windows 主機在 WSL 網段裡的位址,而且必須開啟「允許區域網路連線」,否則核心只監聽回送位址,外面根本連不進來。
防火牆是第一嫌疑
啟用區域網路連線後 Windows 會跳一次防火牆提示,沒放行的話後面所有步驟都白做。
分四步接上
- 1
開啟允許區域網路連線
在 Clash 設定裡啟用。第一次開啟時 Windows 防火牆會跳出視窗,至少要允許私人網路。
- 2
NAT 模式下取得主機位址
在 WSL 裡執行 ip route show default,輸出的第三個欄位就是 Windows 主機位址。把它寫進 https_proxy。這個位址每次重新啟動 WSL 都可能改變,建議在 .bashrc 裡動態取得,別寫死。
- 3
Docker Desktop 的代理設定
在設定的 Resources - Proxies 裡手動填 http://host.docker.internal 加連接埠。注意這一項只影響映像檔拉取與建置時的網路,容器裡執行的程式不受它管。
- 4
容器內部
docker run 時用 -e 傳 HTTPS_PROXY 與 HTTP_PROXY,或在使用者目錄的 .docker/config.json 裡設定 proxies 段作為預設值。同時把 localhost 與內部倉庫加進 noProxy。
兩邊分別驗證
在 WSL 裡 curl 一次 ipinfo.io/ip,回傳節點 IP 就成了。Docker 側用一個帶 curl 的暫時容器測同一個位址,能出結果代表容器的代理變數也生效了。兩邊要分開測,WSL 通不代表容器通。
- 鏡像模式與 NAT 模式的設定不能混用,換模式後要改回送位址
- 改完 .wslconfig 需要 wsl --shutdown 再啟動才生效
- 拉取鄰近地區的映像檔時把倉庫位址加進 noProxy,否則反而更慢
常見問題
開了 TUN 模式,WSL 還需要另外設定嗎?
看網路模式。鏡像模式下通常能自動接管;NAT 模式下 WSL 走的是 Hyper-V 虛擬交換器,很可能繞過 TUN 網路卡,還是設定環境變數最穩。
WSL 裡昨天還能用,今天連不上了?
先看主機位址是不是變了。NAT 模式下這個位址會隨 WSL 重新啟動而改變,寫死在設定裡就會失效,改成每次啟動時動態取得。