使用 WSL 存取網路應用程式
使用網路應用程式和 WSL 時,有幾個要注意的考慮。 根據預設,WSL 會使用 NAT 架構,我們建議嘗試新的 鏡像網路模式 以取得最新的功能和改進。
識別 IP 位址
識別透過 WSL 執行的 Linux 散發套件所使用的 IP 位址時,需要考慮兩種情況:
案例一: 從 Windows 主機的觀點來看,您想要查詢透過 WSL2 執行的 Linux 發行版 IP 位址,讓 Windows 主機上的程式可以連線到在散發套件內執行的伺服器程式(實例)。
Windows 主機可以使用 命令:
wsl -d <DistributionName> hostname -I
如果查詢預設散發,則可以省略指定散發的命令這個部分: -d <DistributionName>
。 請務必使用大寫 -I
旗標,而不是小寫 -i
。
在幕後,主機命令 wsl.exe
會啟動目標實例,並執行 Linux 命令 hostname -I
。 這個指令接著會將 WSL 實體的 IP 位址列印至 STDOUT
。 STDOUT
文字內容接著會轉送回wsl.exe。 最後,wsl.exe會顯示該輸出至命令行。
一般輸出可能是:
172.30.98.229
案例二: 透過 WSL2 (實例) 在 Linux 散發套件內執行的程式想要知道 Windows 主機的 IP 位址,讓 Linux 程式可以連線到 Windows 主機伺服器程式。
WSL2 Linux 使用者可以使用 命令:
ip route show | grep -i default | awk '{ print $3}'
一般輸出可能是:
172.30.96.1
172.30.96.1
因此,是 Windows 的主機 IP 位址,在此範例中為 。
注意
當 WSL2 以預設 NAT 網路模式執行時,通常需要上述 IP 位址查詢動作。
當 WSL2 以新的 鏡像模式執行時,Windows 主機和 WSL2 VM 可以使用 (127.0.0.0.1) 作為目的地位址彼此連線 localhost
,因此不需要使用查詢對等 IP 位址的訣竅。
默認網路模式:NAT
根據預設,WSL 會使用 NAT(網路地址轉譯)型架構來進行網路功能。 使用 NAT 型網路架構時,請記住下列考慮:
從 Windows (localhost) 存取 Linux 網路應用程式
如果您要在 Linux 發行版本中建立網路應用程式 (例如,在 NodeJS 或 SQL 伺服器上執行的應用程式),您可以使用 localhost
從 Windows 應用程式 (例如您的 Edge 或 Chrome 網際網路瀏覽器) 進行存取 (如同您平時執行的動作)。
從 Linux (主機 IP) 存取 Windows 網路應用程式
如果您想要從 Linux 發行版本 (也就是 Ubuntu) 存取在 Windows 上執行的網路應用程式 (例如,在 NodeJS 或 SQL 伺服器上執行的應用程式),則需要使用主機電腦的 IP 位址。 雖然這不是常見的案例,但您可以遵循下列步驟來讓其執行。
- 從 Linux 發行版本執行下列命令,以取得主機電腦的 IP 位址:
ip route show | grep -i default | awk '{ print $3}'
- 使用複製的 IP 位址連線到任何 Windows 伺服器。
下圖顯示這種情況的範例,透過 curl 連線到在 Windows 中執行的 Node.js 伺服器。
透過遠端 IP 位址連線
使用遠端 IP 位址連線到您的應用程式時,系統會將其視為來自區域網路 (LAN) 的連線。 這表示您必須確定您的應用程式可以接受 LAN 連線。
例如,您可能需要將應用程式繫結至 0.0.0.0
,而不是 127.0.0.1
。 在使用 Flask 的 Python 應用程式範例中,您可以使用下列命令來完成這項作業:app.run(host='0.0.0.0')
。 進行這些變更時,請記住安全性,因為這可允許來自您的 LAN 的連線。
從區域網路 (LAN) 存取 WSL 2 發行版本
使用 WSL 1 發行版本時,如果您的電腦設定為在您的 LAN 中存取,則在 WSL 中執行的應用程式也可以在您的 LAN 上存取。
這不是 WSL 2 中的預設案例。 WSL 2 具有虛擬化的乙太網路介面卡,而且具有自己的唯一 IP 位址。 目前若要啟用這個工作流程,您需要進行與一般虛擬機器相同的步驟。 (我們正在尋找改善這種體驗的方式。)
下列是使用 Netsh interface portproxy Windows 命令新增連接埠 Proxy 的範例,以便在主機連接埠上接聽,並將該連接埠 Proxy 連線至 WSL 2 VM 的 IP 位址。
netsh interface portproxy add v4tov4 listenport=<yourPortToForward> listenaddress=0.0.0.0 connectport=<yourPortToConnectToInWSL> connectaddress=(wsl hostname -I)
在此範例中,您必須將 <yourPortToForward>
更新為連接埠號碼,例如 listenport=4000
。 listenaddress=0.0.0.0
表示從任何 IP 位址接受傳入要求。 接聽位址會指定要接聽的 IPv4 位址,而且可變更為值,包括:IP 位址、電腦 NetBIOS 名稱或電腦 DNS 名稱。 如果未指定位址,則預設值是本機電腦。 您需要將 <yourPortToConnectToInWSL>
值更新為您想要 WSL 連線的連接埠號碼,例如 connectport=4000
。 最後,connectaddress
值必須是透過 WSL 2 安裝的 Linux 發行版本所用的 IP 位址 (WSL 2 VM 位址),您可以輸入命令找到此位址:wsl.exe hostname -I
。
此命令如下所示:
netsh interface portproxy add v4tov4 listenport=4000 listenaddress=0.0.0.0 connectport=4000 connectaddress=192.168.101.100
若要取得 IP 位址,請使用:
wsl hostname -I
可找出透過 WSL 2 安裝的 Linux 發行版本 IP 位址 (WSL 2 VM 位址)cat /etc/resolv.conf
可找出 WSL 2 視角的 Windows 電腦 IP 位址 (WSL 2 VM)
使用 listenaddress=0.0.0.0
將會接聽所有 IPv4 連接埠。
注意
搭配主機名命令使用小寫 「i」 會產生與使用大寫 「I」 不同的結果。 wsl hostname -i
是本機計算機 (127.0.1.1 是佔位元診斷位址),而 wsl hostname -I
會傳回本機計算機的IP位址,如其他電腦所見,而且應該用來識別 connectaddress
透過WSL 2 執行的Linux散發套件。
IPv6 存取
wsl hostname -i
可找出透過 WSL 2 安裝的 Linux 發行版本 IP 位址 (WSL 2 VM 位址)ip route show | grep -i default | awk '{ print $3}'
可找出 WSL 2 視角的 Windows 電腦 IP 位址 (WSL 2 VM)
使用 listenaddress=0.0.0.0
將會接聽所有 IPv4 連接埠。
鏡像模式網路
在執行 Windows 11 22H2 和更新版本的電腦上,您可以在 檔案中.wslconfig
設定 networkingMode=mirrored
,[wsl2]
以啟用鏡像模式網路。 啟用這項功能會將 WSL 變更為全新的網路架構,其目標是將 Windows 上的網路介面「鏡像」到 Linux,以新增網路功能並改善相容性。
以下是啟用此模式的目前優點:
- IPv6 支援
- 使用 localhost 位址
127.0.0.1
從 Linux 內連線到 Windows 伺服器。 不支援 IPv6 localhost 位址::1
- 改善 VPN 的網路相容性
- 多播支援
- 直接從局域網路連線到 WSL (LAN)
注意
在 PowerShell 視窗中,以系統管理員許可權執行下列命令,以 設定 Hyper-V 防火牆 設定以允許輸入連線: Set-NetFirewallHyperVVMSetting -Name '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -DefaultInboundAction Allow
或 New-NetFirewallHyperVRule -Name "MyWebServer" -DisplayName "My Web Server" -Direction Inbound -VMCreatorId '{40E0AC32-46A5-438A-A0B2-2B479E8F2E90}' -Protocol TCP -LocalPorts 80
。
這個新模式可解決使用 NAT(網路位址轉譯)架構時所看到的網路問題。 在 GitHub 上的 WSL 產品存放庫中找出任何 Bug 的已知問題或檔案意見反應。
DNS 通道
在執行 Windows 11 22H2 和更新版本的電腦上,檔案中的 .wslconfig
設定dnsTunneling=true
[wsl2]
會使用 WSL 使用虛擬化功能來回應來自 WSL 的 DNS 要求,而不是透過網路封包要求它們。 這項功能旨在改善與 VPN 的相容性,以及其他複雜的網路設定。
自動 Proxy
在執行 Windows 11 22H2 和更新版本的電腦上,autoProxy=true
在檔案中的 .wslconfig
設定[wsl2]
會強制 WSL 使用 Windows 的 HTTP Proxy 資訊。 如果您已在 Windows 中設定 Proxy,啟用此功能也會讓該 Proxy 在 WSL 中自動設定。
WSL 和防火牆
在執行 Windows 11 22H2 和更新版本的電腦上,WSL 2.0.9 和更新版本預設會開啟 Hyper-V 防火牆功能。 這可確保:
- 若要深入瞭解將自動套用至 WSL 的 Windows 安全性功能,請參閱 具有進階安全性 的 Windows Defender 防火牆。
- 請參閱 設定 Hyper-V 防火牆 ,以深入瞭解如何在本機和透過 Intune 等在線工具套用這些規則和設定。