购买了新路由器,由于超时,yarn add/npm install 停止工作。我需要向 /etc/hosts 添加条目才能使它们正常工作

购买了新路由器,由于超时,yarn add/npm install 停止工作。我需要向 /etc/hosts 添加条目才能使它们正常工作

我曾经有一个华硕 RT-AC86U路由器,我可以运行yarn addnpm install无需修改/etc/hosts。现在我刚买了一个D-Link EXO AX AX3200路由器无需修改默认设置。但是,由于网络连接失败和超时问题,yarn/npm 不再工作:

verbose 0.284464907 Performing "GET" request to "https://yarnpkg.com/latest-version".
[1/4] Resolving packages...
verbose 0.354563031 Performing "GET" request to "https://registry.yarnpkg.com/@apollo%2fclient".
info There appears to be trouble with your network connection. Retrying...

但我可以https://registry.yarnpkg.com/@apollo%2fclient通过浏览器访问。

我也可以直接用 curl: 下载包curl -o test.tgz -v https://registry.yarnpkg.com/vue-axios/-/vue-axios-2.1.4.tgz。所以我很确定问题出在 npm/yarn 配置上。

解决方案是添加这些条目/etc/hosts以使命令起作用:

104.16.93.83   registry.npmjs.org
104.16.26.35   yarn.npmjs.org

旧路由器不需要这样做,所以我对这款 D-link 路由器的体验非常糟糕。更换路由器后,您是否遇到过此类 npm/yarn 问题?

这是纱线配置:

yarn config v1.22.19
info yarn config
{
  'version-tag-prefix': 'v',
  'version-git-tag': true,
  'version-commit-hooks': true,
  'version-git-sign': false,
  'version-git-message': 'v%s',
  'init-version': '1.0.0',
  'init-license': 'MIT',
  'save-prefix': '^',
  'bin-links': true,
  'ignore-scripts': false,
  'ignore-optional': false,
  registry: 'https://registry.yarnpkg.com',
  'strict-ssl': true,
  'user-agent': 'yarn/1.22.19 npm/? node/v19.9.0 linux x64'
}
info npm config
{
  prefix: '/home/me/.node_modules'
}

更新:

我的 ISP 不允许我启用 IPV6。以下是来自https://test-ipv6.com/

在此处输入图片描述


$ traceroute to yarn.npmjs.org (2606:4700::6810:1423), 30 hops max, 80 byte packets

# 1  R32-CEEE.local (ROUTER_IP_V^_ADDRESS)  0.636 ms  0.595 ms  0.588 ms
  2  * * *

答案1

根据您的跟踪路由结果,即使您的 ISP 不提供 IPv6 连接,你的路由器无论如何都会发布它并告诉主机配置默认 IPv6 路由。

(我怀疑路由器认为它已与 ISP 建立 IPv6 连接——如果没有,我预计 traceroute 会在第二跳处停止并显示“!X”“无法访问”错误——但实际上它似乎正在转发数据包某处进一步。如果 ISP 确实只支持 IPv4,则不会发生这种情况。)

之前的路由器没有将自己宣传为 IPv6 默认网关,因此操作系统一开始就不会尝试查找域的 IPv6 地址(因为它识别出自己位于仅 IPv4 的网络上)。由于新路由器同时宣传 IPv4 和 IPv6 默认路由,因此程序现在会相应地查找 IPv4 和 IPv6 地址。

有些程序(如 curl 或网络浏览器)似乎有效,因为它们尝试两个都同时使用 IPv4 和 IPv6(使用“Happy Eyeballs”算法)并使用响应最快的地址。

但大多数程序会按顺序尝试所有已解析的地址,首先尝试 IPv6 地址,如果数据包直接进入空洞,则会导致长时间超时。不过,通常情况下,程序至少应该尝试使用其他地址,而不是直接放弃。

(再次,奇怪的是路由器没有立即响应“目的地不可达”;这也可以避免超时并导致程序直接回退到 IPv4 - 但似乎 ISP 本身提供了一个不起作用的 v6 默认路由。)

建议:

  • 尝试禁用 IPv6在路由器上首先,这样它就不会将自己宣传为网关。(您可能正在寻找“SLAAC”设置。)集中执行会更好,因为同一个问题会影响您所有的 LAN 设备,而不仅仅是一台计算机。

    您可以使用rdisc6(来自 ndisc6 包)来验证路由器通告现在是否显示“路由器寿命”为零 - 或者路由器是否已停止发送 RA。

  • 同时,再次检查是否可以使能够与您的 ISP 一起使用 IPv6。可能是 D-Link 路由器有点傻,但也可能是 ISP 最近确实开始提供 IPv6。

  • 如果失败,请将 NetworkManager 配置为不进行自动 IPv6 配置(例如,将ipv6.method参数设置为其他值)。您无需过度禁用系统范围内的 IPv6,只要确保它停止为您的 LAN 选择 IPv6 地址和 ::/0 路由就足够了。

相关内容