编辑
2026-03-15
技术漫谈
00
请注意,本文编写于 46 天前,最后修改于 45 天前,其中某些信息可能已经过时。

目录

阶段一:环境准备与目录结构
阶段二:核心配置 config.yaml
阶段三:Docker Compose 编排
阶段四:启动与排错

Gemini_Generated_Image_zes25tzes25tzes2.png

Mihomo(原 Clash Meta)搭配官方 Web 面板(MetacubeXD),不仅能实现极其精细的分流策略,其强大的 TUN 模式更能让整台 NAS(包括里面的其他 Docker 容器)直接享受代理网络,告别镜像拉取缓慢的烦恼。

阶段一:环境准备与目录结构

在开始写配置之前,我们需要先搭建好骨架,并提前下载好 Mihomo 运行必需的地理位置数据库。如果不提前准备这些数据文件,容器启动时可能会因为无法连网下载而无限重启。

1. 创建目录结构 通过 SSH 登录你的 NAS,创建目录

2. 下载 Geo 数据文件data 目录中,使用 wget 手动下载以下三个核心文件(如果你的网络目前拉取困难,可以先在电脑上通过代理下载好,再上传到这个文件夹):

  • geoip.dat
  • geosite.dat
  • country.mmdb (提示:可以前往 GitHub 的 MetaCubeX/meta-rules-dat 仓库获取最新版本)

相关命令:

js
# 新建文件夹 mihomo 和 子目录 mkdir -p /volume1/docker/mihomo/{config,data} # 进入 data 目录 cd /volume1/docker/mihomo/data # 最新的 Geo 数据文件 wget -O geoip.dat https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip.dat wget -O geosite.dat https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geosite.dat wget -O country.mmdb https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/country-lite.mmdb # 如果下载不动,可以加个代理 wget -O geoip.dat https://gh-proxy.com/https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip.dat wget -O geosite.dat https://gh-proxy.com/https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geosite.dat wget -O country.mmdb https://gh-proxy.com/https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/country-lite.mmdb

阶段二:核心配置 config.yaml

千万不要手动把节点信息一条条复制进配置文件里!利用 proxy-providers 订阅功能,让 Mihomo 每天自动拉取、更新节点。

data 目录下创建 config.yaml 文件,填入以下内容。注意:只需将你的“Clash 订阅链接”替换进去即可,不要随意修改缩进。

(单机场全自动版)yaml
# --- 基础设置 --- mixed-port: 7890 allow-lan: true mode: rule log-level: info external-controller: 0.0.0.0:9090 secret: "123456" # 登录 Web 面板的密码,务必修改 # --- TUN 模式 (透明网关核心) --- tun: enable: true stack: mixed auto-route: true auto-detect-interface: true dns-hijack: - any:53 # --- DNS 防污染设置 --- dns: enable: true ipv6: false enhanced-mode: fake-ip fake-ip-range: 198.18.0.1/16 nameserver: - 114.114.114.114 - 223.5.5.5 # --- 订阅源配置 (核心避坑区) --- proxy-providers: my_airport: # 你的机场代号 type: http url: "这里粘贴你的 Clash 订阅链接" # <--- 唯一需要你填链接的地方 path: ./airport.yaml interval: 86400 # 每天自动更新 health-check: enable: true url: http://www.gstatic.com/generate_204 interval: 300 # --- 策略组配置 --- proxy-groups: - name: "主出口" type: select proxies: - "自动选路" - DIRECT - name: "自动选路" type: url-test use: - my_airport # 必须与上面 provider 的名字完全一致 url: http://www.gstatic.com/generate_204 interval: 300 tolerance: 50 # --- 分流规则 --- rules: - GEOIP,LAN,DIRECT - GEOIP,CN,DIRECT - MATCH,主出口
(双机场自动版)
mixed-port: 7890 allow-lan: true bind-address: "*" mode: rule log-level: info external-controller: 0.0.0.0:9090 secret: "123456" # 可选,用于设置访问密码 tun: enable: true stack: mixed auto-route: true auto-detect-interface: true dns-hijack: - any:53 - tcp://any:53 dns: enable: true ipv6: false enhanced-mode: fake-ip fake-ip-range: 198.18.0.1/16 nameserver: - 114.114.114.114 - 223.5.5.5 fallback: - tls://8.8.8.8:853 - tls://1.1.1.1:853 proxy-providers: airport1: # 随便起名,建议有意义 type: http url: "https://机场1的订阅链接" # 替换成你的第1个链接 path: ./airport1.yaml interval: 86400 # 每天更新一次 health-check: enable: true url: "https://www.gstatic.com/generate_204" interval: 300 airport2: type: http url: "https://机场2的订阅链接" # 第2个 path: ./airport2.yaml interval: 86400 health-check: enable: true url: "https://www.gstatic.com/generate_204" interval: 300 proxy-groups: # 主出口组:你可以在这里手动选机场,或用自动策略 - name: "主出口" type: select # 手动选择模式(最常用) proxies: - "机场1-自动" - "机场2-自动" - DIRECT - REJECT # 每个机场单独做 url-test(延迟最低自动选节点) - name: "机场1-自动" type: url-test use: - airport1 # 只用这个 provider 的节点 url: "http://www.gstatic.com/generate_204" interval: 300 tolerance: 50 # 延迟波动容忍(可选) - name: "机场2-自动" type: url-test use: - airport2 url: "http://www.gstatic.com/generate_204" interval: 300 # 可选:全部节点合并 + 自动选延迟最低的(适合追求极致速度) - name: "全部-最低延迟" type: url-test use: - airport1 - airport2 url: "http://www.gstatic.com/generate_204" interval: 300 tolerance: 100 rules: - GEOIP,LAN,DIRECT - GEOIP,CN,DIRECT - MATCH,主出口 # 改成你的主出口组名

