
Mihomo(原 Clash Meta)搭配官方 Web 面板(MetacubeXD),不仅能实现极其精细的分流策略,其强大的 TUN 模式更能让整台 NAS(包括里面的其他 Docker 容器)直接享受代理网络,告别镜像拉取缓慢的烦恼。
在开始写配置之前,我们需要先搭建好骨架,并提前下载好 Mihomo 运行必需的地理位置数据库。如果不提前准备这些数据文件,容器启动时可能会因为无法连网下载而无限重启。
1. 创建目录结构 通过 SSH 登录你的 NAS,创建目录
2. 下载 Geo 数据文件
在 data 目录中,使用 wget 手动下载以下三个核心文件(如果你的网络目前拉取困难,可以先在电脑上通过代理下载好,再上传到这个文件夹):
geoip.datgeosite.datcountry.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并直接闪退。
我们将采用“双容器”架构:一个跑内核(负责代理),一个跑面板(负责可视化)。
在 mihomo 根目录下创建 docker-compose.yml 文件:
yamlservices:
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.io或hub.rat.dev等稳定的加速源。
1. 启动容器 在终端运行以下命令一键启动:
bashdocker-compose up -d
2. 核心排错思路 作为 IT 运维老手,遇到启动失败时,优先检查以下几点:
/etc/docker/daemon.json 中是否被硬编码了 proxies 字段,如果有,直接删除并 systemctl restart docker。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 许可协议。转载请注明出处!