我曾经有一个华硕 RT-AC86U路由器,我可以运行yarn add
或npm 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 路由就足够了。