2026-08-24 · 故障排查 · 约 8 分钟

v2rayNG 内核启动失败怎么办:从日志定位 config 配置错误

打开客户端日志,按 JSON 语法错误、字段拼写、inbound 冲突、outbound 参数缺失四类报错逐条对照,快速找到出错的配置行。

本文速览

适用于 v2rayNG 点击启动后立即停止、提示配置加载失败,或自定义 config 导入后无法运行的情况。先保留一次完整启动日志,再按解析、字段、监听、出站四层检查。普通订阅节点优先在编辑页面修正字段;自定义配置才需要直接检查 JSON,不必一开始就重装客户端。

先打开日志,区分启动失败与连接失败

在 v2rayNG 主界面打开左上角侧边菜单,进入「日志」。先停止服务,清空旧日志,再返回主界面选择出错节点并启动一次;随后回到「日志」,保留这次启动的完整记录。不同版本的入口位置可能调整,以界面中的「日志」项为准。不要只截最后一行“启动失败”,真正的原因往往在它上方。

  1. 备份原配置

    记录当前节点名称和配置类型。手工维护的 JSON 先保存副本;订阅节点记下所属分组,避免后续更新覆盖临时修改。

  2. 记录环境

    在侧边菜单「关于」记录客户端版本;如果启动日志显示 Xray 版本,也一并保存。客户端版本与内核版本不是同一个编号。

  3. 单次复现

    停止服务后清空日志,只启动一次。若出现 Android VPN 授权提示,先确认授权,避免把授权取消当成配置错误。

  4. 读取原因链

    从 failed to load config 或 failed to start 往后读。遇到多层原因时,继续找到具体字段、端口或 JSON 解析提示。

如果日志已经进入接收请求阶段,随后才出现 connection refused、i/o timeout 或证书握手错误,通常属于连接阶段故障,不等于内核没有启动。此时反复调整 JSON 标点并不能解决远端端口不可达或证书不匹配的问题。

配置解析参数构建本地监听请求路由远端连接

前面三步失败,优先检查本篇的配置与端口;后面两步失败,再查路由、DNS、节点可达性与 TLS。日志措辞会随 Xray 版本变化,下面列出的是常见报错片段,不要求整行完全相同。

第一类:JSON 语法错误,先修括号与数据类型

自定义配置刚粘贴就无法启动,先查 JSON。对象的键必须使用英文双引号,字符串也必须用双引号;对象和数组的末项后面不要保留多余逗号。为减少解析器差异,排查时使用不含注释的标准 JSON。

报错:invalid character '}' looking for beginning of object key string

原因:对象结束前可能多了逗号,解析器仍在等待下一个键。解法:检查报错位置前一项,删除末尾逗号,并确认配对的大括号没有多写。

报错:unexpected EOF

原因:内容在对象、数组或字符串尚未结束时就被截断。解法:重新核对复制范围,补齐真正缺失的内容,而不是只在文件末尾机械添加括号。

报错:cannot unmarshal string into Go struct field

原因:字段类型与内核期望不一致。解法:连同后面的字段路径一起阅读,按对应字段要求改成数字、布尔值、数组或对象。

下面是一个用于说明语法的局部对象,不是可直接导入的完整代理配置。port 使用数字,listen 使用字符串,最后一项后面不带逗号。发现类型错误时,应按字段逐项修正,不要把所有数字都改成字符串。

{
  "listen": "127.0.0.1",
  "port": 10808,
  "protocol": "socks"
}

第二类:字段拼写错误,JSON 合法不代表配置有效

语法通过后,检查字段名称、层级和枚举值。顶层通常是 inbounds 与 outbounds 两个数组,而不是单数形式;传输设置使用 streamSettings,其中 network 的值也必须是内核支持的名称。键名大小写不能随意更改。

报错:unknown transport protocol: websoket

原因:传输协议名称不是可识别的枚举值。解法:按服务端要求修正 streamSettings.network;服务端使用 WebSocket 时应填写 ws。

