Mihomo Linux TUN 模式怎么开启?
简答:先确认 Mihomo 版本、二进制路径和 systemd 的真实配置目录,再备份 config.yaml;最小配置可以先只启用 tun、auto-route 和 auto-detect-interface,不要盲目复制版本相关的 stack 值。随后用当前二进制帮助信息确认配置校验参数,重启服务后依次检查日志、TUN 网卡、策略路由、DNS 和实际连接;远程 VPS 先保留 SSH 直连和回滚路径。
定义:Mihomo Linux TUN 模式是通过虚拟 TUN 网卡接管系统流量,再结合已有的代理节点、代理组、规则和 DNS 配置完成转发的工作方式。
先判断环境:systemd、裸机、Docker 和 NixOS 不要混用命令
本文面向准备在普通 Linux 主机上运行 Mihomo 的读者,重点讲裸机二进制和 systemd。Mihomo 官方文档将顶层 tun 配置用于系统流量接管、自动路由、DNS 劫持和按应用路由;它不会自动生成代理节点、代理组、规则或可用的 DNS 上游,因此 TUN 开启后能否访问网络,还取决于现有配置是否完整。字段含义应以Mihomo 当前 TUN 文档为准。
| 环境 | 本文适用范围 | 入口 |
|---|---|---|
| 普通 Linux 裸机 | 直接适用 | 先确认二进制、配置文件和是否有 systemd |
| 已有 mihomo.service | 直接适用 | 先运行 systemctl cat mihomo,以 ExecStart 为准 |
| 没有服务单元 | 适用 | 先前台校验和运行,再创建自己的 unit |
| Docker | 本文不展开 | 需要单独核对容器的 TUN 设备、网络命名空间和权限 |
| NixOS | 本文不展开 | 使用 NixOS 模块管理服务,不要直接复制普通 systemd 单元 |
| 远程 VPS | 谨慎适用 | 先准备控制台或第二条 SSH 恢复路径 |
资料核验日期:2026-11-02。本文是使用指南,不是 Mihomo 或相关服务的官网。
最快安全路径:确认版本、备份配置、先用最小 tun 配置
- 查看二进制版本和帮助。将下面的路径替换成真实路径:
如果二进制不在该路径,先运行/usr/local/bin/mihomo -v /usr/local/bin/mihomo -hcommand -v mihomo;如果命令没有输出,就使用安装目录中的完整路径。不要仅凭教程或文件名判断版本是否支持某个字段。 - 确认实际配置目录。已有 systemd 服务执行:
查看systemctl cat mihomoExecStart。官方 systemd 示例使用-d /etc/mihomo指定配置目录,但你的服务可能使用其他目录,应以本机 unit 为准;可参考MetaCubeX 的 Linux systemd 文档。 - 备份当前配置。假设实际文件是
/etc/mihomo/config.yaml:sudo cp -a /etc/mihomo/config.yaml "/etc/mihomo/config.yaml.bak.$(date +%Y%m%d-%H%M%S)" - 先加入不带 stack 的最小配置。这样可以避免把版本相关协议栈值直接写进配置。
tun必须与dns、proxies、proxy-groups、rules等顶层字段同级;YAML 只使用空格缩进,不能用 Tab。
tun:
enable: true
auto-route: true
auto-detect-interface: trueauto-route 用于自动设置全局路由,auto-detect-interface 用于识别出口接口。Linux 下如果要使用 auto-redirect,官方文档要求同时启用 auto-route。如果主机有多张出口网卡,先确认实际出口,再考虑显式指定接口。
stack 怎么处理:不要把版本相关值当成通用必填项
当前 Mihomo TUN 文档列出 system、gvisor、mixed 和 mips,并将 mips 写为当前文档中的默认和建议值;但这不等于所有历史二进制、衍生构建或客户端封装都能按同样方式工作。发布教程时更稳妥的做法是:最小配置先省略 stack,让当前二进制使用其默认行为;只有在当前版本文档或本机 -h、配置校验明确支持时,再显式添加。
如果你确实要指定协议栈,可先查当前文档和本机版本:
/usr/local/bin/mihomo -v
/usr/local/bin/mihomo -h不要把 mips、system 或其他值从旧教程直接复制到不同版本。需要说明的是,协议栈选择与 DNS、节点、规则不是同一层问题;TUN 网卡创建成功,并不代表代理节点和规则已经可用。
官方语法文档也展示了带 stack 的 TUN 配置示例,但该示例不能替代你对正在运行的二进制版本进行核对。配置文件的 YAML 层级和字段格式可参考Mihomo 配置语法文档。
按实际二进制校验配置:优先使用 -h 确认参数
配置校验命令必须针对实际二进制和实际配置文件,不能只运行一个不带路径的 mihomo -t。不同发行版、封装脚本或旧版本可能支持不同参数,因此先查看帮助:
/usr/local/bin/mihomo -h如果帮助信息列出 -t 和文件参数 -f,可以按实际路径执行类似命令:
sudo /usr/local/bin/mihomo -t -f /etc/mihomo/config.yaml如果帮助信息只显示通过配置目录加载文件,则应使用与服务 ExecStart 一致的形式:
sudo /usr/local/bin/mihomo -t -d /etc/mihomo上面两种写法不要同时盲目尝试;以本机 mihomo -h 的参数说明和返回结果为准。校验成功后再重启服务:
sudo systemctl restart mihomo
systemctl --no-pager --full status mihomo
sudo journalctl -u mihomo -o cat -n 100 --no-pager如果服务启动失败,优先看配置路径、YAML 缩进、字段支持和端口冲突,不要先修改路由或防火墙。
没有 mihomo.service:先前台运行,再创建低复杂度 unit
如果 systemctl cat mihomo 提示找不到服务,说明服务尚未创建或名称不同。先确认二进制能够执行、配置文件真实存在,并按上一节使用本机帮助信息校验。前台运行时使用与校验相同的配置参数,确认没有权限和启动错误后再创建 unit。
下面是一个尽量简单的 root 服务基线。它没有复制一组过宽的 capability,也没有加入 CAP_SYS_TIME、CAP_SYS_PTRACE、CAP_DAC_OVERRIDE 等与基本 TUN 启动无关的权限。root 运行只是为了先排除文件、TUN 设备和路由权限问题;服务正常后,再结合发行版安全策略改成专用用户并逐项收紧。
sudo tee /etc/systemd/system/mihomo.service >/dev/null <<'EOF'
[Unit]
Description=mihomo
After=network.target NetworkManager.service systemd-networkd.service
[Service]
Type=simple
ExecStart=/usr/local/bin/mihomo -d /etc/mihomo
Restart=on-failure
RestartSec=3
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now mihomo
systemctl --no-pager --full status mihomo如果该 unit 启动失败,再查看 journalctl -u mihomo -o cat -e。只有在日志明确显示缺少网络管理能力时,才考虑服务用户、CAP_NET_ADMIN、CAP_NET_RAW、/dev/net/tun、nftables/iptables 或 SELinux/AppArmor 限制。不要为了绕过错误直接扩大 capability 集合。官方服务示例可作为结构参考,但其中的权限集合不应自动视为最小权限方案。
DNS 配置要分层:tun.dns-hijack 不等于顶层 DNS 模块
DNS 是最容易写错层级的部分。dns-mode 和 dns-hijack 属于 tun 下面的字段;enable、enhanced-mode、nameserver 等属于顶层 dns 模块。官方 TUN 文档说明,hijack 会在 native 基础上拦截其他接口发往 53 端口的请求,Linux 使用时需要 auto-redirect;DNS 模块本身仍需单独启用和配置。
tun:
enable: true
auto-route: true
auto-redirect: true
auto-detect-interface: true
dns-mode: hijack
dns-hijack:
- any:53
- tcp://any:53
dns:
enable: true
enhanced-mode: redir-host
nameserver:
- 你的现有 DNS 地址示例中的 DNS 地址必须替换为你已有且确认可访问的解析服务器,不要把占位内容直接保存。若你的现有配置已经包含 dns、节点和规则,应合并字段,不要重复创建两个顶层 dns。完整 DNS 字段和层级可查看Mihomo DNS 配置文档。如果只是先验证 TUN 是否创建,建议暂时不加 DNS 劫持,先完成网卡、路由和日志验证。
开启后怎么验证:服务、网卡、策略路由、DNS、实际连接五层检查
- 服务日志:
sudo journalctl -u mihomo -o cat -n 100 --no-pager。重点找配置解析失败、创建 TUN 失败、权限不足、nftables/iptables 操作失败和 DNS 初始化失败。 - 查看网卡:
ip -br link或ip link show。接口名以当前配置和版本为准,不要固定假设一定叫某个名称。可结合服务启动时间和日志中的接口信息确认是否由 Mihomo 创建。 - 查看策略路由:
只看普通ip rule ip route show table allip route可能漏掉自动路由使用的策略表;应观察是否出现与 TUN 相关的规则、路由表,以及默认路由是否发生异常变化。 - 查看防火墙规则:系统有 nftables 时运行
sudo nft list ruleset;使用 iptables 时运行sudo iptables -S。工具不存在或系统由其他防火墙管理器接管时,以发行版实际情况为准,不要同时叠加多套规则。 - 测试 DNS:
getent hosts example.com。如果安装了dig或nslookup,再单独测试域名解析。解析失败时先判断 DNS 模块、上游 DNS、规则和网络出口,而不是马上改 stack。 - 测试实际连接:
curl -I https://example.com。如果只有某个业务域名失败,应继续检查代理节点、代理组和 rules。想确认流量是否经过 TUN,可在复测期间使用sudo tcpdump -ni any host 目标地址;若系统没有 tcpdump,则以日志、路由和连接结果组合判断。
看到 TUN 接口只能说明设备可能已创建,不能单独证明所有流量都已经经过 Mihomo。更可靠的判定是:日志无启动错误、策略路由存在、DNS 可解析、普通连接可复测,并且目标流量路径与预期一致。
异常分流与回滚:先恢复网络,再定位问题
| 现象 | 优先检查 | 处理方式 |
|---|---|---|
| 服务启动即退出 | 配置文件路径、YAML 缩进、字段版本、端口占用 | 用本机帮助信息确认校验参数,再看 journalctl |
| 无法创建 TUN | root、CAP_NET_ADMIN、/dev/net/tun、服务安全策略 | 先用 root 基线验证,再按日志逐项收紧权限 |
| 有 TUN 但不能上网 | 节点、代理组、rules、DNS 和策略路由 | 先确认普通代理配置自身可用,再验证 TUN |
| DNS 失败 | 顶层 dns.enable、nameserver、tun.dns-hijack、auto-redirect | 暂时关闭 DNS 劫持,确认 DNS 模块独立可用后再恢复 |
| 远程 SSH 断开 | auto-route、SSH 目标、排除路由和防火墙 | 通过云控制台或第二会话停止服务并恢复备份 |
| 局域网无法访问 | route-exclude-address、策略路由、防火墙 | 按实际局域网网段配置排除,并用 ip route show table all 复核 |
回滚时先停止服务,再选择最新备份,不要手写不存在的时间戳:
sudo systemctl stop mihomo
backup=$(ls -t /etc/mihomo/config.yaml.bak.* 2>/dev/null | head -n1)
if [ -n "$backup" ]; then
sudo cp -a "$backup" /etc/mihomo/config.yaml
sudo systemctl start mihomo
sudo systemctl --no-pager --full status mihomo
else
echo "未找到配置备份,请先检查配置文件"
fi如果你的配置文件不在 /etc/mihomo/config.yaml,必须替换备份和恢复路径。恢复后再次检查 ip rule、ip route show table all、防火墙规则和 DNS,确认没有遗留的路由或重定向规则。
最终速查:Linux 开启 Mihomo TUN 的正确顺序
- 运行
mihomo -v和mihomo -h,记录当前版本和可用参数。 - 运行
systemctl cat mihomo,确认真实二进制、配置目录和服务名称。 - 备份实际
config.yaml,先加入不带stack的最小tun配置。 - 使用本机帮助信息确认配置校验方式;不要让 systemd 读取一套配置、手动校验另一套配置。
- 重启后依次查看 journalctl、TUN 网卡、
ip rule、全路由表、DNS 和实际连接。 - 确认普通代理节点、代理组、规则和 DNS 已经可用后,再增加
stack、DNS 劫持、局域网排除或其他高级字段。 - 远程 VPS 保留控制台或第二 SSH 路径,出现断网先回滚,再分析策略路由和防火墙。
如果开启 TUN 后仍有延迟、丢包、DNS 或 MTU 问题,建议保留版本信息、Mihomo 日志、ip rule、ip route show table all 和复测时间,再进行下一轮网络定位。
常见问题
Mihomo Linux TUN 模式一定要 root 吗?
不能简单回答“一定”。创建 TUN、设置路由和操作防火墙通常需要网络管理能力;实际权限取决于运行用户、CAP_NET_ADMIN、CAP_NET_RAW、/dev/net/tun、容器限制以及 SELinux 或 AppArmor。遇到权限错误时,先看 journalctl,再按报错处理,不要直接复制一组过宽的 capability。
为什么只加入 tun.enable 还是不能上网?
TUN 只负责接管流量,不会自动生成代理节点、代理组、rules 或 DNS 上游。先确认现有配置能加载,节点和代理组可用,规则能够命中,DNS 模块也有有效上游;然后再用 ip link、ip rule、日志和 curl 分层验证。
Mihomo 的 stack 应该写什么?
当前 Mihomo 文档列出 system、gvisor、mixed、mips,并将 mips 写为当前文档中的默认和建议值,但协议栈支持和行为仍应结合正在运行的二进制核对。本文的最小配置故意省略 stack;需要显式指定时,先查当前文档和 mihomo -h,不要从旧教程直接复制。
tun.dns-hijack 和 dns.enhanced-mode 是一回事吗?
不是。dns-hijack 属于 tun,用于把匹配的 DNS 请求导入内部 DNS 模块;enhanced-mode 属于顶层 dns,用于选择 fake-ip 或 redir-host 等 DNS 处理模式。两者都配置时仍需要 dns.enable、有效 nameserver,并满足 Linux 下 auto-redirect 等条件。
systemd 找不到 mihomo.service 怎么办?
先运行 command -v mihomo、mihomo -v 和 mihomo -h,确认二进制路径与参数;再确认配置文件位置。若没有服务单元,可先用实际二进制前台运行,确认配置和权限没有错误后,再创建 /etc/systemd/system/mihomo.service,并让 ExecStart 与手动校验使用同一套路径。
远程 VPS 开启 TUN 后 SSH 断了怎么恢复?
优先使用云控制台、第二个 SSH 会话或带外管理进入系统,停止 Mihomo 并恢复最近的配置备份。恢复后检查 ip rule、ip route show table all、防火墙规则和 SSH 目标地址,再通过排除路由或保留直连路径降低再次断开的风险。