無法從外部瀏覽器訪問WSL2 Localhost

無法從使用同一個wifi網路(LAN)的外部瀏覽器(ex:行動裝置)開啟本地WSL2虛擬機器執行的node.js伺服網頁

  • localhost:3000網頁僅能在本地(電腦)瀏覽器瀏覽,無法在其他裝置(例如手機、平板)的瀏覽器瀏覽。 例如:  

  • 在連上同一網路的手機開啟http://172.17.10.206:3000 無法顯示網頁。 且每次重啟WSL的IP都不同。

具體原因在於WSL2會針對其虛擬網路使用網路位址轉譯 (NAT) 服務,其網路位址是動態變化的,每次重啟都會變更IP。 網路運作模式也是WSL(WSL 1)和WSL2的不同之一,使用WSL就沒有這樣的問題,參考: 使用 WSL 1 而非 WSL 2 的例外狀況

大致上有幾種思路作為解決方式: 

最後我選擇相較之下單純穩定的Native Bridge Solution,將網卡修改為橋接模式,參考網友的方法: https://github.com/microsoft/WSL/issues/4150#issuecomment-1135474390

前置作業

  • 從 Windows 應用商店安裝 WSL 的預覽版( preview version of WSL)
  • 在 Windows 中確認開啟 WSL和 Hyper-V、Hypervisor 路徑:應用程式->選用功能->更多Windows功能->開啟或關閉Windows功能
  • 以PowerShell關閉正在執行中的WSL 指令: wsl --shutdown

接下來要創建橋接 Hyper-V 的適配器(bridged Hyper-V adapter)

步驟

1.啟用橋接網絡。

記得先關閉正在執行中的WSL。 搜尋並開啟Hyper-V管理員,選中本機(MSI),動作 -> 虛擬交換機管理員,新增一個名為"Bridge"的虛擬交換機,連接類型為"外部網絡"。 


2.建立.wslconfig 在使用者資料夾根目錄C:\Users\your username\ 中創建一個文本文件 .wslconfig,其中包含以下內容:

[wsl2]
networkingMode = bridged
vmSwitch = Bridge
#dhcp = false
#ipAddress = xxx.xxx.xxx.xxx
#macAddress = <made up mac address>

注意vmSwitch的值必須與先前創建的虛擬交換機的名稱一致。

#的參數可以視需要自行修改。

3.啟動 WSL2 (Ubuntu shell)

執行 ifconfigip addr 並檢查 IP 地址。 DHCP會從我的LAN路由器發配唯一IP地址。 電腦有可能需要再次重新啟動才能獲得唯一的IP地址。

測試執行node.js本地伺服器由外部瀏覽器打開這組唯一的IP地址,成功連線表示設定成功。

參考

WSL連線官方說明:

相同問題討論:

留言

這個網誌中的熱門文章

DK67 Pro鍵盤驅動程式 + 快捷鍵

手動更新安裝PowerShell

打造一把安靜的機械鍵盤 - DK67 Pro + 靜音水蜜桃軸 + MDA鍵帽 :比預期中還麻煩的DIY