GLaDOS Network

Mihomo Linux TUN 模式怎么开启?

更新于 2026-11-02 · glados.lat

简答:先确认 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 配置

  1. 查看二进制版本和帮助。将下面的路径替换成真实路径:
    /usr/local/bin/mihomo -v
    /usr/local/bin/mihomo -h
    如果二进制不在该路径,先运行 command -v mihomo;如果命令没有输出,就使用安装目录中的完整路径。不要仅凭教程或文件名判断版本是否支持某个字段。
  2. 确认实际配置目录。已有 systemd 服务执行:
    systemctl cat mihomo
    查看 ExecStart。官方 systemd 示例使用 -d /etc/mihomo 指定配置目录,但你的服务可能使用其他目录,应以本机 unit 为准;可参考MetaCubeX 的 Linux systemd 文档。
  3. 备份当前配置。假设实际文件是 /etc/mihomo/config.yaml:
    sudo cp -a /etc/mihomo/config.yaml "/etc/mihomo/config.yaml.bak.$(date +%Y%m%d-%H%M%S)"
  4. 先加入不带 stack 的最小配置。这样可以避免把版本相关协议栈值直接写进配置。tun 必须与 dns、proxies、proxy-groups、rules 等顶层字段同级;YAML 只使用空格缩进,不能用 Tab。
tun:
  enable: true
  auto-route: true
  auto-detect-interface: true

auto-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、实际连接五层检查

  1. 服务日志:sudo journalctl -u mihomo -o cat -n 100 --no-pager。重点找配置解析失败、创建 TUN 失败、权限不足、nftables/iptables 操作失败和 DNS 初始化失败。
  2. 查看网卡:ip -br link 或 ip link show。接口名以当前配置和版本为准,不要固定假设一定叫某个名称。可结合服务启动时间和日志中的接口信息确认是否由 Mihomo 创建。
  3. 查看策略路由:
    ip rule
    ip route show table all
    只看普通 ip route 可能漏掉自动路由使用的策略表;应观察是否出现与 TUN 相关的规则、路由表,以及默认路由是否发生异常变化。
  4. 查看防火墙规则:系统有 nftables 时运行 sudo nft list ruleset;使用 iptables 时运行 sudo iptables -S。工具不存在或系统由其他防火墙管理器接管时,以发行版实际情况为准,不要同时叠加多套规则。
  5. 测试 DNS:getent hosts example.com。如果安装了 dig 或 nslookup,再单独测试域名解析。解析失败时先判断 DNS 模块、上游 DNS、规则和网络出口,而不是马上改 stack。
  6. 测试实际连接:curl -I https://example.com。如果只有某个业务域名失败,应继续检查代理节点、代理组和 rules。想确认流量是否经过 TUN,可在复测期间使用 sudo tcpdump -ni any host 目标地址;若系统没有 tcpdump,则以日志、路由和连接结果组合判断。

看到 TUN 接口只能说明设备可能已创建,不能单独证明所有流量都已经经过 Mihomo。更可靠的判定是:日志无启动错误、策略路由存在、DNS 可解析、普通连接可复测,并且目标流量路径与预期一致。

异常分流与回滚:先恢复网络,再定位问题

现象优先检查处理方式
服务启动即退出配置文件路径、YAML 缩进、字段版本、端口占用用本机帮助信息确认校验参数,再看 journalctl
无法创建 TUNroot、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 的正确顺序

  1. 运行 mihomo -v 和 mihomo -h,记录当前版本和可用参数。
  2. 运行 systemctl cat mihomo,确认真实二进制、配置目录和服务名称。
  3. 备份实际 config.yaml,先加入不带 stack 的最小 tun 配置。
  4. 使用本机帮助信息确认配置校验方式;不要让 systemd 读取一套配置、手动校验另一套配置。
  5. 重启后依次查看 journalctl、TUN 网卡、ip rule、全路由表、DNS 和实际连接。
  6. 确认普通代理节点、代理组、规则和 DNS 已经可用后,再增加 stack、DNS 劫持、局域网排除或其他高级字段。
  7. 远程 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 目标地址,再通过排除路由或保留直连路径降低再次断开的风险。

相关阅读

参考资料

  1. Mihomo 文档:TUN 配置、协议栈、自动路由与 DNS 劫持
  2. Mihomo 文档:DNS 模块与字段层级
  3. Mihomo 文档:YAML 配置语法
  4. MetaCubeX 文档:Linux systemd 服务示例
  5. MetaCubeX Mihomo:版本与发行资源