适用于 v2rayNG 点击启动后立即停止、提示配置加载失败,或自定义 config 导入后无法运行的情况。先保留一次完整启动日志,再按解析、字段、监听、出站四层检查。普通订阅节点优先在编辑页面修正字段;自定义配置才需要直接检查 JSON,不必一开始就重装客户端。
先打开日志,区分启动失败与连接失败
在 v2rayNG 主界面打开左上角侧边菜单,进入「日志」。先停止服务,清空旧日志,再返回主界面选择出错节点并启动一次;随后回到「日志」,保留这次启动的完整记录。不同版本的入口位置可能调整,以界面中的「日志」项为准。不要只截最后一行“启动失败”,真正的原因往往在它上方。
-
备份原配置
记录当前节点名称和配置类型。手工维护的 JSON 先保存副本;订阅节点记下所属分组,避免后续更新覆盖临时修改。
-
记录环境
在侧边菜单「关于」记录客户端版本;如果启动日志显示 Xray 版本,也一并保存。客户端版本与内核版本不是同一个编号。
-
单次复现
停止服务后清空日志,只启动一次。若出现 Android VPN 授权提示,先确认授权,避免把授权取消当成配置错误。
-
读取原因链
从
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 的值也必须是内核支持的名称。键名大小写不能随意更改。
- 层级错误:把
streamSettings放到settings内部,不等于给当前出站设置了传输层。 - 枚举错误:WebSocket 的网络值使用
ws,不要写成自行缩写的websoket。 - 字段混用:不要把分享链接中的参数名原样当作 JSON 键名。例如链接参数与内核配置中的 TLS 字段并非一一同名。
- 版本差异:新配置字段可能要求较新的内核。升级客户端后仍需确认实际运行的内核版本,不能只看下载日期。
报错:unknown transport protocol: websoket
原因:传输协议名称不是可识别的枚举值。解法:按服务端要求修正 streamSettings.network;服务端使用 WebSocket 时应填写 ws。
还要注意:部分未知字段可能被解析器忽略,而不是直接报“字段拼错”。所以“没有语法报错”不能证明参数生效。普通节点应返回主界面,打开该节点的编辑页面,逐项对照地址、端口、协议与传输设置;不要为了修一个字段就把整个节点改成自定义 JSON。
第三类:inbound 监听冲突,核对地址与端口
日志出现 bind: address already in use,说明本地监听端点已被占用。这是设备上的端口冲突,不是节点服务器拒绝连接。先停止其他代理服务,再检查自定义配置中是否重复声明了相同监听地址、端口与传输协议。
这些数字用于说明排查方法,不代表所有版本的默认值。普通配置可在侧边菜单「设置」中查找本地 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 合法,也可能在构建出站时失败。
| 协议 | 先检查的配置路径 | 常见问题 |
|---|---|---|
| VMess | settings.vnext[].address / port / users[].id | 地址为空、端口缺失、用户 ID 格式错误 |
| VLESS | settings.vnext[].users[].id / encryption | UUID 不合法;常规配置的 encryption 应为 none,且须符合当前内核要求 |
| Trojan | settings.servers[].address / port / password | 误用 vnext 结构,或遗漏密码与服务器地址 |
报错:invalid UUID
原因:用户 ID 无法按该内核接受的格式解析。解法:从原始节点资料重新复制完整 ID,检查空格、截断和全角字符;不要随机生成一个新 ID 代替服务端账号。
报错:failed to build outbound handler
原因:这是出站构建失败的外层提示,单凭这一句不能确定缺少哪个参数。解法:继续读取嵌套原因,按具体协议核对服务器列表、用户参数以及传输层设置。
连接地址、TLS 的服务器名称、WebSocket 的 Host 是不同用途的字段,不能因为都像域名就互相替换。VLESS 配合 REALITY 时,还需要核对与服务端匹配的公钥、服务器名称和其他相关参数;字段名称与支持情况以实际内核版本为准。缺失参数应向配置提供方确认,而不是照抄另一个节点的值。
修改后重新启动,保留可回退的排查记录
每次只改一类问题,然后停止服务、重新启动并读取新日志。先解决语法,再解决字段与参数,最后确认监听成功。一次同时修改端口、DNS、协议和路由,即使恢复连接,也很难知道究竟是哪项修复有效。
- 普通订阅节点:先在订阅分组菜单执行更新,再检查导入结果。若只有一个节点失败,保留该节点日志,避免删除整个分组。
- 自定义配置:保留修改前后的副本,记录改动字段及时间。不要直接覆盖唯一可用的配置文件。
- 已知可用节点:在相同设备上做对照。如果它能启动,优先检查出错节点,而不是立刻重置所有设置。
- 仍无法启动:提供客户端与内核版本、脱敏后的完整原因链、配置来源类型及最近一次改动。仅有“无法连接”的截图不足以定位 config 错误。
如果内核已经启动,但 Android VPN 没有建立,再检查系统授权及其他正在使用 VPN 的应用。Android 同一用户环境通常只能维持一个活动 VPN。此类问题应按系统 VPN 状态处理,不必反复更换 UUID 或关闭证书验证。