平台部署 预计阅读 14 分钟

路由器与旁路由直跑 mihomo 内核部署概览:架构选型与基本步骤

对比主路由直装与旁路由两种架构的优缺点,梳理 OpenWrt 与通用 Linux 环境下内核直跑的准备工作:二进制选择、配置放置、透明代理与开机自启的关键点。

Clash Premium 旧核停止延续后,路由侧部署逐步转向仍在更新的 mihomo。与桌面客户端不同,路由器上没有图形界面替内核处理配置目录、权限、DNS 转发和进程守护;部署重点也不只是让一个代理端口开始监听,而是确保局域网流量经过明确、可回退的转发路径。

本文讨论两类常见环境:安装 OpenWrt 的主路由,以及运行 Debian、Ubuntu、ImmortalWrt 或其他 Linux 系统的旁路由。示例以 mihomo v1.19 系列配置语法为基线,使用 TUN 接管作为主线,同时说明传统防火墙转发需要额外处理的部分。实际安装前仍应根据设备架构和目标版本的发布说明复核文件名。

先选架构:主路由直装还是独立旁路由

主路由直装是把 mihomo 放在承担拨号、DHCP、NAT 和防火墙工作的同一台设备上。所有终端的默认网关本来就指向它,流量路径最短,通常不需要逐台修改网关。代价是代理配置错误可能同时影响整个家庭网络,升级内核、重启防火墙或误改 DNS 时,恢复入口也在同一台设备上。

旁路由则把代理接管交给另一台 Linux 设备。上游主路由继续完成拨号,旁路由只负责策略路由、DNS 和 mihomo。它便于停机维护,也可以只让电视、手机或测试电脑经过代理;但同网段单臂旁路由容易出现回程绕过、网关环路和 DHCP 冲突,需要把地址与转发关系规划清楚。

比较项 主路由直装 独立旁路由
默认网关调整 通常不需要,终端继续使用主路由地址 需要由 DHCP 或终端指定旁路由
故障影响 配置错误可能影响全网 可把终端网关切回主路由快速绕开
硬件余量 受路由器 CPU、闪存和内存限制 可使用 x86 小主机或性能更高的 ARM 设备
维护复杂度 流量路径直接,但需兼顾拨号和防火墙 多一台设备,需要处理转发、回程和 DHCP
适合场景 网络结构简单、设备性能充足、希望全局接管 分批接入、频繁测试、保留快速回退路径

单臂旁路由地址示例

假设主路由地址是 192.168.1.1,旁路由固定为 192.168.1.2。旁路由自身的默认网关仍填写 192.168.1.1,需要接管的终端则把网关和 DNS 指向 192.168.1.2。若通过 DHCP 批量下发,应确保同一广播域只有一个 DHCP 服务器,避免两台设备同时分配不同网关。

单臂结构建议在旁路由出口执行源地址转换,使返回流量稳定经过旁路由。若保留客户端原始地址供规则匹配,则需要在主路由增加到客户端网段的静态路由,并验证回程不会直接越过旁路由。两种方案不要混用到无法判断数据包实际路径。

检查硬件、系统与二进制架构

mihomo 是单个内核程序,但规则集、连接跟踪和 Fake-IP 映射都会占用内存。小型配置在启动后常见占用约 70 MB 至 120 MB;加载较大的域名规则集、多个 provider 和数千条连接后,占用可能达到 180 MB 至 300 MB。只有 128 MB 内存的旧路由器余量很小,512 MB 可作为更现实的起点,1 GB 以上更适合长期运行和频繁更新规则。

先通过 SSH 查询系统架构和内核信息:

uname -m
uname -a
getconf LONG_BIT
cat /etc/os-release
free -m
df -h
uname -m 常见结果 通常选择 注意事项
x86_64 linux-amd64 较老 CPU 若不支持新指令集,应选兼容级构建
aarch64 linux-arm64 常见于 64 位 ARM 路由器和开发板
armv7l linux-armv7 确认系统浮点 ABI 与发布文件说明
mipsmipsel 对应 MIPS 大端或小端构建 旧设备性能和可用内存通常更紧张

TUN 模式还依赖内核设备和相关模块。可执行 ls -l /dev/net/tun 检查设备节点,再用 ip ruleip routenft list ruleset 确认系统具备策略路由与 nftables 管理能力。OpenWrt 可在 LuCI 的「系统」→「软件包」中检查 kmod-tun,也可通过 SSH 安装与当前固件内核匹配的软件包。

建立配置目录并完成首次校验

通用 Linux 可把程序放在 /usr/local/bin/mihomo,配置目录放在 /etc/mihomo。OpenWrt 闪存空间紧张时,可将较大的规则文件放到挂载盘,例如 /mnt/data/mihomo,但开机服务必须等待该挂载点可用。以下命令假设压缩包已经在本机解压,文件名应替换为实际下载的架构版本:

sudo install -m 0755 mihomo-linux-amd64 /usr/local/bin/mihomo
sudo mkdir -p /etc/mihomo
sudo install -m 0600 config.yaml /etc/mihomo/config.yaml