避坑指南: 配置文件中 proxy-groups 里的 use 标签必须严格对应 proxy-providers 里定义的名字。如果你只用一个机场,绝对不要在策略组里残留类似 airport2 的未定义名称,否则容器会报 Parse config error: proxy group not found 并直接闪退。


阶段三:Docker Compose 编排

我们将采用“双容器”架构:一个跑内核(负责代理),一个跑面板(负责可视化)。

mihomo 根目录下创建 docker-compose.yml 文件:

yaml
services: mihomo: image: metacubex/mihomo:latest container_name: mihomo-core restart: unless-stopped network_mode: host pid: host ipc: host cap_add: - NET_ADMIN # TUN 模式必需的内核网络权限 security_opt: - apparmor=unconfined volumes: - ./data:/root/.config/mihomo # 映射刚才写的配置文件和 Geo 数据 - /dev/net/tun:/dev/net/tun # 映射虚拟网卡设备 - /etc/localtime:/etc/localtime:ro metacubexd: image: ghcr.io/metacubex/metacubexd:latest container_name: mihomo-web restart: unless-stopped network_mode: bridge # 面板不需要 host 网络 ports: - "9091:80" # 浏览器访问端口,可自定义 volumes: - ./config:/config/caddy - /etc/localtime:/etc/localtime:ro

避坑指南: 尽量使用官方原版镜像名称,不要在 docker-compose.yml 中硬编码第三方加速前缀(如 docker.1ms.run)。如果遇到拉取失败 (unknown blob),应在系统的 /etc/docker/daemon.json 中配置如 docker.m.daocloud.iohub.rat.dev 等稳定的加速源。


阶段四:启动与排错

1. 启动容器 在终端运行以下命令一键启动:

bash
docker-compose up -d

2. 核心排错思路 作为 IT 运维老手,遇到启动失败时,优先检查以下几点:

  • 拉取失败 (Connection Refused): 检查宿主机底层是否残留了失效的全局代理环境变量,特别是 /etc/docker/daemon.json 中是否被硬编码了 proxies 字段,如果有,直接删除并 systemctl restart docker
  • 无限重启 (Exited 1): 查看日志 docker logs mihomo-core。如果是 unknown blob,说明镜像损坏,执行 docker system prune -a 清理后重试。

3. 访问控制面板

  • 浏览器打开 http://你的NAS_IP:9091
  • 后端地址:填入 http://你的NAS_IP:9090
  • 密钥:填入你在 config.yaml 中设置的 secret 密码。
  • 连接成功后,在“代理”页面即可看到自动测速和选路的节点列表。

只要 Mihomo 处于运行状态,你的 NAS 就已经拥有了透明代理能力。你现在可以去尝试重新拉取之前那个慢得让人抓狂的镜像了,速度绝对会给你惊喜。

本文作者:小转圈

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!