mihomo Docker 做全屋网关:compose、配置文件与设备设置
5 步用 mihomo Docker 镜像在 NAS 或软路由上搭全屋网关:建目录、写 compose、写带 TUN 和 DNS 的 config.yaml、启动看日志、把设备网关指向 NAS;附与 v2rayA Docker 的区别和 5 种报错。
不想换路由器,家里又有一台 24 小时开机的 NAS,可以让 NAS 用容器跑 mihomo 内核,顺带给全屋当代理网关。主路由一个设置都不用动,出了问题把设备网关改回去就恢复原样。
这篇只讲 NAS 或软路由上的 Docker 做法:容器用 host 网络,开 TUN,对局域网提供网关和 DNS。路由器上装插件的做法见 OpenClash 配置教程。
判断这条路适不适合
| 对比项 | NAS 上 Docker 跑 mihomo | 路由器上装 OpenClash |
|---|---|---|
| 要不要动路由器 | 不用 | 要刷 OpenWrt 系固件 |
| 配置方式 | 手写 YAML | 网页界面点选 |
| 对硬件的要求 | NAS 支持 Docker,内核带 tun 模块 | 路由器有足够闪存和内存 |
| NAS 关机的影响 | 指向它的设备断网 | 不相关 |
能接受手写配置文件、NAS 又基本不关机,Docker 这条路很省心。反过来,不想碰 YAML 的话,iStoreOS 装 OpenClash 的图形界面更友好。
建目录、备订阅
- 在 NAS 上建一个目录,例如
/volume1/docker/mihomo,里面再建config子目录。 - 准备一条 Clash(Mihomo)格式的订阅链接。还没有可以从 推荐号位 里挑;下单前问客服订阅链接是不是 Clash 格式、同时在线设备数多少。全屋设备共用一个出口,流量要按全家用量估。
- 确认 NAS 能 SSH 登录,并且有 Docker Compose(多数 NAS 的容器管理套件自带,也可以在网页上建「项目」粘贴 compose 内容)。
写 compose 文件
在 mihomo 目录下新建 compose.yaml:
services:
mihomo:
image: metacubex/mihomo:latest
container_name: mihomo
restart: unless-stopped
network_mode: host
cap_add:
- NET_ADMIN
devices:
- /dev/net/tun
volumes:
- ./config:/root/.config/mihomo
三处关键设置:network_mode: host 让容器直接用宿主机网络;NET_ADMIN 允许它改路由和防火墙;/dev/net/tun 把虚拟网卡设备交给容器。少了后两项,TUN 起不来;不用 host 网络,TUN 只建在容器自己的网络里,替局域网转发不了。
镜像里自带一份 GeoIP 等规则数据,放在 /root/.config/mihomo 下。把宿主机目录挂到这个位置后,自带的文件会被盖住,内核启动时要重新下载。
写 config.yaml
在 config 目录下新建 config.yaml。下面是一份能跑通的骨架,订阅地址和 secret 换成自己的:
mixed-port: 7890
allow-lan: true
mode: rule
log-level: info
external-controller: 0.0.0.0:9090
secret: "换成一串自己设的密码"
tun:
enable: true
stack: mixed
auto-route: true
auto-redirect: true
auto-detect-interface: true
dns-hijack:
- any:53
dns:
enable: true
listen: 0.0.0.0:53
enhanced-mode: fake-ip
fake-ip-range: 198.18.0.1/16
fake-ip-filter:
- "*.lan"
- "*.local"
nameserver:
- 223.5.5.5
- 119.29.29.29
proxy-providers:
sub:
type: http
url: "这里贴订阅链接"
interval: 3600
path: ./providers/sub.yaml
health-check:
enable: true
url: https://www.gstatic.com/generate_204
interval: 300
proxy-groups:
- name: PROXY
type: select
use:
- sub
rules:
- IP-CIDR,192.168.0.0/16,DIRECT,no-resolve
- IP-CIDR,10.0.0.0/8,DIRECT,no-resolve
- GEOIP,CN,DIRECT
- MATCH,PROXY
逐段说明:
tun一段让内核接管经过 NAS 的流量。auto-redirect只在 Linux 上有效,要和auto-route一起开,它会自动写防火墙规则转发 TCP 连接。dns一段让 NAS 在 53 端口给局域网提供解析,Fake-IP 模式下返回 198.18 开头的地址。proxy-providers只从订阅里取节点,规则由这份文件自己管,订阅更新时不会覆盖规则。rules让局域网地址和国内 IP 直连,其余走 PROXY 组。GEOIP规则依赖 IP 数据库(默认读geoip.metadb),挂载目录里没有时,内核启动会尝试下载。
打开转发
NAS 要替别的设备转发流量,宿主机的 IP 转发必须是开着的。先查:
sysctl net.ipv4.ip_forward
输出是 1 就不用管;是 0 的话执行 sysctl -w net.ipv4.ip_forward=1,并写进系统的 sysctl 配置文件,免得重启后失效。装了 Docker 的机器通常已经是 1,但有的 NAS 系统会在更新后重置,出问题时先看这一项。
还要确认 tun 模块已加载:
ls -l /dev/net/tun
能列出这个文件就可以继续。提示不存在,先看最后一节的处理办法。
启动并看日志
cd /volume1/docker/mihomo
docker compose up -d
docker logs -f mihomo
日志里依次能看到加载配置、启动 TUN、DNS 开始监听、订阅拉取成功等信息。出现 error 字样就按最后一节对照处理。
让设备走 NAS
假设 NAS 地址是 192.168.1.10。
- 先拿一台电脑测:网络设置里改为手动,网关和 DNS 都填 192.168.1.10。
- 执行
nslookup www.google.com,返回 198.18 开头的地址说明 DNS 已由 mihomo 接管。 - 浏览器访问海外网站,能打开再继续。
- 稳定几天后,在主路由的 DHCP 设置里把下发的网关和 DNS 改成 NAS 地址,全家设备自动生效。
不想动网关也有退路:设备的 Wi-Fi 设置里填 HTTP 代理 192.168.1.10,端口 7890。这样只有支持系统代理的 App 会走代理,但完全不用 TUN,对 NAS 内核没有要求。
接控制面板
配置里开了 external-controller,可以用 metacubexd、zashboard 这类网页面板连 http://192.168.1.10:9090,填上配置里的 secret,就能切换节点、看实时连接。面板项目也提供容器部署方式,和 mihomo 放在同一个 compose 里管理即可。
更新镜像和订阅
镜像更新用两条命令,配置文件在挂载目录里,不受影响:
docker compose pull
docker compose up -d
订阅按 interval 设定的秒数自动拉取,上面的写法是每小时一次。换机场时只改 url 一行,重启容器即可,规则和 DNS 设置都不用动。更新前把 config 目录复制一份,改坏了能直接换回来。
和 v2rayA 的 Docker 比一比
搜「v2raya docker」的人,目的往往一样:在 NAS 上跑个容器给全家用。两者的差别如下:
| 对比项 | mihomo | v2rayA |
|---|---|---|
| 内核 | mihomo | V2Ray 或 Xray |
| 订阅格式 | Clash(Mihomo)YAML | 分享链接格式 |
| 配置方式 | 写 YAML 文件 | 网页界面 |
| 规则写法 | 灵活,可按域名、IP、进程等分流 | 界面里选,细节要写路由规则 |
手里是 Clash 格式订阅,用 mihomo 不用转格式;习惯网页点选、订阅是分享链接,v2rayA 更合适。两个容器不要同时开透明代理,会抢同一套路由和 53 端口。
处理五种常见报错
| 报错或现象 | 原因 | 处理 |
|---|---|---|
| 53 端口被占用 | 宿主机已有 DNS 服务在监听 | 停掉占用 53 端口的服务,或换一台没有冲突的机器 |
找不到 /dev/net/tun |
NAS 系统没加载 tun 模块 | 用管理员权限加载 tun 模块并设为开机加载 |
| GeoIP 数据库下载失败 | 首次启动时还连不上外网 | 在电脑上从 GitHub 的 MetaCubeX/meta-rules-dat 发布页下载 geoip.metadb,放进 config 目录后重启容器 |
| 设备走 NAS 后部分流量不通 | Docker 启动时若自己打开了 IP 转发,会把转发的默认策略设成丢弃 | 检查 iptables -L FORWARD 的默认策略;在 /etc/docker/daemon.json 加 "ip-forward-no-drop": true 后重启 Docker,或按需放行局域网转发 |
| 改了配置不生效 | 容器没重启 | docker restart mihomo,或在面板里重载配置 |
最后一条提醒:NAS 一旦休眠或重启,指向它的设备就会断网。关掉 NAS 的系统休眠,系统更新安排在家里不用网的时段,或者只让需要分流的设备指向它。
问与答
群晖上用 Docker 跑 mihomo 提示找不到 /dev/net/tun 怎么办?
mihomo 容器为什么要用 host 网络?
v2rayA 的 Docker 和 mihomo 的 Docker 有什么区别?
接着看
文中提到的机场
佣金交代:本站收录的机场与本站之间都有推广合作关系;读者由本站过桥页进入官网并完成付款后,本站会得到一笔佣金。各家价格、流量与优惠码照官网记录,谁排前谁排后的规则见「本站」页。