/usr/local/bin/mihomo -v
sudo /usr/local/bin/mihomo -t -d /etc/mihomo

-t 用于测试配置,-d 指定工作目录。测试通过只代表 YAML 可以解析以及主要字段可加载,不代表订阅地址、DNS 上游和节点都可连通。正式启动后还要查看日志中的 provider 更新、监听端口、TUN 网卡和规则匹配结果。

订阅不等于可直接运行的完整配置

桌面客户端常把订阅导入、覆写和内核参数封装在图形界面里,路由器直跑则需要一份完整的 config.yaml。有些订阅返回完整 Clash 配置,有些只返回节点集合;后者需要通过 proxy-providers 引用,并自行补充策略组、DNS、规则和监听端口。

订阅地址通常带有账户令牌,应把配置权限限制为仅管理员可读。更新 provider 后先保留上一份可用缓存,避免远端返回空内容时立即覆盖正在工作的节点集合。可以在替换主配置前执行一次测试:

cp /etc/mihomo/config.yaml /etc/mihomo/config.yaml.bak
/usr/local/bin/mihomo -t -d /etc/mihomo

# 测试失败时恢复
cp /etc/mihomo/config.yaml.bak /etc/mihomo/config.yaml

透明代理配置:TUN、DNS 与监听边界

仅开启 mixed-port: 7890 时,局域网设备还要手动填写 HTTP 或 SOCKS 代理;它不能自动接管电视应用、游戏主机和不遵循系统代理设置的程序。路由器部署通常使用 TUN 或基于 nftables 的透明转发。TUN 配置更集中,但仍要处理内核模块、策略路由、DNS 劫持和防火墙兼容。

下面是用于说明关键字段的基础片段。节点、策略组和业务规则仍需由完整配置提供:

mixed-port: 7890
allow-lan: true
bind-address: "*"
mode: rule
log-level: info
ipv6: false

external-controller: 127.0.0.1:9090
secret: "replace-with-a-long-random-secret"

profile:
  store-selected: true
  store-fake-ip: true

tun:
  enable: true
  stack: mixed
  auto-route: true
  auto-detect-interface: true
  strict-route: true
  dns-hijack:
    - any:53
    - tcp://any:53

dns:
  enable: true
  listen: 0.0.0.0:1053
  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.1/16
  nameserver:
    - 223.5.5.5
    - 119.29.29.29

auto-detect-interface 用于识别实际出口,能减少拨号接口名称变化带来的配置修改;多 WAN、VPN 叠加或容器网桥较多时,自动判断未必符合预期,需要通过日志和 ip route get 1.1.1.1 核对出口。strict-route 可减少 DNS 或连接绕过,但也更容易暴露错误的策略路由设置。

示例把 DNS 监听设在 1053,避免直接占用可能已被 dnsmasq 使用的 53 端口。OpenWrt 上可以让 dnsmasq 把上游转发到 127.0.0.1#1053,对应 LuCI 常见路径为「网络」→「DHCP/DNS」→「常规设置」→「DNS 转发」。保存前应关闭会把请求同时发送给其他上游的并行转发设置,否则可能出现解析结果与代理规则不一致。

Fake-IP 过滤需要覆盖局域网服务

Fake-IP 能让域名规则在连接建立阶段直接参与分流,但打印机、NAS、投屏和局域网发现服务可能依赖真实地址。可以把本地域名后缀、路由管理域名和必要的连通性检测域名加入 fake-ip-filter。局域网服务还应优先使用本地 DNS 返回的私有地址,避免域名先被公共 DNS 解析。

dns:
  fake-ip-filter:
    - "*.lan"
    - "*.local"
    - "router.local"
    - "nas.home.arpa"
    - "+.home.arpa"

OpenWrt 主路由的落地步骤

  1. 备份现有配置。在 LuCI 打开「系统」→「备份与升级」,生成可恢复的配置归档;同时记录 WAN 接口名称、LAN 地址和 DHCP 设置。
  2. 检查剩余空间。通过 df -h 查看 overlay,可执行文件、Geo 数据和规则集可能合计占用数十 MB。空间不足时改用外置存储,不要把根分区填满。
  3. 安装 TUN 支持。进入「系统」→「软件包」安装与固件匹配的 kmod-tun,随后确认 /dev/net/tun 存在。
  4. 放置程序与配置。建议使用 /usr/bin/mihomo/etc/mihomo/config.yaml,权限分别设为 07550600
  5. 先前台运行。执行 /usr/bin/mihomo -d /etc/mihomo,观察 TUN、DNS 和 provider 日志,再从一台测试终端验证直连与代理规则。
  6. 加入开机服务。确认前台运行稳定后再创建 procd 服务,最后在「系统」→「启动项」查看启用状态。

OpenWrt 使用 procd 管理服务。以下脚本展示最小结构,配置目录应与实际位置一致:

#!/bin/sh /etc/rc.common

START=95
STOP=10
USE_PROCD=1

