使用 WSL2 的網路問題

使用 WSL2 的網路問題

目前我正在使用 Windows10 和 WSL2 以及 Ubuntu 20.04 進行開發。在大多數情況下,除了一個問題之外,這種方法效果很好。 Windows/WSL2 之間的網路層似乎出現了問題。當使用“ngserve”提供角度服務時,我無法從Windows存取它。

只有在VS Code 中使用終端並從終端輸出中的連結打開瀏覽器時,Windows 才會打開它- 但是,它不會打開“localhost:4200”,而是打開127.0.0.1:“隨機連接埠”,即我們的代理不允許,這意味著角度應用程式將顯示但不可用。執行此操作後,可以從 localhost:4201 存取應用程式 - 但之前從未從 VS Code 打開它。這意味著我無法使用其他終端(例如新的 Windows 終端或 ConEmu)來啟動應用程式。

據我所知,這是一個 Windows 問題,而不是 Linux 安裝本身的問題,但我還沒有找到一種方法來「重新安裝」WSL2 的 Windows 部分,而不會丟失 Linux 安裝上的所有資料。任何指示將不勝感激。

答案1

我的回答是基於這篇文章 從 WSL 2 運行公共伺服器,其中的理論是 Windows 創建了一個未與 Internet 網路介面卡正確橋接的虛擬適配器。

文章提出以下幾點:

  1. 在 WSL 中確保您的伺服器使用 IPv4

  2. 如果您在 WSL 中使用防火牆,請允許相關連接埠 (3390)

  3. 在 Windows 中,使用管理員權限在命令提示字元或 Powershell 中將連接埠從公用 IP 連接埠轉送至 WSL 連接埠:

     netsh interface portproxy add v4tov4 listenport=$PORT listenaddress=0.0.0.0 connectport=$PORT connectaddress=127.0.0.1
    
  4. 在 Windows 中,使用新的入站規則允許連接埠通過 Windows 防火牆。

  5. 若要從網路訪問,請為路由器中的連接埠設定連接埠轉送。

YouTube 影片描述了該過程,但有一些細微的差別 WSL 2 網路

答案2

我需要三件事才能使其發揮作用:

  1. 升級到最新版本的Windows
  2. wsl --shutdown
  3. 設定 > 網路和 Internet > 網路重設為此處描述

答案3

我也遇過這個;這是我的解決方案:WSL2-PortForward.cmd

它會為您處理連接埠代理程式和防火牆規則,並自行清理。

@ECHO OFF
SET LXDISTRO=MyWSL2vm & SET WSL2PORT=3399 & SET HOSTPORT=3398
NETSH INTERFACE PORTPROXY RESET & NETSH AdvFirewall Firewall delete rule name="%LXDISTRO% Port Forward" > NUL
WSL -d %LXDISTRO% -- ip addr show eth0 ^| grep -oP '(?^<=inet\s)\d+(\.\d+){3}' > IP.TMP
SET /p IP=<IP.TMP
NETSH INTERFACE PORTPROXY ADD v4tov4 listenport=%HOSTPORT% listenaddress=0.0.0.0 connectport=%WSL2PORT% connectaddress=%IP% 
NETSH AdvFirewall Firewall add rule name="%LXDISTRO% Port Forward" dir=in action=allow protocol=TCP localport=%HOSTPORT% > NUL
ECHO WSL2 Virtual Machine %IP%:%WSL2PORT%now accepting traffic on %COMPUTERNAME%:%HOSTPORT%

運行命令:

.\WSL2-PortForward.cmd

結果:

WSL2 Virtual Machine 172.17.109.95:3399 now accepting traffic on MYCOMPUTER:3398

答案4

這樣做解決了我的問題:

以管理員身分開啟 Hyper-V 管理員

選擇您的電腦,開啟虛擬交換器管理器

選擇WSL

設定為外網

選擇流量經過的網路卡

然後登入wsl2終端並配置IP位址。例如

sudo ip addr flush dev eth0 sudo dhclient eth0

這是我找到它的地方:https://stackoverflow.com/a/62438375/10853017

相關內容