机场梦一条订阅,接进全屋路由器

写于 2026 年 10 月 13 日

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 的图形界面更友好。

建目录、备订阅

  1. 在 NAS 上建一个目录,例如 /volume1/docker/mihomo,里面再建 config 子目录。
  2. 准备一条 Clash(Mihomo)格式的订阅链接。还没有可以从 推荐号位 里挑;下单前问客服订阅链接是不是 Clash 格式、同时在线设备数多少。全屋设备共用一个出口,流量要按全家用量估。
  3. 确认 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。

  1. 先拿一台电脑测:网络设置里改为手动,网关和 DNS 都填 192.168.1.10。
  2. 执行 nslookup www.google.com,返回 198.18 开头的地址说明 DNS 已由 mihomo 接管。
  3. 浏览器访问海外网站,能打开再继续。
  4. 稳定几天后,在主路由的 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 怎么办?
说明系统没有加载 tun 模块。群晖等 NAS 系统需要用管理员权限手动加载,并设置开机自动加载。实在加载不了,就退回到只开代理端口的用法,让设备手动填 HTTP 代理。
mihomo 容器为什么要用 host 网络?
做网关时,内核要直接在宿主机上建虚拟网卡、改路由表,还要监听 53 端口给局域网提供 DNS。bridge 网络隔了一层,这些都做不到或很别扭,host 网络省掉这些麻烦。
v2rayA 的 Docker 和 mihomo 的 Docker 有什么区别?
内核和订阅格式不同。v2rayA 用 V2Ray 或 Xray 内核,导入的是分享链接格式;mihomo 读 Clash 格式配置,规则写法更灵活。两者都能做透明代理,选哪个主要看手里的订阅是什么格式。

接着看

文中提到的机场

1

一翻云

四档都有季付和半年付,1.2TB 年付每 GB 约 ¥0.06

最少一笔
月付 ¥20150GB IEPL专线流量
按年折月
¥8.2/月年付小包
最高档流量
1.2TB极致版
优惠码1FLYYUN展开看去逛逛
7

跨界云

1800GB 档年付 ¥1248,每 GB 约 ¥0.06

最少一笔
月付 ¥20120GB/月
按年折月
¥8/月跨界年付版
最高档流量
1800GB无界 Infinity
优惠码kuajie展开看去逛逛
4

微风

200GB 三年付 ¥583,折到每月约 ¥16.2

最少一笔
月付 ¥27200GB
按年折月
¥11.4/月清风 Breeze
最高档流量
1200GB御风 Mastery

佣金交代:本站收录的机场与本站之间都有推广合作关系;读者由本站过桥页进入官网并完成付款后,本站会得到一笔佣金。各家价格、流量与优惠码照官网记录,谁排前谁排后的规则见「本站」页。