Mihomo报错怎么排查?按日志原文定位问题
简答:先看日志最后一行,再按“配置解析→端口监听→DNS与订阅→代理请求→Dashboard”顺序排查。最先备份配置,并用当前 Mihomo 构建支持的 `mihomo -t -f 配置文件` 校验;校验通过后,再检查端口、域名解析和实际代理请求。
定义:Mihomo 报错是内核、配置文件、监听端口、DNS、订阅内容、节点协议或控制面板之间某一层没有正常工作的提示,不能只凭“无法上网”判断原因。
先做这 4 步:避免把不同问题混在一起
本文是 naixinternet.shop 的第三方使用指南,不代表任何客户端或服务的官方页面。处理 Mihomo 报错时,先不要反复点击重启,也不要直接覆盖原配置。按下面顺序操作,通常能先判断问题属于“核心没有启动”,还是“核心已启动但请求失败”。
- 备份配置:复制当前 YAML 文件,并保留原文件名、运行目录和订阅来源。不要把订阅链接、节点密码、Controller secret 或完整配置公开到论坛和聊天群。
- 查看最后一条错误:优先记录内核启动日志或进程标准输出;如果只是 Dashboard 打不开,还要分别查看内核日志和面板连接日志。官方 Dashboard 文档明确区分了内核进程日志与 Clash API 日志,二者不能互相替代。参考:MetaCubeX Dashboard README
- 校验配置:在当前 Mihomo 可执行文件所在目录运行
mihomo -t -f config.yaml;如果你的构建参数不同,先运行mihomo -h或查看对应发行版说明。该测试模式用于校验配置并退出,Dashboard 的配置激活流程也会先执行类似校验。参考:配置激活与 mihomo -t - 记录可观察结果:分别记下“校验是否通过、进程是否存在、监听端口是否存在、代理请求返回什么、Dashboard 是否能连接 API”。不要把一次能打开网页当成长期稳定结论。
| 现象 | 优先判断 | 先做什么 |
|---|---|---|
| 启动后立即退出 | YAML、字段类型、路径或权限 | 备份后执行配置测试,查看最后一行错误 |
| 提示 address already in use | 端口被其他进程占用或重复启动 | 检查进程与监听端口,停止重复实例或更换端口 |
| 提示 connection refused | 目标端口没有服务监听 | 确认核心已运行、地址和端口对应正确 |
| 提示 no such host 或 DNS resolve failed | 域名解析、网络或订阅地址问题 | 区分节点域名、订阅域名和目标网站后分别测试 |
| Dashboard 无法连接 | Controller 地址、端口、secret 或跨域设置 | 先直接确认 API 地址能访问,再检查 secret 与 CORS |
YAML 配置报错:先处理缩进、Tab和字段类型
如果日志包含 yaml、parse config、cannot unmarshal、invalid 或类似“配置解析失败”的信息,问题还没有进入节点连接阶段。Mihomo 使用 YAML 配置;YAML 对大小写敏感,并使用缩进表达层级,缩进不能使用 Tab,只能使用空格。参考:Mihomo YAML 语法文档
- 用支持显示空白字符的编辑器打开配置,搜索 Tab 并替换为空格。
- 检查冒号后是否有空格,列表项是否统一使用短横线,嵌套字段是否保持同级左对齐。
- 检查引号是否成对,域名、路径、端口和布尔值是否写成当前版本支持的类型。
- 检查策略组、代理组、规则集引用的名称是否与实际定义完全一致,包括大小写和标点。
- 删除最近新增的字段或订阅片段,恢复到上一次能启动的备份,再逐段添加并重新测试。
不要只看“校验通过”。配置测试通过表示结构和字段检查没有阻止启动,但不等于节点一定可用、DNS 一定正常或所有规则都符合预期。每次只改一个字段,并在修改前保留备份,便于回滚。
address already in use:端口冲突和重复启动
这个错误表示 Mihomo 想监听的地址和端口已经被其他进程占用。常见原因包括旧进程没有退出、同一个配置被启动两次、多个配置使用同一个 mixed-port 或 external-controller 端口,也可能是容器端口映射重复。
- 先确认 Mihomo 是否已经在运行。如果已经有一个正常进程,不要再次启动第二个实例。
- 检查配置中的代理端口、DNS 监听端口和
external-controller端口,确认它们没有重复。 - Windows 可使用系统的端口和进程查看工具;macOS、Linux 可用系统自带的监听端口查看命令。命令参数会随系统版本变化,先用当前系统帮助核对,再定位占用端口的进程。
- 如果确认是残留进程,先正常停止;无法停止时再结束该进程,并重新启动单一实例。
- 如果必须换端口,同时修改客户端代理设置、Dashboard API 地址、容器映射和测试命令,避免只改一处。
修复后的可观察结果应是:旧实例已停止或只保留一个实例,目标端口重新出现监听,内核日志不再重复报告端口冲突。不要用“换成一个没被占用的数字”代替检查,因为 Dashboard、系统代理和容器映射可能仍指向旧端口。
connection refused:先确认服务是否真的在监听
connection refused 通常不是“节点速度慢”,而是请求到达了某个地址,但该地址对应的端口没有服务接受连接。它可能出现在代理测试、Dashboard 连接或订阅下载中。
- 访问本地代理端口:确认配置中的 HTTP、SOCKS 或 mixed 端口与应用设置一致。端口存在监听后,再用浏览器或命令行发起一个最小请求。
- 访问 Controller:确认 Dashboard 填写的是 Mihomo 的
external-controller地址,而不是代理端口或其他管理服务端口。官方 Dashboard 文档说明,面板会直接连接 Mihomo Clash API;不要把管理 API 与其他控制接口混用。参考:Dashboard 与 Clash API 连接说明 - 容器环境:同时检查容器内监听地址、主机端口映射和防火墙规则。只在容器内监听
127.0.0.1时,宿主机或其他容器可能无法访问。 - 回滚验证:暂时关闭 TUN、复杂规则和额外面板,只保留最小配置,确认核心能启动后再逐项恢复。
no such host、DNS resolve failed:先分清是哪一个域名
DNS 类错误至少要分成三类:订阅地址无法解析、节点服务器域名无法解析、目标网站域名无法解析。三者的解决方向不同,不能一律修改 DNS。
- 把日志中的域名记录下来,标注它属于订阅域名、节点域名还是目标站点。
- 在不经过 Mihomo 的情况下,用系统 DNS 查询该域名;再在 Mihomo 已启动后,用代理路径测试同一域名。
- 如果只有订阅域名失败,先检查链接是否过期、返回内容是否为 HTML 登录页、是否需要鉴权,以及当前网络是否能访问该地址。
- 如果只有节点域名失败,检查节点信息是否过期、域名是否拼写错误,或服务端是否要求特定协议字段。不要把节点域名失败直接归因于本机 DNS。
- 如果目标网站失败而其他域名正常,检查规则命中、代理组选择和目标站点本身的连接结果。
修改 DNS 后要重新测试并记录结果。DNS 配置字段和可用选项可能因 Mihomo 构建变化,不能从其他客户端复制整段配置后直接使用;先对照当前版本文档,再逐项启用。
订阅更新失败与 unsupported proxy type
订阅更新失败时,先把“下载失败”和“下载成功但解析失败”分开。用浏览器直接打开订阅链接看到 HTML 页面,不代表它是有效配置;同样,HTTP 请求成功也不代表返回内容包含当前 Mihomo 能识别的代理节点。
- 返回 401、403 或登录页:检查鉴权、链接有效期和访问权限,不要把网页内容直接保存为 YAML。
- 返回内容为空或格式异常:保存响应头与前几行内容,确认它是否是订阅格式,而不是错误页、JSON 提示或 HTML。
- 提示 unsupported proxy type:说明当前内核或配置解析器无法识别该节点类型,先确认节点协议名称和当前 Mihomo 文档支持范围,再升级或更换兼容的配置来源;不要仅凭第三方客户端能导入就判断 Mihomo 一定支持。
- 更新后核心启动失败:立即切回上一次可用配置,执行配置测试,再比较新旧文件中新增的字段、节点类型和策略组引用。
如果只是需要处理订阅导入,可参考本站的 Mihomo 订阅导入与节点不显示排查,不要在同一次排障中同时修改 DNS、TUN、规则和端口。
浏览器不能联网:检查系统代理、应用代理和 TUN
如果 Mihomo 核心运行正常,但浏览器或某个应用没有走代理,先不要继续修改节点。检查应用是否使用系统代理、是否单独配置了代理、是否启用了 TUN,以及测试请求实际使用的是哪个端口。
- 先用一个明确指定本地代理端口的请求测试,确认代理端口能返回结果。
- 再检查系统代理开关和 HTTP、HTTPS、SOCKS 端口是否与配置一致。
- 如果只有某个应用失败,检查该应用是否绕过系统代理、启用了自己的安全 DNS,或不支持当前代理类型。
- 如果启用 TUN 后出现全局断网,先关闭 TUN 回到系统代理模式,确认普通代理可用后,再检查 TUN 权限、虚拟网卡、路由和 DNS 劫持设置。
- 恢复时一次只打开一个功能,并在每次变更后记录 DNS 查询、代理请求和规则命中结果。
TUN 是高级配置。官方 Dashboard 文档指出,容器环境启用 TUN 需要相应的网络权限、设备和运行模式;缺少这些条件时,内核可能无法正常建立隧道。参考:TUN 运行条件说明
Dashboard 无法连接后端:检查地址、secret与跨域
Dashboard 打不开或显示连接失败,不一定代表 Mihomo 内核停止。先直接检查 external-controller 是否监听,再确认面板填写的 URL、端口和 secret 与配置完全一致。
- 确认核心进程存在,并确认
external-controller的监听地址和端口。 - 如果 Controller 只绑定在
127.0.0.1,远程设备通常无法连接;如果绑定到局域网地址,则应同时限制访问范围并设置强 secret。 - 如果面板和 API 使用不同来源,检查
external-controller-cors是否允许面板的准确来源,不要为了省事直接扩大到所有来源。 - 确认没有把 Dashboard 的控制接口地址误填到 Mihomo Clash API 地址中,也不要把 secret 放入公开截图。
- 如果仍失败,暂时使用本机访问、最小配置和单一面板测试,排除反向代理、浏览器缓存和防火墙因素。
官方配置文档说明,external-controller 是 REST API 监听地址,secret 用于 API 访问控制;绑定到所有网络接口前应配合访问限制。参考:Mihomo 外部控制与 API 配置
修复后的验收与回滚清单
排障完成后,至少完成以下四项验收:
- 配置:当前文件能够通过配置测试,且日志没有新的解析错误。
- 进程:只运行一个目标实例,代理端口和 Controller 端口处于监听状态。
- 请求:先测试本地代理端口,再测试一个实际应用;记录返回状态、失败类型和使用的代理组。
- 回滚:保留修改前配置。如果启用 TUN、DNS、规则或新订阅后再次失败,恢复上一份可用配置,不要继续叠加修改。
需要注意的是,配置测试通过不等于节点、DNS、规则和上游服务都可用。若错误只在某个节点或某个目标域名出现,应保留最小复现信息:系统、Mihomo 构建、配置中相关字段、日志最后几行、测试端口和时间;删除订阅链接、密码、secret 与完整节点信息后再寻求帮助。
常见问题
Mihomo 报 YAML 错误,最先检查什么?
先检查缩进是否使用 Tab、冒号和引号是否完整、字段类型是否正确,再用当前构建支持的 mihomo -t 校验。不要直接从其他客户端复制整段配置。
mihomo -t 通过了,为什么还是不能联网?
配置测试主要验证配置能否被解析和启动,不代表节点、DNS、规则或目标网站一定可用。下一步应检查端口监听、代理请求、DNS 查询和实际规则命中。
address already in use 怎么解决?
先确认是否已经有一个 Mihomo 实例运行,再定位占用代理端口、DNS 端口或 external-controller 端口的进程。停止重复实例或同步修改端口及所有客户端引用。
Mihomo 出现 connection refused 是节点坏了吗?
不一定。它首先表示请求目标端口没有接受连接,可能是核心未启动、地址或端口填错、容器映射错误,也可能是上游节点拒绝连接,需要先区分本地端口与节点连接。
订阅更新失败但浏览器能打开链接,为什么?
浏览器能打开只代表收到内容,不代表内容是有效订阅。检查响应是否为 HTML 登录页、鉴权错误、过期提示或不兼容格式,并将更新前配置保留为回滚版本。
Dashboard 无法连接时应改代理端口吗?
通常不应先改代理端口。先确认 Dashboard 使用的是 Mihomo 的 external-controller 地址,并核对监听地址、端口、secret 和跨域设置。