要讓外部設備(如同區域網路內的其他電腦或手機)連線到你 WSL 2 裡面的服務,主要會遇到一個數位高牆:WSL 2 預設使用的是虛擬 NAT 網路。這意味著 WSL 有自己獨立的內部 IP,外部世界只看得到你的 Windows 主機,看不到裡面的 WSL。
為了解決這個問題,目前有兩種最主流且有效的方法。
方法一:使用「鏡像網路模式」(最推薦,最簡單)
微軟在較新版本的 WSL 2 中引入了 Mirrored(鏡像)網路模式。開啟後,WSL 2 會直接共享 Windows 主機的網路介面與 IP 位址,外部程式只要連線到你的 Windows IP,就等於直接連到 WSL。
設定步驟:
- 在 Windows 中打開你的使用者資料夾(路徑通常是
C:\Users\<你的用戶名>\)。 - 檢查有沒有一個叫
.wslconfig的檔案,如果沒有,請手動建立一個。 - 編輯該檔案,加入以下內容:
[wsl2]
networkingMode=mirrored
- 儲存檔案後,打開 Windows PowerShell,輸入以下指令重啟 WSL 讓設定生效:
wsl --shutdown
重啟後,你在 WSL 裡啟動的服務(例如連接埠 8080),外部設備直接連線到你的 Windows_IP:8080 就能成功存取!
方法二:使用 Port Forwarding(連接埠轉發)
如果你因為特定原因不想開啟鏡像模式,傳統的方法是透過 Windows 的 netsh 指令,把傳送到 Windows 特定連接埠的流量,「轉寄」給 WSL 的內部 IP。
設定步驟:
- 查詢 WSL 的內部 IP:
在 WSL 終端機中輸入
hostname -I,你會得到一串類似172.x.x.x的 IP。 - 設定轉發(需以系統管理員權限打開 PowerShell):
假設你想把外部連向 Windows
8080連接埠的流量,轉給 WSL 的8080連接埠:
netsh interface portproxy add v4tov4 listenport=8080 listenaddress=0.0.0.0 connectport=8080 connectaddress=<你的WSL_IP>
注意:因為 WSL 每次重啟 IP 都可能會變動,如果用這個方法,每次 WSL 重啟後都需要重新執行此指令更新 connectaddress。
關鍵最後一步:放行 Windows 防火牆
無論你選擇上述哪一種方法,Windows 防火牆預設都會擋下外部進來的連線。你必須手動開啟對應的連接埠。
快速設定(以管理員權限打開 PowerShell):
執行以下指令,允許外部連入指定的連接埠(以 8080 為例):
New-NetFirewallRule -DisplayName "WSL_Service_8080" -Direction Inbound -Action Allow -Protocol TCP -LocalPort 8080
留言