You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

升级Node.js至v20.11.0 LTS出现ETIMEDOUT错误,求原因分析

问题原因分析与解决方案

核心原因:Node.js v20的DNS解析行为重大变更

Node.js v20相对于v19,在DNS解析逻辑上做了关键调整,和Tailscale的DNS配置机制产生了兼容性冲突:

  • 底层libuv库升级:v20升级了libuv到v1.44+版本,新版libuv优化了DNS解析的超时、重试策略,但同时也更严格遵循系统DNS服务器的优先级顺序。Tailscale会将自身DNS设为系统优先,当它处理公网域名(比如cognito-idp.eu-west-1.amazonaws.com)的解析请求时,可能存在转发延迟或兼容性问题,v20的解析器不会像v19那样自动 fallback 到其他系统DNS,直接触发超时错误。
  • 默认启用Happy Eyeballs v2:v20默认开启了Happy Eyeballs v2算法,用于优化IPv4/IPv6的连接优先级,但该算法在配合Tailscale的虚拟DNS配置时,可能出现解析路径的异常,导致无法正确获取目标IP,进而出现EHOSTUNREACH。

验证方法

在v20环境下手动指定公网DNS服务器测试,确认问题根源:

node --dns-servers 8.8.8.8 -e "fetch('https://cognito-idp.eu-west-1.amazonaws.com').then(console.log)"

如果该命令能正常返回400状态码,即可确认是Tailscale DNS与v20解析逻辑的兼容性问题。

可行解决方案

  • 临时规避:运行Node.js时通过--dns-servers参数指定可靠的公网DNS(如8.8.8.8、1.1.1.1)。
  • Tailside配置调整:在Tailscale管理面板中,添加公网域名的DNS转发规则,将*.amazonaws.com这类公网域名直接转发到公网DNS服务器,避免Tailscale自身处理这些请求。
  • 禁用Tailscale DNS(已验证有效):如果不需要Tailscale的内网域名解析,直接关闭Tailscale的DNS配置选项,恢复系统默认DNS即可。

内容的提问来源于stack exchange,提问作者Zak Henry

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 09:23:15