Mihomo TUN 模式无法启动怎么办?按报错定位权限与网卡
简答:先关闭 TUN 确认普通代理能否启动,再查看完整日志;根据报错分别检查权限、虚拟网卡、端口、配置和路由。若已显示 TUN listening 但断网,应转查 DNS、strict-route 与系统 VPN 冲突。
定义:Mihomo TUN 模式是通过虚拟网卡接管系统流量的工作方式,启动失败通常涉及权限、TUN 设备、路由、DNS、端口或配置校验。
先按故障阶段判断:无法启动,还是启动后断网
先不要修改一堆配置。关闭 TUN,保留同一份节点和配置,确认普通 HTTP、SOCKS 或 mixed 代理端口能否启动;普通代理正常而 TUN 失败,才继续查权限、虚拟网卡和路由。
| 现象或日志关键词 | 优先怀疑 | 按系统先做什么 | 正常判定 |
|---|---|---|---|
permission denied | 管理员、VPN 授权、Linux 能力或服务模式未启用 | Windows/macOS 完成客户端授权;Linux 先用 root 测试 | 日志不再出现权限拒绝,并开始创建 TUN |
cannot create TUN、device or resource busy | TUN 设备缺失、旧接口未释放或其他 VPN 占用 | 退出其他 VPN,检查 Windows 网卡、macOS utun 或 Linux TUN 设备 | 出现新的 TUN 接口或日志显示 listening |
address already in use、file exists | 端口、旧进程或路由规则重复 | 查监听端口、进程和路由;不要直接删除全部路由 | 仅一个 Mihomo 核心占用目标端口 |
YAML、unknown field | 缩进、字段名或核心版本不匹配 | 备份配置后执行 mihomo -t,再用最小配置复测 | 配置测试通过且无字段错误 |
| 没有明显报错但开启后断网 | DNS、strict-route、系统代理或其他 VPN 冲突 | 临时关闭复杂 DNS、strict-route 和其他网络过滤器 | TUN listening,且 DNS 与普通网页恢复 |
当前 mihomo 官方 TUN 文档列出的 stack 值包括 system、gvisor、mixed 和 mips。本文不把 mips 当作系统架构名;如果客户端内置核心较旧,应以该核心对应的文档和日志为准。
先看日志,再做最小配置验证
- 在客户端日志中搜索
TUN、permission、interface、route、DNS和YAML,保留从核心启动到报错前后的完整片段。 - 关闭 TUN,只保留普通代理端口,确认核心本身能运行。普通代理也失败时,先处理端口、订阅或配置,不要继续改 TUN。
- 命令行核心先执行
mihomo -h。如果帮助中存在-t,再执行mihomo -t -f /替换为你的配置文件路径/config.yaml;如果使用配置目录,则执行mihomo -t -d /替换为你的配置目录。 - 判定标准是命令退出成功且没有 YAML、字段或解析错误。MetaCubeX 官方面板 README也把
mihomo -t作为配置最终校验步骤。
最小复测时只保留已有端口、日志级别和 tun.enable。成功后依次恢复 stack、auto-route、dns-hijack、strict-route、IPv6 和自定义路由,每次只改一个变量。
Windows:查权限、服务模式、Wintun 与端口
- 先完整退出客户端,在任务管理器确认没有第二个 Mihomo 核心。若使用 Clash Verge Rev 等 GUI,服务模式、核心路径和管理员授权属于客户端层设置,入口会随版本变化;不要把某个 GUI 的按钮名称当成 Mihomo 内核通用字段。
- 把
7890替换为配置中的实际端口,执行Get-NetTCPConnection -LocalPort 7890 -ErrorAction SilentlyContinue。若有输出,记录OwningProcess,再执行Get-Process -Id 进程号。正常情况是目标端口由当前核心占用,或在未启动时没有监听。 - 查看虚拟网卡:执行
Get-NetAdapter;若要筛选名称,可执行Get-NetAdapter | Where-Object InterfaceDescription -like '*Wintun*'。有残留接口不等于必须删除,先退出相关 VPN、虚拟机和网络过滤器,再禁用或重新启动客户端。 - 如果出现 DLL 或 Wintun 报错,先检查杀毒软件隔离记录、核心目录写权限和重复旧 DLL。原生 Mihomo 的组件与第三方 GUI 打包方式可能不同,不要直接从不明来源下载 DLL。
- Windows 使用
system或mixed时,如果防火墙阻止核心,按 官方 TUN 文档放行对应核心程序后再复测。
macOS:确认 utun、授权与网络过滤器
- macOS 的 TUN 接口名称必须以
utun开头。终端执行ifconfig | grep -E 'utun[0-9]+',看到接口只能说明系统存在 utun,最终仍要以 Mihomo 日志中的 listening 或成功接管流量为准。 - 如果客户端提示 helper、内核授权或网络扩展未启用,按当前客户端的系统设置提示完成授权。Clash Party 的公开仓库显示其 macOS 安装流程包含特权 helper;这属于客户端打包方式,不代表所有 GUI 都使用同一路径,详见 Clash Party 官方仓库。
- 复测前退出其他 VPN、网络过滤器和虚拟机软件。防火墙阻止核心时,按 mihomo 官方 TUN 文档检查应用放行设置。
Linux:补齐 TUN 设备与权限检查
- 检查设备节点:执行
ls -l /dev/net/tun。如果不存在,执行lsmod | grep '^tun';没有输出时可尝试sudo modprobe tun,再重新检查设备节点。 - 如果日志是
permission denied,先用 root 运行一次以区分“权限问题”和“配置问题”。确认是权限后,可给二进制授予能力:sudo setcap cap_net_admin,cap_net_bind_service=+ep /替换为你的 Mihomo 二进制路径。其中CAP_NET_ADMIN涉及接口和路由管理,CAP_NET_BIND_SERVICE只在需要绑定 1024 以下端口时有用,依据 Linux capabilities(7) 手册。 - 若通过 systemd 运行,可在服务的
[Service]段加入:AmbientCapabilities=CAP_NET_ADMIN CAP_NET_BIND_SERVICE、CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE、DeviceAllow=/dev/net/tun rw。不使用低位端口时可删去CAP_NET_BIND_SERVICE。修改后执行sudo systemctl daemon-reload、sudo systemctl restart mihomo,再用sudo systemctl status mihomo --no-pager查看状态。字段含义可查 systemd.exec 官方手册。 - 检查接口、路由和规则:分别执行
ip link show、ip route、ip rule。把7890替换为实际端口,执行ss -lntp | grep 7890。输出中的 PID 应属于当前核心;若是旧进程,先正常停止服务。
DNS、strict-route、IPv6 与配置字段怎么处理
- 当前官方 TUN 配置使用的是
dns-hijack,不是本文自行推断的dns-mode: hijack。配置中应逐字对照 官方 TUN 字段说明,不要把其他内核或旧示例字段直接复制进来。 dns-hijack用于把匹配的 DNS 连接交给内部 DNS 模块。官方文档说明,Windows 和 macOS 不能自动劫持发往本地网络的 DNS;Android 开启私人 DNS 时,也不能自动劫持。Android 可在系统设置中搜索“私人 DNS”,临时改为自动或关闭后复测,具体菜单以机型为准。strict-route只在启用auto-route时强化路由规则。Windows 可能增加防 DNS 泄漏的防火墙规则,并在特定情况下影响 VirtualBox;排查基础启动时可先关闭,确认 TUN 正常后再恢复。inet6-address需要顶层配置同时启用 IPv6,且 Mihomo 启动时会检查系统接口是否存在 IPv6。若系统没有 IPv6,先移除该字段做对照测试,不要把它当作所有permission denied的统一原因。mtu主要影响极端条件下的传输速率,通常不是“无法创建 TUN”的首选修复项;先处理权限、接口、路由和配置校验。
开启后断网或关闭后残留:安全恢复顺序
- 先关闭 TUN,再退出 Mihomo 和其他 VPN;不要在核心仍运行时直接删除系统路由。
- Windows 执行
route print查看路由,只有确认某条路由由本次测试产生且不再需要时,才执行route delete 目标网段。虚拟适配器先禁用,不要盲目卸载。 - Linux 先备份:执行
ip route > ~/mihomo-route-backup.txt和ip rule > ~/mihomo-rule-backup.txt。确认归属后,再使用实际接口名执行ip link delete 接口名、ip route del ...或ip rule del ...,不要套用示例网段。 - macOS 不要手动删除全部
utun接口。先完整退出客户端并重新启动;如果反复热重载后仍失败,优先重启客户端或系统网络连接。 - 如果 TUN 已显示 listening 但所有应用断网,先关闭
strict-route、复杂 DNS 劫持、自定义路由和其他网络过滤器,再逐项恢复。判定标准是 TUN 仍能启动、普通域名可解析、至少一个普通应用能够联网。
最后的复测清单与反馈信息
复测顺序建议固定为:普通代理正常 → 只开启 tun.enable → 单独测试 stack → 测试 auto-route → 恢复 dns-hijack → 最后恢复 strict-route、IPv6 和自定义排除规则。任何一步失败,就回退上一步。
- 记录操作系统、客户端名称、内核版本和启动日志。
- Windows 提供端口进程与
Get-NetAdapter结果;macOS 提供相关utun输出;Linux 提供/dev/net/tun、ip link、ip route、ip rule和ss -lntp结果。 - 配置只提交脱敏后的 TUN 相关片段,不要公开订阅链接、密钥、节点密码或完整身份信息。
本站与 Mihomo 项目及其开发者无隶属关系。客户端界面、内核打包方式和权限提示可能不同,具体版本以对应项目公开资料为准。
常见问题
Mihomo TUN 模式无法启动,应该先改 stack 吗?
不建议一开始反复修改 stack。先关闭 TUN确认普通代理能用,再查日志、权限、接口和残留进程;之后再按照当前官方文档列出的值进行单变量测试。
Linux 出现 permission denied,必须直接用 root 长期运行吗?
不一定。可以先用 root 判断是否为权限问题,再根据需要给二进制授予 CAP_NET_ADMIN,或在 systemd 中设置 AmbientCapabilities、CapabilityBoundingSet 和 DeviceAllow。修改前应确认二进制路径可信。
Windows 找不到 Wintun 文件,需要单独下载 DLL 吗?
不能直接判断需要下载。先检查客户端目录、杀毒软件隔离记录、目录写权限和重复旧 DLL。原生核心与第三方客户端的打包方式可能不同,不要替换来源不明的文件。
TUN 已经显示 listening,但开启后所有应用都断网怎么办?
这时重点转向路由和 DNS。先关闭 strict-route、复杂 dns-hijack、自定义路由以及其他 VPN 或网络过滤器,再逐项恢复;Android 还要检查私人 DNS。
Linux 关闭 TUN 后再次提示 device or resource busy 怎么办?
先完整退出客户端和核心,不要连续热重载;再检查 /dev/net/tun、ip link、ip route 和 ip rule。确认残留接口或规则归属后再删除,并先保存备份。
相关阅读
参考资料
- mihomo 官方 TUN 配置文档
- MetaCubeX 官方面板 README
- Clash Party 官方仓库
- Linux capabilities(7) 手册(man7.org)
- systemd.exec 官方手册(freedesktop.org)