使用 WSL 存取網路應用程式
使用網路應用程式和 WSL 時,有幾個要注意的考慮。 根據預設,WSL 會使用 NAT 架構,我們建議嘗試新的 鏡像網路模式 以取得最新的功能和改進。
默認網路模式: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 連接埠。
鏡像模式網路
您可以在 檔案中.wslconfig
設定 networkingMode=mirrored
,[wsl2]
以啟用鏡像模式網路。 啟用這項功能會將 WSL 變更為全新的網路架構,其目標是將 Windows 上的網路介面「鏡像」到 Linux,以新增網路功能並改善相容性。
以下是啟用此模式的目前優點:
- IPv6 支援
- 使用 localhost 位址
127.0.0.1
從 Linux 內 連線 到 Windows 伺服器。 不支援 IPv6 localhost 位址::1
- 改善 VPN 的網路相容性
- 多播支援
- 直接從局域網路將 WSL 連線 至 WSL
注意
在 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 通道
在檔案中的 .wslconfig
下[wsl2]
設定dnsTunneling=true
具有 WSL 使用 virtulization 功能來回應來自 WSL 內的 DNS 要求,而不是透過網路封包要求。 這項功能旨在改善與 VPN 的相容性,以及其他複雜的網路設定。
自動 Proxy
在 .wslconfig
檔案中的 下[wsl2]
設定autoProxy=true
會強制 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 等在線工具套用這些規則和設定。
意見反應
https://aka.ms/ContentUserFeedback。
即將推出:在 2024 年,我們將隨著內容的意見反應機制逐步淘汰 GitHub 問題,並以新的意見反應系統來取代。 如需詳細資訊,請參閱提交並檢視相關的意見反應