![使用 WSL2 的網路問題](https://rvso.com/image/1628807/%E4%BD%BF%E7%94%A8%20WSL2%20%E7%9A%84%E7%B6%B2%E8%B7%AF%E5%95%8F%E9%A1%8C.png)
目前我正在使用 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 網路介面卡正確橋接的虛擬適配器。
文章提出以下幾點:
在 WSL 中確保您的伺服器使用 IPv4
如果您在 WSL 中使用防火牆,請允許相關連接埠 (3390)
在 Windows 中,使用管理員權限在命令提示字元或 Powershell 中將連接埠從公用 IP 連接埠轉送至 WSL 連接埠:
netsh interface portproxy add v4tov4 listenport=$PORT listenaddress=0.0.0.0 connectport=$PORT connectaddress=127.0.0.1
在 Windows 中,使用新的入站規則允許連接埠通過 Windows 防火牆。
若要從網路訪問,請為路由器中的連接埠設定連接埠轉送。
YouTube 影片描述了該過程,但有一些細微的差別 WSL 2 網路。
答案2
我需要三件事才能使其發揮作用:
- 升級到最新版本的Windows
wsl --shutdown
- 設定 > 網路和 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