节点无法访问 ubuntu multipass 中的网络

节点无法访问 ubuntu multipass 中的网络

我的 Windows 10 笔记本电脑上有一个多通道虚拟机(ubuntu 22.04.1)。我通过 nvm 在其上安装了节点 v18.13.0(现在是 v19.5.0)。我的节点安装根本无法访问网络。

它首先从 npm 开始。npm install一直挂断。过了很长时间,它终于超时了。然后我写了一个简单的脚本,它刚刚fetch运行example.org,但也超时了。然后我在同一个虚拟机上启动了一个简单的 python 服务器,并尝试使用节点访问它。我ECONNREFUSED在连接调用时得到了一个。

在所有这一切中,curl一直运行良好。 它可以接触到registry.npmjs.orgexample.org而且localhost很好。

我没有任何防火墙或 vpn(至少据我所知)并且我使用家里的互联网,如果这很重要的话。


更新:我改成localhost127.0.0.1,然后 node.js 就可以建立连接了!我还检索了 的 IP 地址example.org并尝试了。它给出了一个,404但连接确实建立了!尝试使用域名进行 fetch 仍然失败,但给它明确的 IP 地址和端口可以工作。当然,Curl 仍然可以使用 IP 地址和域名。


更新:好的,至少我搞清楚了 localhost 的问题。http.server我使用的 python 默认只绑定到该地址IPv4,但 nodejs 正在尝试连接到该IPv6地址。启动 python 服务器后,--bind ::该部分就可以正常工作了。不过,我仍然对外部域一无所知。


更新:我尝试运行python代理localhost(使用代理) 并设置npm config set proxy http://localhost:8899。在日志中,我看到前几个CONNECT确实返回了一些数据,但过了一会儿,每个CONNECT调用都开始输出0字节。请求没有响应。

需要说明的是,我拥有这个虚拟机已经有一段时间了,我能够很好地通过它访问互联网。我可以使用、、、curl等,它们都可以轻松下载东西。只有这样我才面临这个问题。gitaptcargonpm / node


更新:所以我找到了问题所在!如果无法访问,Node.js则不会回退。等等,这样做所以我没有遇到任何问题。使用显式 v6 ip 运行会导致它像 npm 一样挂断。显然,默认情况下在多通道 vms 上未启用。IPv4IPv6curlpythoncurlIPv6

我认为它在我的版本上已启用。以下是输出ip -6 route show

::1 dev lo proto kernel metric 256 pref medium
2401:4900:1c2b:d225::/64 dev enp0s8 proto ra metric 200 expires 86143sec pref medium
2401:4900:1c2b:d225::/64 via fe80::1 dev enp0s8 proto ra metric 200 expires 86143sec pref high
fe80::/64 dev enp0s8 proto kernel metric 256 pref medium
fe80::/64 dev enp0s3 proto kernel metric 256 pref medium
default via fe80::1 dev enp0s8 proto ra metric 200 expires 1543sec pref low

这里确实设置了默认路线。

答案1

我认为该问题的解释可以在帖子中找到 IPv6 无法在使用多通道创建的虚拟机上运行

我在这里引用“dummyuser”(他的绰号)的回答:

Multipass 在客户端和主机之间使用名为 mpqemubr0 的单独网络(您可能有不同的接口名称)。此网络不通过 dhcpdv6 或 radvd(或两者)提供 IPv6 信息。您的 IPv6 路由表可以通过以下方式查看:ip -6 route show 猜测您的客户端没有 IPv6 的默认路由。

您的选择:

  1. 将 radvd/dhcpdv6 添加到在 Multipass 接口上提供 IPV6 信息的主机。您的主机充当 IPv6 路由器,也许您需要更多 ip6tables 规则来进行伪装,必须启用 IPv6 转发

  2. 将多通道接口的类型更改为桥接网络而不是路由。请参阅多通道文档

  3. 如果你的使用情况允许,请切换到docker,即使在这里IPv6也不能开箱即用,但它的速度要快得多

类似的帖子 多通道虚拟机的 IPv6 地址中需要接口名称(但主机或非多通道虚拟机不需要),作者放弃了多通道 VM,转而使用 Docker。有关使用 IPv6 设置 Docker 的详细说明,请参阅此帖子。

相关内容