让你的WSL2发行版像网络中的任何其他客户端一样运行
基于Roelofs的建议第二项,以下是我个人案例中使一切正常的方法。可惜我太新了还不能只留下评论。
我的起点:
Win 10专业版
在WSL2下运行Ubuntu
(具有Linux容器的Docker)
我的目标:
将来自网络上的客户端的rtmp流输入并从在Ubuntu机器上运行的nginx服务器输出。
构建桥梁
在我的情况下,我无法使Hyper-V正确设置该桥梁。在Hyper-V管理器的虚拟开关部分选择WSL开关的外部网络并点击应用后,最终以错误0x80070490失败。不知道为什么,也没有时间去调查。WSL和Docker服务都没有运行。
相反,我只是将设置保留在内部网络上,并手动在“网络连接”(运行->ncpa.cpl)下建立了接口桥接。在我的情况下,是WiFi连接和vEthernet(WSL)。
在这样做之后立即失去了互联网连接,并且花费了我尴尬的长时间才发现需要重新启动。 (Windows这一次没有询问我!)
让虚拟机良好运转
重新启动后,我现在可以从主机上访问互联网,桥接设置为DHCP并继承了WiFi接口的IP地址(192.168.1.246)。很好。
但是虚拟机仍然获得虚拟开关的IP地址(或者无论你怎样看待它,Windows似乎会分配给开关和VM的随机172.x.x.x地址)。
启动Ubuntu后,我决定执行:
sudo ip addr flush dev eth0
继续:
sudo dhclient eth0
我从Windows商店使用原版Ubuntu发行版,它向我抛出了一堆错误,因为它没有systemd。尽管如此,它成功将桥接的IP添加到了eth0。但这并不是非常方便,所以我用以下方法解决了这个问题:
sudo ip addr del 192.168.1.248/24 dev eth0
在查看路由表之前,先偷偷瞄一眼:
user@vm:~$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
删除旧IP后,我添加了一个来自DHCP范围外的唯一IP:
sudo ip addr add 192.168.1.50/24 dev eth0
我再次检查了路由表,第一项已经不存在了。此时我可以ping通局域网但无法ping通广域网。
使用以下命令重新添加该项:
sudo ip route add default via 192.168.1.1 dev eth0
现在可以ping通WAN IP,但无法解析DNS。
LMGTFM: 添加永久DNS
万一解决方法不见了,在这里,感谢non-static:
创建文件:/etc/wsl.conf。
在文件中加入以下内容
[network]
generateResolvConf = false
在cmd窗口中运行wsl --shutdown
重新启动WSL2
创建文件:/etc/resolv.conf。如果已存在该文件,请使用此新文件替换原有文件。
在文件中加入以下内容
nameserver 8.8.8.8
或者你想要使用的任何DNS服务器的IP地址,重复步骤3和4。
因此,总结一下,检查路由并正确设置DNS-conf。不幸的是,每次重新启动WSL时IP设置都会被还原。如果您不想每次手动执行此操作,有关如何自动化此操作的讨论在这里和这里。我还没有找到自己最喜欢的方法。最好的问候,
Alexander