看懂 Xray 内核运行日志:常见报错含义与定位方法

逐条拆解 failed to dial、context canceled、invalid user、TLS handshake 等日志关键词,说明日志级别设置与从报错反推配置问题的思路。

本文速览

适合使用 v2rayN、v2rayNG,遇到节点超时、网页打不开或连接反复中断的用户。先区分客户端提示与 Xray 内核日志,再按本地监听、DNS、出站连接、安全握手、协议认证的顺序缩小范围。重点不是背报错,而是找到同一次请求最底层的失败原因,并用一次可重复的测试验证修改。

先分清日志来源,再看请求停在哪层

v2rayN 是图形客户端,Xray 是实际处理代理流量的内核。订阅下载失败、界面启动异常和代理出站失败,不一定来自同一套日志。看到「已启动服务」,只能说明启动流程走到了某一步,不能据此判断节点认证成功,更不能判断目标网页已经可达。

先看启动输出里的内核名称与版本,再确认当前节点实际使用的核心。v2rayNG 使用 Xray;v2flyNG 使用 V2Fly,不能把两者的字段支持范围直接画等号。特别是 VLESS、REALITY 相关问题,要围绕正在运行的内核查,不要只看客户端安装包版本。

本地入站 路由选出站 节点地址解析 连接与握手 协议认证 目标访问

这条链是阅读顺序,不代表所有传输都严格分成六个独立阶段。例如某些协议把认证与握手结合处理,目标域名也可能在服务端解析。定位时要问:错误里的地址是本地监听地址、节点地址,还是最终目标地址?同样是端口 443,位置不同,排查方向就不同。

10808
下文演示的本地代理端口,以实际配置为准
443
常见 TLS 服务端口,不等于必然使用 TLS
5
日志级别取值,包含关闭输出的 none

打开日志:用一次请求建立可复现记录

日常保留 warning 通常足够;需要观察连接过程时先用 info,信息不足再短时切到 debug。Xray 的 loglevel 可取 debug、info、warning、error、none。这是错误日志的级别控制,访问日志是否记录还取决于 access 设置;调高日志级别不会自动修复连接。

  1. 确认内核

    在 v2rayN 主界面的运行信息中查看启动输出,记下实际调用的内核名称与版本。若输出中连内核启动记录都没有,先处理启动失败,不要直接排查远端节点。

  2. 调整级别

    v2rayN 进入「设置」→「参数设置」,查找「日志等级」并改为 info;v2rayNG 进入侧边菜单「设置」→「日志等级」。不同版本的分组和译名可能变化,找不到时先核对客户端版本,不要把其他内核的设置套进来。

  3. 重启复现

    保存后重启代理服务,确认新设置已生效。关闭持续刷新的网页,只打开一个固定测试地址,记下操作时间,并保留该时刻前后约 10 秒的日志。

  4. 还原级别

    查到原因后把级别恢复为 warning。分享日志前处理账号标识、订阅地址、节点地址和访问域名;保留时间顺序、协议名称、端口与错误链结构。

使用自定义 Xray 配置时,可核对下面的日志片段。它只是配置中的一个字段,不是可直接运行的完整配置。由客户端生成配置的模式下,应通过客户端设置修改,直接编辑临时文件可能在下次启动时被覆盖。

{
  "log": {
    "loglevel": "info"
  }
}

failed to dial:沿错误链找真正失败的位置

failed to dial 表示某次拨号或建立连接失败,本身通常只是上层包装。它后面的 lookup、connection refused、i/o timeout 才更接近原因。先把整条错误展开读完,再决定改 DNS、端口还是路由,不要看到 dial 就重填 UUID。

failed to dial

原因:连接过程失败的概括,可能涉及地址解析、TCP 连接或传输封装。

解法:继续读其后的嵌套错误,核对目的地址和出站标签;如果只截到了这几个词,先补齐同一行日志。

lookup ...: no such host

原因:解析没有得到可用地址;可能是域名拼写、上游返回结果或 DNS 路由问题,不等同于已经证明遭到污染。

解法:先确认被解析的是节点域名还是目标域名,再检查相应 DNS 上游能否到达及节点域名的引导解析路径。

connect: connection refused

原因:连接被主动拒绝,常见于端口没有服务监听、地址或端口填错,也可能由中间设备返回拒绝。

解法:核对订阅中的端口;自建服务再检查监听地址和防火墙。重试相同配置通常不会改变端口未监听的事实。

i/o timeout

原因:某个网络操作未在期限内完成;必须结合前文判断是解析、建连还是读取阶段。

解法:保留同一节点和配置,切换一个网络复测;若只在一个网络超时,先查该网络路径,再考虑调整节点参数。

比如错误明确写着连接节点的 TCP 443 超时,此时还没有足够证据指向 VLESS 用户认证。反过来,若节点连接已建立,但后面是目标地址读取失败,就不能只查本地到节点的连通性。地址、阶段和时间必须一起看。

TLS handshake 与 invalid user:分开检查安全层和认证层

