部署选择:先确定网关位置,再选择接管方式
主路由性能充足、需要统一管理全网设备时,可以直接在 OpenWrt 上运行 mihomo;需要保留现有主路由、只让部分设备接入时,旁路由更便于分批测试。初次部署建议先验证手动代理,再接入 DNS,最后启用透明代理,避免同时修改三处后无法判断故障来源。
mihomo 是由 Clash Meta 演进而来的代理内核,负责协议连接、规则匹配和 DNS 等功能。它不是路由器固件,也不自带完整的路由管理界面。OpenWrt 插件通常负责生成配置、管理进程、安装防火墙规则和提供 LuCI 页面;直接运行二进制则需要自行完成这些工作。
| 部署位置 | 接入方法 | 主要维护点 |
|---|---|---|
| OpenWrt 主路由 | 在统一出口接管 LAN 流量 | 防火墙、DNS、硬件转发加速 |
| OpenWrt 旁路由 | 指定设备把网关指向旁路由 | 回程路径、DHCP、同网段转发 |
| Linux 小主机 | 手动代理或配置为网关 | 服务管理、转发、路由和防火墙 |
| 容器中的 mihomo | 先提供显式代理,再评估透明接管 | 网络命名空间、设备映射和权限 |
硬件要求:核对架构、可用内存与存储
架构以操作系统为准
先通过 SSH 执行下面的命令。CPU 支持 64 位,不代表当前安装的固件也是 64 位;下载二进制时要匹配实际系统架构。ARM 还需要留意指令集等级,MIPS 则需要区分大小端。支持高级指令集的构建不能直接用于较旧的处理器。
uname -m
cat /etc/openwrt_release
free -m
df -h /overlay
df -h /tmp
例如,aarch64 通常对应 ARM64,x86_64 对应 64 位 x86。遇到启动后提示非法指令,应先核对构建要求;提示无法执行时,还要检查文件架构、执行权限和运行环境,而不是反复更换订阅。
容量按运行余量规划
- 256 MB 内存设备:属于紧张场景。应减少规则集和订阅规模,并在更新规则时观察剩余内存,不能只看启动后的占用。
- 512 MB 内存设备:可作为轻量家庭部署的评估起点,但还要扣除无线服务、文件共享和其他插件占用。
- 1 GB 及以上内存:更适合同时运行多项服务或使用较大的规则集,仍需根据实际连接数观察占用。
- 存储空间:建议至少预留 100 MB 可写空间作为初始规划,存放内核、配置、规则数据及更新临时文件;这不是所有配置通用的最低要求。
OpenWrt 的 /tmp 通常使用内存文件系统。把大文件放进去会消耗内存,重启后也可能消失。吞吐则受 CPU 单核性能、加密协议、网卡驱动和透明代理路径共同影响,不能根据千兆网口推断代理一定能达到千兆。
安装方式:插件托管、原生服务与容器
OpenWrt 插件:由一个管理入口负责配置
选用适配当前固件版本和防火墙体系的插件。较新的 OpenWrt 通常使用 firewall4 与 nftables,较旧环境可能仍使用 firewall3 与 iptables;安装前应核对插件文档,不要把旧版防火墙脚本直接套到新系统。
- 备份当前网络、DHCP 和防火墙配置,记录路由器 LAN 地址及 SSH 登录方式。
- 通过插件安装或选择匹配架构的 mihomo 内核,再添加支持该内核的订阅配置。
- 先关闭透明接管,只验证配置能加载、节点能连接,再逐项启用 DNS 与流量接管。
- 确认插件是否会重新生成配置。需要长期保留的修改应放在插件提供的覆写或附加配置入口。
插件的菜单名称随项目和版本变化,不能统一按桌面客户端的设置路径操作。也不要让两个代理插件同时接管 DNS 或透明转发,否则可能出现端口冲突、规则互相覆盖和重复代理。
原生二进制:自行管理进程与开机启动
下面示例假定内核已安装在 /usr/bin/mihomo,配置保存在 /etc/mihomo/config.yaml。先检查语法,再以前台方式启动查看日志:
/usr/bin/mihomo -v
/usr/bin/mihomo -t -d /etc/mihomo -f /etc/mihomo/config.yaml
/usr/bin/mihomo -d /etc/mihomo -f /etc/mihomo/config.yaml
配置检查成功不代表远端节点可达,也不代表透明转发已生效。前台验证后,OpenWrt 应交给 procd 管理服务;使用 systemd 的 Linux 则创建对应服务单元,设置工作目录和重启策略。避免只通过 SSH 后台启动,否则退出终端或重启设备后可能失去服务。
容器:显式代理比透明网关更容易落地
普通桥接网络配合端口映射,可以先提供 HTTP 或 SOCKS 代理。TUN 通常还需要访问 /dev/net/tun、网络管理能力以及适当的网络模式。容器中的路由只影响其所在网络命名空间,不会自动接管宿主机或整个 LAN。不要为了排错直接开放全部权限,应先确认流量需要在哪一层进入内核。
旁路由拓扑:网关与 DNS 分开核对
以一个具体网络为例:主路由为 192.168.50.1,旁路由固定为 192.168.50.2,两者掩码均为 255.255.255.0。旁路由自身的默认网关指向主路由。初次测试只修改一台电脑,保留其他设备的原有设置。
| 测试模式 | 终端设置 | 验证目标 |
|---|---|---|
| 手动代理 | 网关仍为 .1,应用代理指向 .2:7890 | 内核、订阅和节点连通性 |
| 透明代理 | 默认网关改为 .2,DNS 指向已配置的 LAN DNS 服务 | 转发、规则和 DNS 接管 |
| 回退原网络 | 网关与 DNS 恢复为 .1 或原 DHCP 设置 | 区分旁路由故障与上游故障 |
只修改 DNS,不能让所有连接自动经过旁路由;只修改网关,也不能保证域名解析按预期进行。透明代理还需要系统允许 IP 转发,并配置正确的防火墙与回程路径。单网口旁路由尤其要注意:直连流量可能从旁路由转到主路由,而返回流量由主路由直接送回终端,形成非对称路径。
部分方案会使用源地址转换来稳定回程,但这会改变上游看到的源地址,不能不加区分地复制一条 NAT 命令。应按照所用插件的拓扑说明配置。确认单台设备正常后,再考虑通过 DHCP 下发网关选项 3 和 DNS 选项 6;同一广播域不要随意开启第二个 DHCP 服务。
配置要点:先开放受限的局域网代理入口
下面是前述网络的基础片段,不是完整订阅。它仅说明监听地址、混合代理端口和 DNS 入口的关系。节点、策略组与规则仍需来自有效配置;使用插件时,应通过插件支持的配置方式设置,避免直接修改生成文件。
mixed-port: 7890
allow-lan: true
bind-address: 192.168.50.2
mode: rule
log-level: info
ipv6: false
dns:
enable: true
listen: 192.168.50.2:1053
ipv6: false
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
nameserver:
- 223.5.5.5
- 1.1.1.1
mixed-port: 7890同时提供 HTTP 和 SOCKS 代理入口。这个端口不是透明代理入口,终端需要显式配置代理才能使用。allow-lan: true允许局域网接入,但防火墙仍应只允许可信 LAN 访问。不要把 7890 端口映射到公网。bind-address绑定示例旁路由地址。部署时该地址必须真实存在于本机接口上。1053是示例 DNS 上游监听端口,普通终端默认向 53 端口查询,不能通过 DHCP 单独指定 1053。
在 OpenWrt 上,可以让 dnsmasq 继续服务 LAN 的 53 端口,再把查询转给 mihomo 的 1053 端口。此时必须检查转发链:dnsmasq 指向 mihomo,而 mihomo 的上游不能又回到同一个 dnsmasq,避免 DNS 循环。示例中的公共解析器仅用于展示格式,实际应按本地网络可达性与分流需求配置。
透明代理与 TUN:不要重复接管同一批流量
常见透明代理方案包括防火墙重定向、TProxy 和 TUN。重定向通常用于 TCP;TProxy 可以处理 TCP 与 UDP,但依赖相应内核能力、策略路由和防火墙规则。TUN 则通过虚拟网络接口把流量交给内核处理,它并不等于自动解决所有路由与 DNS 问题。
三处必须一起检查
- 接入:LAN 转发流量是否进入预期链或 TUN 路由。仅接管路由器自身流量,不能证明 LAN 设备也已接入。
- 排除:代理节点服务器地址、局域网地址、内核自身出站等流量是否被正确排除,防止再次进入代理形成循环。
- 返回:策略路由、防火墙标记及连接跟踪是否一致,UDP 和 TCP 是否都经过预期路径。
mihomo 的 TUN 可使用 auto-route 等选项协助建立路由;在支持的 Linux 环境中,auto-redirect 还可协助重定向。是否启用应服从插件设计。不要同时开启插件的 TProxy 接管和另一套独立 TUN 自动接管,再期待两者自动协调。
排错时可暂时关闭软件或硬件流量分载,再比较行为。某些加速路径可能绕过需要经过的处理链。若仅 QUIC 视频或游戏异常,要单独检查 UDP 转发和节点协议能力,不能用浏览器打开一个网页就认定全部流量正常。
DNS、Fake-IP 与 IPv6:保持解析和连接路径一致
Fake-IP 会为域名返回映射地址,示例使用 198.18.0.0/16。这些地址需要由 mihomo 识别并关联回域名,不能当作公网目标直接交给上游路由器。因此,终端取得 Fake-IP 后,其连接也必须进入同一套代理接管路径。
- 局域网域名:打印机、NAS 和路由器管理域名应保留本地解析。需要时结合 Fake-IP 过滤与 DNS 策略处理,不能只加入过滤后就忽略本地解析来源。
- 应用自带加密 DNS:浏览器的 DoH 可能绕过系统 DNS。传统的 53 端口接管并不能覆盖这类查询,测试时应记录浏览器是否另设了解析器。
- IPv6:终端可能通过路由通告获得另一条默认路由。只改 IPv4 网关,IPv6 连接仍可能直出。
- 恢复配置:关闭 Fake-IP 或切换 DNS 后,应清理终端与应用缓存,避免继续使用旧映射地址。
示例关闭了 mihomo 的 IPv6 使用和 AAAA 应答,但这不等于关闭整个 LAN 的 IPv6。部署前应明确选择:完整配置 IPv6 接管,或在测试网络中暂时停用 IPv6 路由通告与相关服务。不要把 IPv6 路径遗漏误判为规则随机失效。
验收与回退:按连接链路逐层定位
每次只改一个变量,并记录修改前后的设置。以下命令分别用于查看进程日志、监听端口、路由和 DNS;根据系统已安装的工具选择执行,不需要为一次排错一次性安装所有工具。
logread | grep -i mihomo
ss -lntup
ip route show
ip rule show
nslookup example.com 192.168.50.2
curl -I -x http://192.168.50.2:7890 https://example.com
nslookup 这条命令测试的是旁路由 53 端口的 LAN DNS 服务,不是示例里的 1053 监听。若没有部署前端 DNS 服务,不能据此认定 mihomo 的 DNS 模块故障。curl 则测试显式 HTTP 代理,与透明代理是两条不同的验证路径。
| 现象 | 优先排查 | 下一步 |
|---|---|---|
| 配置无法加载 | 缩进、字段类型、内核兼容性 | 运行配置检查,定位具体报错行 |
| 手动代理也无法连接 | 监听地址、LAN 防火墙、节点可达性 | 先恢复单个代理入口连通 |
| 手动代理正常,改网关后失败 | 转发开关、接管规则、回程路径 | 检查路由与防火墙计数 |
| 部分域名异常 | DNS 缓存、Fake-IP、本地域名解析 | 比较系统与应用的解析来源 |
| IPv4 正常,部分连接直出 | IPv6 默认路由与接管范围 | 分别验证 IPv4、IPv6 路径 |
完成验收后再启用开机启动,并重启一次确认配置、规则数据与防火墙能按顺序恢复。若测试失败,先把终端网关和 DNS 恢复为原主路由,再通过插件关闭接管、恢复相应防火墙配置;仅停止内核可能留下指向失效接口的规则。保留一个不经过旁路由的管理入口,可以减少配置错误导致的整网失联。