# 须知

本文默认您已经安装好了 docker 并了解 docker 的一些基本概念

如果您是纯命令行环境,本文将默认你会命令行最基本的使用(如创建文件/文件夹、编辑文本等)

mihomoclash 的一个分支,也是目前使用最广泛的分支,各平台许多客户端使用的核心均为 mihomo,或者它曾经还有个可能更多人听过的名字叫 mihomo meta

需要说明的是 mihomo 与最原始的 clash 本身都是一个纯命令行程序,这意味着它本身没有图形界面,但本文会讲到如何配置 mihomowebUI,以便日常使用。

# 编写 mihomo 配置文件

新建一个空文件夹命名为 mihomo,在其中新建文本文档 config.yaml

mkdir -p /root/mihomo
cd /root/mihomo

nano config.yaml

可参考下方模板来创建您自己的配置文件,模板参考自官方文档,如果你希望了解配置文件的具体规则,同样请参考官方文档。(本文最后有链接)

该模板中必须要修改的是第 1920 行与 25 行,根据实际情况进行填写,修改模板后不含模板中的尖括号。其中节点提供者名称可自由填写,用于程序区分多个订阅;节点名称前缀会在显示节点信息时插入到原始节点名称前,便于自己区分不同订阅的节点。

第 1 行为代理端口设置,第 6 行为外部控制端口设置(如使用 webUI 控制 mihomo)如有需要可自行更改。

mixed-port: 7890
allow-lan: true
bind-address: '*'
mode: rule
log-level: info
external-controller: '0.0.0.0:9090'

tun:
  enable: false
  stack: mixed
  dns-hijack:
    - "any:53"
    - "tcp://any:53"
  auto-route: true
  auto-redirect: true
  auto-detect-interface: true

proxy-providers:
  <节点提供者名称>:
    url: "<节点订阅链接>"
    type: http
    interval: 86400
    health-check: {enable: true,url: "https://www.gstatic.com/generate_204", interval: 300}
    override:
      additional-prefix: "<节点名称前缀>"

proxies: 
  - name: "直连"
    type: direct
    udp: true

geodata-mode: true
geox-url:
  geoip: "https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip.dat"
  geosite: "https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geosite.dat"
  mmdb: "https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/country-lite.mmdb"
  asn: "https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/GeoLite2-ASN.mmdb"

dns:
  enable: true
  ipv6: true
  respect-rules: true
  enhanced-mode: fake-ip
  fake-ip-filter:
    - "*"
    - "+.lan"
    - "+.local"
    - "+.market.xiaomi.com"
  nameserver:
    - https://120.53.53.53/dns-query
    - https://223.5.5.5/dns-query
  proxy-server-nameserver:
    - https://120.53.53.53/dns-query
    - https://223.5.5.5/dns-query
  nameserver-policy:
    "geosite:cn,private":
      - https://120.53.53.53/dns-query
      - https://223.5.5.5/dns-query
    "geosite:geolocation-!cn":
      - "https://dns.cloudflare.com/dns-query"
      - "https://dns.google/dns-query"

proxy-groups:

  - name: 默认
    type: select
    proxies: [自动选择,直连,香港,台湾,日本,新加坡,美国,其它地区,全部节点]

  - name: Google
    type: select
    proxies: [默认,香港,台湾,日本,新加坡,美国,其它地区,全部节点,自动选择,直连]

  - name: Telegram
    type: select
    proxies: [默认,香港,台湾,日本,新加坡,美国,其它地区,全部节点,自动选择,直连]

  - name: Twitter
    type: select
    proxies: [默认,香港,台湾,日本,新加坡,美国,其它地区,全部节点,自动选择,直连]

  - name: 哔哩哔哩
    type: select
    proxies: [默认,香港,台湾,日本,新加坡,美国,其它地区,全部节点,自动选择,直连]

  - name: 巴哈姆特
    type: select
    proxies: [默认,香港,台湾,日本,新加坡,美国,其它地区,全部节点,自动选择,直连]

  - name: YouTube
    type: select
    proxies: [默认,香港,台湾,日本,新加坡,美国,其它地区,全部节点,自动选择,直连]

  - name: 海外AI
    type: select
    proxies: [默认,香港,台湾,日本,新加坡,美国,其它地区,全部节点,自动选择,直连]

  - name: NETFLIX
    type: select
    proxies: [默认,香港,台湾,日本,新加坡,美国,其它地区,全部节点,自动选择,直连]

  - name: Spotify
    type: select
    proxies:  [默认,香港,台湾,日本,新加坡,美国,其它地区,全部节点,自动选择,直连]

  - name: Github
    type: select
    proxies:  [默认,香港,台湾,日本,新加坡,美国,其它地区,全部节点,自动选择,直连]

  - name: 国内
    type: select
    proxies:  [直连,默认,香港,台湾,日本,新加坡,美国,其它地区,全部节点,自动选择]

  - name: 其他
    type: select
    proxies:  [默认,香港,台湾,日本,新加坡,美国,其它地区,全部节点,自动选择,直连]

  #分隔,下面是地区分组
  - name: 香港
    type: select
    include-all: true
    filter: "(?i)港|hk|hongkong|hong kong"

  - name: 台湾
    type: select
    include-all: true
    filter: "(?i)台|tw|taiwan"

  - name: 日本
    type: select
    include-all: true
    filter: "(?i)日|jp|japan"

  - name: 美国
    type: select
    include-all: true
    filter: "(?i)美|us|unitedstates|united states"

  - name: 新加坡
    type: select
    include-all: true
    filter: "(?i)(新|sg|singapore)"

  - name: 其它地区
    type: select
    include-all: true
    filter: "(?i)^(?!.*(?:🇭🇰|🇯🇵|🇺🇸|🇸🇬|🇨🇳|港|hk|hongkong|台|tw|taiwan|日|jp|japan|新|sg|singapore|美|us|unitedstates)).*"

  - name: 全部节点
    type: select
    include-all: true

  - name: 自动选择
    type: url-test
    include-all: true
    tolerance: 10