start_service() {
  procd_open_instance
  procd_set_param command /usr/bin/mihomo -d /etc/mihomo
  procd_set_param respawn 3600 5 5
  procd_set_param stdout 1
  procd_set_param stderr 1
  procd_set_param limits nofile="1048576 1048576"
  procd_close_instance
}

service_triggers() {
  procd_add_reload_trigger "mihomo"
}

将其保存为 /etc/init.d/mihomo 后执行:

chmod 0755 /etc/init.d/mihomo
/etc/init.d/mihomo enable
/etc/init.d/mihomo start
logread -e mihomo

若启动时外置磁盘尚未挂载,服务会找不到配置或规则文件。可把配置留在内部闪存,只把 provider 缓存放到外置盘;也可以调整启动顺序并在脚本中检查目录。不要依赖固定等待数秒来掩盖挂载顺序问题。

通用 Linux 旁路由的 systemd 配置

Debian、Ubuntu 和其他使用 systemd 的系统,可创建 /etc/systemd/system/mihomo.service。路由透明接管需要创建 TUN、写入路由并管理相关网络能力,最直接的初始方案是以 root 运行;部署稳定后再根据实际功能缩减权限,而不是一开始移除能力导致 TUN 创建失败。

[Unit]
Description=mihomo routing core
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
ExecStartPre=/usr/local/bin/mihomo -t -d /etc/mihomo
ExecStart=/usr/local/bin/mihomo -d /etc/mihomo
Restart=on-failure
RestartSec=5
LimitNOFILE=1048576

[Install]
WantedBy=multi-user.target
sudo systemctl daemon-reload
sudo systemctl enable --now mihomo
sudo systemctl status mihomo
sudo journalctl -u mihomo -n 100 --no-pager

旁路由还必须启用 IPv4 转发。可创建 /etc/sysctl.d/90-router-forward.conf

net.ipv4.ip_forward=1

随后执行 sudo sysctl --system。如果启用 IPv6,还要单独规划 IPv6 默认路由、DNS 与防火墙,不能只开启 net.ipv6.conf.all.forwarding=1 就假定全部流量已经进入 mihomo。尚未完成 IPv6 接管时,可先在测试网络中关闭 IPv6,避免终端通过未纳入规则的 IPv6 路径连接。

防火墙与 TUN 规则不要重复接管

已有 nftables、Docker、Tailscale 或其他 VPN 时,规则优先级可能发生冲突。启用 mihomo 后应分别执行 ip ruleip route show table allnft list ruleset,检查是否出现重复标记、默认路由回指 TUN、容器网段误入代理等情况。TUN 的自动路由已经接管目标流量时,不要再照搬一套旧版 REDIRECT 规则。

性能验证与故障定位

部署完成后,不要只用网页能否打开作为判断。至少验证局域网直连、代理连接、DNS、规则命中、重启恢复和高并发稳定性六项。测试时先固定同一个节点和同一台终端,避免节点波动与本地配置同时变化。

作为硬件量级参考,在 500 Mbps 接入线路、mihomo v1.19 系列、约 8,000 条规则的测试条件下,Intel N5105 四核小主机通过 TUN 转发常见可达到约 430 至 470 Mbps;四核 Cortex-A53、1 GB 内存设备常见约 180 至 240 Mbps。数值会受加密协议、节点距离、网卡驱动、规则规模和是否启用流量嗅探影响,不能直接视为设备标称性能。

若测速只有直连的一半,先观察单核 CPU 是否接近 100%,再检查 MTU。PPPoE、WireGuard 与 TUN 叠加时,过大的 MTU 可能造成分片或部分站点加载停顿。可从 1500149214801400 逐步测试,每次只改变一个参数,并记录吞吐、延迟与丢包结果。

更新内核与配置的交接流程

路由器上的更新应采用“新文件验证、旧文件保留、服务切换”的顺序。不要直接覆盖正在运行的二进制后立即重启。先把新版保存为 mihomo.new,执行版本检查和配置测试,再停止服务、替换文件并启动。确认运行稳定后,旧版仍可保留一个更新周期。

sudo install -m 0755 mihomo.new /usr/local/bin/mihomo.new
sudo /usr/local/bin/mihomo.new -v
sudo /usr/local/bin/mihomo.new -t -d /etc/mihomo

sudo systemctl stop mihomo
sudo mv /usr/local/bin/mihomo /usr/local/bin/mihomo.previous
sudo mv /usr/local/bin/mihomo.new /usr/local/bin/mihomo
sudo systemctl start mihomo
sudo systemctl status mihomo

配置更新也应先写入临时文件测试,再替换主文件。涉及 DNS 模式、TUN 栈、规则集格式或 provider 行为变化时,先在一台终端上验证,不要与系统固件升级安排在同一时间。旧核谢幕之后,mihomo 接棒的不只是可执行文件,配置字段和网络接管方式也会继续变化;把验证与回退做成固定步骤,比依赖某一份长期不变的脚本更可靠。

前往客户端下载页