目前,我正在使用 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 创建的虚拟适配器没有与互联网网络适配器正确桥接。
文章提出以下几点:
在 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-端口转发.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