使用 WSL2 的网络问题

使用 WSL2 的网络问题

目前,我正在使用 Windows10 和 WSL2 以及 Ubuntu 20.04 进行开发。除了一个问题外,大多数情况下,它都运行良好。Windows/WSL2 之间的网络层似乎出现了问题。当使用“ng serve”提供 angular 时,我无法从 Windows 访问它。

仅当在 VS Code 中使用终端并从终端输出中的链接打开浏览器时,Windows 才会打开它 - 但是,它不会打开“localhost:4200”,而是打开 127.0.0.1:“随机端口”,这是我们的代理不允许的,这意味着 Angular 应用程序将显示但无法使用。执行此操作后,该应用程序可从 localhost:4201 访问 - 但在从 VS Code 打开它之前从未访问过。这意味着我无法使用其他终端(如新的 Windows 终端或 ConEmu)来启动应用程序。

据我所知,这是一个 Windows 问题,而不是 Linux 安装本身的问题,但我还没有找到一种方法来“重新安装”WSL2 的 Windows 部分,而不会丢失 Linux 安装上的所有数据。如有任何指点,我将不胜感激。

答案1

我的回答基于这篇文章 从 WSL 2 运行公共服务器,其原理是 Windows 创建的虚拟适配器没有与互联网网络适配器正确桥接。

文章提出以下几点:

  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-端口转发.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

相关内容