配图:祁连县卓尔山
一、背景
我的旁路由是小米AX3000T,刷了OpenWrt固件,跑着OpenClash(基于mihomo内核)。这套方案用了大半年,整体体验还行,但有一个致命问题:AX3000T的内存只有233MB。
OpenClash运行时,mihomo进程本身就要吃掉几十MB内存,再加上OpenWrt系统本身的开销,剩余可用内存经常只剩十几MB。一旦订阅节点数量多一些、规则复杂一些,就会触发OOM Killer,mihomo被杀掉,整个代理直接断掉。最烦的是网络不会自动恢复,得手动进后台重启OpenClash服务。有时候半夜断了都不知道,第二天早上才发现上不了外网。决定把mihomo从路由器上挪走。
二、方案选择
手边刚好有一台闲置的树莓派4B(8GB内存版本),内存直接碾压。方案:树莓派上用Docker跑mihomo,路由器不再承担代理任务。
三、备份AX3000T的配置
迁移第一步,先把路由器上的配置都备份下来:
# 备份OpenWrt基础配置
scp -r root@你的路由器IP:/etc/config/ ./openwrt-config/
# 备份OpenClash的mihomo主配置
scp root@你的路由器IP:/etc/openclash/config/config_real.yaml ./mihomo-config/
# 备份规则集文件
scp -r root@你的路由器IP:/etc/openclash/rule_provider/ ./mihomo-config/rule_provider/
# 备份自定义规则
scp root@你的路由器IP:/etc/openclash/custom_rules/ ./mihomo-config/custom_rules/
四、配置迁移
从OpenClash导出的config_real.yaml不能直接用,需要做一些调整:
1. 删掉OpenClash特有的experimental字段(OpenClash自己加的,mihomo不认识)
2. 把mixed-port、port等端口改一下,避免和树莓派上其他服务冲突
3. 设置 allow-lan: true(因为其他设备要通过局域网连过来用)
4. external-controller改成0.0.0.0:9090,方便远程管理
把整理好的配置和rule_provider文件放到树莓派的某个目录下,比如 /home/pi/mihomo/
五、踩坑记录:ImmortalWrt Docker方案
一开始我想到的方案是:在树莓派上用Docker跑一个ImmortalWrt(OpenWrt的一个分支),然后在ImmortalWrt里面跑OpenClash。这样配置迁移最方便,和路由器上的体验一模一样。
听起来很美好,实际是灾难。
启动ImmortalWrt容器后,它的br-lan桥接会直接抢占树莓派的eth0网卡!更致命的是,ImmortalWrt默认的IP地址是192.168.x.1(你的路由器IP),而我树莓派的IP是你的树莓派IP,两个IP在同一网段冲突了。
结果:树莓派直接失联,整个局域网路由表都乱了,不仅树莓派访问不了,连其他设备的网络也断了。最后只能物理断电重启树莓派,进恢复模式把那个Docker容器删掉。
血泪教训:千万别在树莓派上用Docker跑ImmortalWrt来做代理!br-lan桥接会抢网卡,IP冲突会导致整个网络瘫痪!
六、正确方案:直接跑mihomo Docker
放弃ImmortalWrt方案后,回归最简单的方式——直接用Docker跑mihomo:
docker run -d --name mihomo --network host --cap-add NET_ADMIN -v /home/pi/mihomo/config.yaml:/root/.config/mihomo/config.yaml -v /home/pi/mihomo/rule_provider:/root/.config/mihomo/rule_provider --restart unless-stopped metacubex/mihomo:latest
就这一个命令,直接启动mihomo,跑在树莓派的9090端口上。其他需要代理的设备把主路由和dns指向树莓派的IP就行。
七、效果对比
| 对比项 | AX3000T + OpenClash | 树莓派4B + Docker mihomo |
|---|---|---|
| 可用内存 | ~233MB(经常不够用) | 8GB(完全富余) |
| OOM风险 | 经常触发,导致断网 | 基本不存在 |
| 配置管理 | 需要进OpenWrt后台 | 直接编辑yaml + docker restart |
| 固件更新风险 | 刷机可能变砖 | 和路由器完全独立 |
| 网络中断风险 | OOM杀进程导致断网 | 几乎不会 |
| 额外硬件成本 | 无 | 需要一台树莓派 |
| 额外功耗 | 无 | 约5W(树莓派4B待机) |
| 维护复杂度 | 中等 | 低(Docker容器管理很方便) |
八、总结
怎么判断是不是 OOM?SSH 到路由器运行 dmesg | grep -i oom,如果看到大量 “Out of memory: Killed process” 的日志,那就是了。AX3000T 只有 233MB 内存,跑 OpenClash 的 clash_meta 进程经常吃掉 100MB+,再加上系统本身,内存基本不够用。
核心教训就一句话:不要用ImmortalWrt的Docker容器来跑代理,直接用mihomo的Docker镜像就行。ImmortalWrt的br-lan桥接会抢占宿主机的网卡,造成IP冲突,直接把整个网络搞崩。
树莓派4B + Docker + mihomo这个组合,解决了路由器内存不足的根本问题,而且管理起来比OpenClash方便太多。配置文件就是一个yaml,改完docker restart一下就生效,不用在OpenWrt那个复杂的Web界面里点来点去。
如果你的路由器也经常因为内存不足导致代理崩溃,强烈推荐试试这个方案!
参考资料:
发布于2026/08/23。