还要注意:部分未知字段可能被解析器忽略,而不是直接报“字段拼错”。所以“没有语法报错”不能证明参数生效。普通节点应返回主界面,打开该节点的编辑页面,逐项对照地址、端口、协议与传输设置;不要为了修一个字段就把整个节点改成自定义 JSON。

第三类:inbound 监听冲突,核对地址与端口

日志出现 bind: address already in use,说明本地监听端点已被占用。这是设备上的端口冲突,不是节点服务器拒绝连接。先停止其他代理服务,再检查自定义配置中是否重复声明了相同监听地址、端口与传输协议。

10808
示例:发生冲突的本地 TCP 端口
10818
示例:确认空闲后可尝试的替代端口
1–65535
端口数值范围;本地手动监听通常选高位端口

这些数字用于说明排查方法,不代表所有版本的默认值。普通配置可在侧边菜单「设置」中查找本地 SOCKS 端口设置,修改后停止并重新启动服务;具体名称以当前版本为准。自定义 JSON 则检查实际 inbounds 中的 listen 和 port,不要假定通用设置会覆盖自定义配置。

报错:listen tcp 127.0.0.1:10808: bind: address already in use

原因:该 TCP 监听端点已被其他监听占用。解法:停止占用服务,或改用确认空闲的高位端口;随后同步修改手工填写该代理端口的应用。

结论:只改本地端口,不改节点端口

看到日志中的 listen 与 bind,先处理本地入站。不要顺手把远端服务器端口也改成 10818;远端端口必须与服务端实际监听一致。

0.0.0.0 表示通配监听,可能与同端口的特定 IPv4 地址监听冲突。两个入站是否冲突还取决于 TCP、UDP 与地址族,不能只按端口数字判断。也不要为绕开问题随意开启局域网访问,这会扩大本地代理的可访问范围。

第四类:outbound 参数缺失,按协议核对必填项

出站决定连接哪台服务器、使用什么协议以及如何认证。VMess 与 VLESS 的常见 JSON 出站在 settings.vnext 中定义服务器,并在 users 中定义用户;Trojan 通常使用 settings.servers。把不同协议的字段互相拼接,即使 JSON 合法,也可能在构建出站时失败。

协议先检查的配置路径常见问题
VMesssettings.vnext[].address / port / users[].id地址为空、端口缺失、用户 ID 格式错误
VLESSsettings.vnext[].users[].id / encryptionUUID 不合法;常规配置的 encryption 应为 none,且须符合当前内核要求
Trojansettings.servers[].address / port / password误用 vnext 结构,或遗漏密码与服务器地址

报错:invalid UUID

原因:用户 ID 无法按该内核接受的格式解析。解法:从原始节点资料重新复制完整 ID,检查空格、截断和全角字符;不要随机生成一个新 ID 代替服务端账号。

报错:failed to build outbound handler

原因:这是出站构建失败的外层提示,单凭这一句不能确定缺少哪个参数。解法:继续读取嵌套原因,按具体协议核对服务器列表、用户参数以及传输层设置。

连接地址、TLS 的服务器名称、WebSocket 的 Host 是不同用途的字段,不能因为都像域名就互相替换。VLESS 配合 REALITY 时,还需要核对与服务端匹配的公钥、服务器名称和其他相关参数;字段名称与支持情况以实际内核版本为准。缺失参数应向配置提供方确认,而不是照抄另一个节点的值。

修改后重新启动,保留可回退的排查记录

每次只改一类问题,然后停止服务、重新启动并读取新日志。先解决语法,再解决字段与参数,最后确认监听成功。一次同时修改端口、DNS、协议和路由,即使恢复连接,也很难知道究竟是哪项修复有效。

如果内核已经启动,但 Android VPN 没有建立,再检查系统授权及其他正在使用 VPN 的应用。Android 同一用户环境通常只能维持一个活动 VPN。此类问题应按系统 VPN 状态处理,不必反复更换 UUID 或关闭证书验证。

客户端下载v2rayNG / v2rayN