须知
本文默认您已经安装好了 docker 并了解 docker 的一些基本概念
如果您是纯命令行环境,本文将默认你会命令行最基本的使用(如创建文件/文件夹、编辑文本等)
mihomo 是 clash 的一个分支,也是目前使用最广泛的分支,各平台许多客户端使用的核心均为 mihomo,或者它曾经还有个可能更多人听过的名字叫 mihomo meta
。
需要说明的是 mihomo 与最原始的 clash 本身都是一个纯命令行程序,这意味着它本身没有图形界面,但本文会讲到如何配置 mihomo 的 webUI,以便日常使用。
编写 mihomo 配置文件
新建一个空文件夹命名为 mihomo
,在其中新建文本文档 config.yaml
可参考下方模板来创建您自己的配置文件,模板参考自官方文档,如果你希望了解配置文件的具体规则,同样请参考官方文档。(本文最后有链接)
该模板中必须要修改的是第 19、20 行与 25 行,proxy-providers
根据实际情况进行填写,修改模板后不含模板中的尖括号。其中节点提供者名称可自由填写,用于程序区分多个订阅;节点名称前缀会在显示节点信息时插入到原始节点名称前,便于自己区分不同订阅的节点。
第 1 行mixed-port
为代理端口设置,第 6 行external-controller
为外部控制端口设置(如使用 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://mirror.ghproxy.com/https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geoip-lite.dat"
geosite: "https://mirror.ghproxy.com/https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/geosite.dat"
mmdb: "https://mirror.ghproxy.com/https://github.com/MetaCubeX/meta-rules-dat/releases/download/latest/country-lite.mmdb"
asn: "https://mirror.ghproxy.com/https://github.com/xishang0128/geoip/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: 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,github,Github
- GEOSITE,twitter,Twitter
- GEOSITE,youtube,YouTube
- GEOSITE,google,Google
- GEOSITE,telegram,Telegram
- GEOSITE,netflix,NETFLIX
- GEOSITE,bilibili,哔哩哔哩
- GEOSITE,bahamut,巴哈姆特
- GEOSITE,spotify,Spotify
- GEOSITE,CN,国内
- GEOSITE,geolocation-!cn,其他
- GEOIP,google,Google
- GEOIP,netflix,NETFLIX
- GEOIP,telegram,Telegram
- GEOIP,twitter,Twitter
- GEOIP,CN,国内
- MATCH,其他
使用 docker compose 构建容器
在另一处新建一个文件夹,创建 docker-compose.yml
文件,填入以下内容,其中 21 行尖括号内需自行修改为你上一步创建的配置文件所在目录,修改后不含尖括号。
注:在另一处创建文件夹是个人习惯,如果你希望项目使用的文件都在同一处可以自行调整该 compose 文件。如果又想改又实在不会可以将本文开头到下方文件复制拿去问 AI 怎么改。
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 作者开发的一个 mihomo 的 webUI,如果你不需要 webUI 可以将这部分删除(你不知道自己需不需要那就是需要)。
其中第 9 行的 9097 为webUI 访问端口,如有需要可自行更改。
终端
# 先 cd 到 docker-compose.yml 所在路径
# 启动项目
sudo docker-compose up -d
# 关闭项目
sudo docker-compose stop
飞牛OS
Docker → Compose → 新增项目 → 名称随意,选择 docker-compose.yml
所在文件夹作为项目路径 → 选择使用现有的 docker-compose 配置文件来创建项目 → 确定
第一次使用需要先构建该项目,后续无需重复构建,直接启动即可。若更新镜像则仍需重新构建一次。
补充
你有可能会运行容器失败并在容器日志中出现如下报错:
level=fatal msg="Parse config error: rules[512] [GEOIP,CN,DIRECT] error: can't download MMDB: context deadline exceeded"
你也肯定能看出来这是因为无法下载 MMDB 导致的,那么解决方法也很明了了,直接去下载一个就行
可以前往该仓库下载 geoip.metadb
等文件,并将其上传到与 config.yaml
相同的目录内再重新运行容器即可
打开 webUI 并开始使用
在局域网内任意设备浏览器中输入 设备IP:9097
即可访问 metacubexd 的界面,后端地址填写 http://设备IP:9090
,密钥留空即可,如图所示,点击添加便可管理 mihomo 的各项配置。若在前文中修改了 webUI 访问端口和外部控制端口,请自行替换为自己设置的端口号。
如果你使用 metacubexd 更改了一些设置,那将只会在 mihomo 的本次运行生效,重启 mihomo 会将所有设置重置为你第一步在 config.yaml 中所填写的配置
至此已搭建完成,在需要使用网络代理的地方(具体见 Q&A)在代理选项内填入 设备IP:7890
即可使用
metacubexd 中一些基本的说明
模板文件的分流规则逻辑
如果你是使用我上方提供的配置模板,那么 metacubexd 的代理页面应该有默认、Google、GLOBAL等分组,这些分组被称为代理组,你可以指定各个代理组使用哪个节点。
在 metacubexd 的配置页面中的运行模式里,分别有规则、直连、全局几个选项。若使用全局,则所有经过 mihomo 的流量均会通过 GLOBAL代理组 内指定的节点转发;若使用规则,则会按配置文件中的规则进行分流,下方会介绍模板文件中的规则逻辑;若使用直连就不用我说了吧
我提供的模板文件中的规则为:当访问一个地址时会优先查询是否属于代理组中已经指定的网站,比如 Google,这类网站会直接走你在对应代理组中指定的节点。代理组可以套娃,你如果打开 Google 代理组会注意到里面并不让你选择具体的节点,而是选择其他代理组,则这时会再到对应的代理组中使用你指定的节点。
举例:Google 代理组中指定了“香港”这个代理组,而香港代理组中指定了“香港01”这个节点,那么当访问 Google 时,流量会通过“香港01”这个节点转发。
若访问的网站不属于代理组中指定的网站,则会使用“默认”代理组中指定的节点,同样可以套娃。
如果想给模板文件中没有指定的网站进行单独分流,请期待后续的进阶教程。先鸽着等我想写再说
TUN 模式
TUN 模式即虚拟网卡模式,启用该模式会另 mihomo 接管本设备的所有流量,如有需要可在 metacubexd 的配置页面启用,如果希望启动 mihomo 时自动打开 TUN 模式,可以将模板配置文件中第 9 行的 false 改为 true。
Q&A
Q1:“在需要使用网络代理的地方填入”是指填入哪
A:包括但不限于:各系统的系统代理(如 Windows 设置中的代理设置,手机 WiFi 的代理设置)、Linux 中环境变量的 http_proxy 等代理字段、各软件内部的代理设置等。
- 对于 系统代理,以 Windows 举例,并非所有软件都会走系统代理,这种时候你需要查看应用内是否能设置代理;若没有相关选项且应用本身不走系统代理则你需要考虑其他方法让 mihomo 来接管流量,不过这些就不在这篇教程的范畴内了。
- 如果你希望 mihomo 接管 docker 宿主设备本身 的所有流量,你可以参考我的教程启用 TUN 模式
- 如果你希望作为路由设备使用,比如你可能在其他地方见过的将网关指向该设备的用法,你可以配置 透明代理,这同样不在这篇教程的范畴中,但我会推荐你在路由设备中使用 ShellCrash (通用)或者 OpenClash(仅限 OpenWRT),但详细的使用方法请自行探究。
Q2:我使用了其他地方寻找的 config.yaml 模板,最后一步点击添加连接后端时报错 Failed to fetch
A:检查 config.yaml
内的 external-controller
字段,连接后端时以填入该处指定的端口
Q3:我使用了你之前的文章的 config.yaml 模板,依然出现上一个问题
A:检查是否将 mihomo 容器的网络模式更改为 host,若没有请去更改
Q4:metacubexd 和 yacd 都有在线版本,为什么不用?
A:因为我发现在线版本我连接不上 NAS 的后端,原因未知,有人知道原因的话麻烦评论留言告诉我一下。
Q5:为什么 WebUI 选择了 metacubexd 而不是 yacd 或其他?
A:个人选择,你当然可以用 yacd,使用上不会有什么影响。
还有其他问题的欢迎留言,如果有其他比较典型的问题我会在后续添加到 Q&A 部分
相关链接
mihomo 仓库: https://github.com/MetaCubeX/mihomo