群晖 NAS 部署 Mihomo 实现轻量级科学上网教程

博主此前在群晖 NAS 上部署了 OpenWrt 虚拟机,利用其中的 Passwall 搭建旁路由网关。这种方案的愿景很美好:全屋设备只需指向该网关,即可实现无感知的“科学上网”。

然而在长期使用中,我发现虚拟机占用的系统资源相当可观(约占 1/3 内存),且旁路由模式的实际网络体验往往不及各设备独立的代理客户端。于是,我决定卸载 OpenWrt。

考虑到群晖自身仍有刚性的网络代理需求(例如 Docker 镜像拉取Jellyfin 媒体刮削),我们需要一个资源占用极低、配置灵活的替代方案。Mihomo(原 Clash.Meta)便是目前的不二之选。

构建核心 (Mihomo)

准备配置文件

这是最关键的一步。

  1. 获取订阅:去你的机场后台,复制订阅链接。

  2. 转换格式:使用在线转换工具(如 ACL4SSR),客户端选择 Clash.MetaMihomo,如果都没有就选择 Clash 一般也能兼容。

  3. 下载文件:生成并下载文件,重命名为 config.yaml

  4. 修改必要参数: 用文本编辑器打开 config.yaml,搜索 external-controller,确保它是允许任意 IP 连接的:

    external-controller: '0.0.0.0:9090'
    # 如果有 secret (密码),请记下来,后面设置面板要用
  5. 上传文件:在群晖 File Station 中,在 docker 文件夹下新建文件夹 mihomo。将准备好的 config.yaml 拖进去。最终路径应该是 /volume1/docker/mihomo/config.yaml

部署核心容器

推荐使用群晖自带的 Container Manager (DSM 7.2+) 或 Docker 套件

  1. 打开 Container Manager -> 项目 -> 新建

  2. 路径:选择刚才建立的 /docker/mihomo 文件夹。

  3. 来源:创建 docker-compose.yml,然后将下方代码完整复制进去:

    version: '3'
    services:
      mihomo:
        image: ghcr.io/metacubex/mihomo:latest # 使用 GitHub 官方镜像源以方便拉取
        container_name: mihomo
        restart: always
        network_mode: "host" # 使用 Host 模式,直接接管 NAS 网络
        volumes:
          - ./config.yaml:/root/.config/mihomo/config.yaml
        environment:
          - TZ=Asia/Shanghai
  4. 构建并启动。点击 下一步 -> 完成。等待几秒钟,状态显示为“运行中”即表示核心成功启动。

部署面板 (Metacubexd)

现在 Mihomo 核心已经在后台跑起来了,但它没有像 PC 端那样的原生可视化面板,所以我们还需部署一个面板来进行节点切换和规则管理。

拉取镜像并启动容器

  1. 打开 Container Manager。

  2. 镜像仓库 搜索 metacubexd并下载(通常选择 metacubex/metacubexd)。

  3. 选中下载好的镜像点击 运行

  4. 网络设置:选择 bridge (默认即可,不要选 Host)。

  5. 端口设置:本地端口填写 7888 (或者其他未被占用的端口)。容器端口填写 80 (这是镜像写死的,不要动)。最终映射关系为7888 -> 80。保留此条即可,其余的映射可以删除。

  6. 完成向导并启动容器。

连接面板与调整配置

  1. 浏览器访问前端地址:http://你NAS的局域网IP:7888(例如http://192.168.31.200:7888

  2. 添加后端地址: http://你NAS的局域网IP:9090。如果在 config.yaml 中设置了密钥,请填写,否则留空。

  3. 点击添加,看到流量统计页面,说明我们的前后端都运行正常。

  4. 点击上方代理标签页,选择节点,然后再设置标签页选择规则模式,配置便告完成。

接管 NAS 网络

现在车(Mihomo)跑起来了,我们要让乘客(群晖系统)上车。

  1. 打开群晖 控制面板 -> 网络 -> 常规

  2. 勾选 通过代理服务器连接

  3. 填写:

    • 地址: 127.0.0.1 (代表 NAS 本机)

    • 端口: 7890 (Mihomo 默认混合端口)

  4. 点击 应用

验证方法:打开 Container Manager 套件的“镜像仓库”标签页,尝试搜索 googlemysql。如果能秒出结果,说明 NAS 已经成功通过代理连接网络。

特殊故障修复 (Cloudflare Tunnel)

如果你像我一样在 NAS 上运行着 Cloudflared Tunnel,代理接管流量后可能会出现出现 Error 1033No route to host错误。这意味着 Cloudflared 的流量也被代理到节点去了,导致它和 CDN握手失败,所以我们需要添加强制直连的规则。

/docker/mihomo/config.yaml 中,找到 rules: 区域,在规则列表最顶部添加:

rules:
  - DOMAIN-SUFFIX,argotunnel.com,DIRECT  # 必须是英文 DIRECT
  - DOMAIN-SUFFIX,cftunnel.com,DIRECT
  # ... 其他规则

YAML 格式对缩进非常敏感,请确保新规则与下方原有规则对齐。修改保存后,需重启 Mihomo 容器生效。