rules:
  - GEOIP,lan,直连,no-resolve
  - GEOSITE,twitter,Twitter
  - GEOSITE,youtube,YouTube
  - GEOSITE,category-ai-!cn,海外AI
  - GEOSITE,github,Github
  - GEOSITE,google,Google
  - GEOSITE,telegram,Telegram
  - GEOSITE,netflix,NETFLIX
  - GEOSITE,bilibili,哔哩哔哩
  - GEOSITE,bahamut,巴哈姆特
  - GEOSITE,spotify,Spotify
  - GEOSITE,CN,国内
  - GEOSITE,geolocation-!cn,其他

  - GEOIP,CN,国内
  - MATCH,其他

# 使用 docker compose 构建容器

在另一处新建一个文件夹,创建 docker-compose.yml 文件,填入以下内容,其中 21 行尖括号内需自行修改为你上一步创建的配置文件所在目录,修改后不含尖括号。

version: '3'

services:
  metacubexd:
    container_name: metacubexd
    image: ghcr.io/metacubex/metacubexd
    restart: always
    ports:
      - '9097:80'

  mihomo:
    container_name: mihomo
    image: docker.io/metacubex/mihomo:latest
    restart: always
    pid: host
    ipc: host
    network_mode: host
    cap_add:
      - ALL
    volumes:
      - <config.yaml所在目>:/root/.config/mihomo
      - /dev/net/tun:/dev/net/tun

你或许会注意到 compose 文件中除了指定了 mihomo 的镜像外还指定了一个叫做 metacubexd 的镜像,这个镜像是 mihomo 作者开发的一个 mihomowebUI,如果你不需要 webUI 可以将这部分删除(你不知道自己需不需要那就是需要)。

其中第 9 行的 9097webUI 访问端口,如有需要可自行更改。

# 终端

# 先 cd 到 docker-compose.yml 所在路径
# 启动项目
sudo docker-compose up -d
# 关闭项目
sudo docker-compose stop

# 补充

你有可能会运行容器失败并在容器日志中出现类似如下的规则报错:

level=fatal msg="Parse config error: rules[512] [GEOIP,CN,DIRECT] error: can't download MMDB: context deadline exceeded"

这是由于没有成功下载配置文件中需要用到的一些规则文件导致的,最简单无脑的方法是手动下载。

可以前往该仓库下载 geoip.datgeosite.datGeoLite2-ASN.mmdbcountry-lite.mmdb 这几个文件,并将其上传到与 config.yaml 相同的目录内再重新运行容器即可

# 打开 webUI 并开始使用

在局域网内任意设备浏览器中输入 设备IP:9097 即可访问metacubexd的界面,后端地址填写 http://设备IP:9090 ,密钥留空即可,如图所示,点击添加便可管理 mihomo 的各项配置。若在前文中修改了 webUI 访问端口和外部控制端口,请自行替换为自己设置的端口号。

<!-- 这是一张图片,ocr 内容为: -->

至此已搭建完成,在需要使用网络代理的地方(具体见 Q&A)在代理选项内填入 设备IP:7890 即可使用

# metacubexd 中一些基本的说明

# 模板文件的分流规则逻辑

如果你是使用我上方提供的配置模板,那么 metacubexd 的代理页面应该有默认GoogleGLOBAL等分组,这些分组被称为代理组,你可以指定各个代理组使用哪个节点。

metacubexd 的配置页面中的运行模式里,分别有规则、直连、全局几个选项。若使用全局,则所有经过 mihomo 的流量均会通过 GLOBAL代理组 内指定的节点转发;若使用规则,则会按配置文件中的规则进行分流,下方会介绍模板文件中的规则逻辑

我提供的模板文件中的规则为:当访问一个地址时会优先查询是否属于代理组中已经指定的网站,比如 Google,这类网站会直接走你在对应代理组中指定的节点。代理组可以套娃,你如果打开 Google 代理组会注意到里面并不让你选择具体的节点,而是选择其他代理组,则这时会再到对应的代理组中使用你指定的节点。

举例:Google 代理组中指定了“香港”这个代理组,而香港代理组中指定了“香港01”这个节点,那么当访问 Google 时,流量会通过“香港01”这个节点转发。

若访问的网站不属于代理组中指定的网站,则会使用“默认”代理组中指定的节点,同样可以套娃。

如果想给模板文件中没有指定的网站进行单独分流,请期待后续的进阶教程。

# TUN 模式

TUN 模式即虚拟网卡模式,启用该模式会另 mihomo 接管本设备的所有流量,如有需要可在 metacubexd 的配置页面启用,如果希望启动 mihomo 时自动打开 TUN 模式,可以将模板配置文件中第 9 行的 false 改为 true

# 相关链接

mihomo 仓库: https://github.com/MetaCubeX/mihomo

mihomo 文档: https://wiki.metacubex.one/

metacubexd 仓库: https://github.com/MetaCubeX/metacubexd