TLS 握手错误通常出现在连接已进入安全协商之后,但并不保证一定是证书问题。普通 TLS 节点要核对 serverName、证书链、系统时间及传输设置;VLESS + REALITY 则还要核对公钥、shortId、serverName 和服务端配置。两类节点不能共用一张「关闭验证」处方。

关键词优先核对不要直接推断
TLS handshake错误链是否同时含 EOF、证书错误或超时;客户端安全类型是否匹配服务端不能只凭这两个词确定证书过期
x509: certificate has expired or is not yet valid客户端日期、时区、证书有效期及服务端证书部署不应直接开启跳过证书验证
x509: certificate is valid for后续列出的证书域名与所验证的 serverName 是否匹配连接 IP 与证书域名不同不一定是错误配置
invalid user日志来源、协议类型、用户标识以及对应服务端用户条目不是所有客户端认证失败都会显示这段文字
EOF对端在何时关闭连接,是否伴随握手、传输或认证信息不能单独据此认定账号失效

invalid user 更可能在服务端入站认证日志中提供直接线索,具体措辞随协议和版本变化。客户端有时只能看到 EOF 或连接关闭。若能查看服务端,应按时间对齐两端记录,检查 UUID 是否一致、该用户是否已加载、端口是否落到了预期入站。使用 VMess 时还要检查系统时间;VLESS 不要照搬 VMess 的 alterId 设置。

context canceled:先判断是否只是请求被取消

context canceled 的意思是该操作所属的上下文被取消。关闭标签页、浏览器抢先建立连接后弃用、切换节点或重启内核,都可能产生这类记录。它不是「节点一定失效」的同义词,也不能单独证明 DNS 或证书异常。

网页能打开,为什么还有 context canceled?

先停止刷新、关闭多余标签,只打开一个页面。如果取消日志出现在页面加载完成或关闭之后,而且没有持续失败,通常不必为这条伴随记录修改节点。

点开网页就报取消,怎么找根因?

截取同一时刻前后的日志,按请求标识关联记录;若该版本没有标识,就结合时间、目标地址与出站标签判断。优先找取消之前的解析失败、握手错误或连接超时。

切换节点后刷出一串取消,需要重装吗?

切换会终止旧连接。等待新内核完成启动,再发起一次新请求;只分析新启动时间之后的记录。旧连接的取消信息不能用来判断新节点是否可用。

订阅更新失败也要查这份日志吗?

先查客户端的订阅更新结果。只有更新请求实际经过当前代理时,内核日志才可能提供对应线索;请求未进入内核时,盯着出站日志找不到订阅服务返回的具体错误。

本地端口与路由:先确认请求真的进入代理

如果内核启动后立刻出现 address already in use 或 Windows 的 Only one usage of each socket address,优先处理本地监听冲突。先确认不是另一个客户端实例仍在运行,再检查占用进程。修改代理端口后,浏览器手动代理与系统代理也要同步,不能只改客户端一处。

下面以 Windows 的本地端口 10808 为例。命令仅用于检查占用,不要把其他程序的 PID 未经确认就结束。端口并非固定默认值,应替换成当前配置里实际监听的端口。

netstat -ano | findstr :10808

若该端口提供 SOCKS 入站,可用下面的命令显式经过代理发起一次请求。Windows 使用 curl.exe 可避免部分终端对 curl 名称的别名处理;socks5h 会把目标域名交给代理端处理,而不是先由 curl 在本地解析。若入站只提供 HTTP 代理,应使用对应的 HTTP 代理参数,不能照抄 SOCKS 命令。

curl.exe --proxy socks5h://127.0.0.1:10808 --connect-timeout 10 --max-time 20 -I https://example.com/

整理排错记录:每次只改一个变量

有效的排错记录不需要贴几千行。保留内核版本、故障发生时间、操作入口和一条完整错误链,比只发「连接不上」更容易判断。若一次同时改 DNS、flow、端口和传输,偶然恢复后也很难知道哪个改动有效,下次故障仍得重来。

  1. 写明环境:操作系统、客户端版本、实际内核版本,以及系统代理、应用手动代理或 TUN 中哪一种正在使用。
  2. 写明预期:例如「请求应经 SOCKS 10808 进入,再由指定 VLESS 出站访问测试地址」,而不是仅写「已连接」。
  3. 保留上下文:提供启动完成记录、发起请求时间和前后约 10 秒日志;保留完整嵌套错误,不只截最后一行。
  4. 记录单次改动:每轮只修改一项,重启后重复同一测试。无效则恢复原值,再进入下一项。
  5. 收尾复核:恢复日常日志等级,确认浏览器和测试命令均符合预期;更详细的基础操作可对照客户端使用教程。

读 Xray 日志的核心是定位失败边界:本地没监听,就先修本地;节点地址没解析,就先查解析;TCP 已连接但握手失败,再查安全与传输参数;认证后才出错,则继续看目标访问。把错误放回请求链里,比围着一个关键词反复试参数更可靠。

客户端下载v2rayN / v2rayNG