Mihomo 科学上网配置指南

1. 前言

家里有一台NAS服务器,有科学上网需求。所以上网找了下 Mihomo 部署的材料。

2. 准备工作

在开始之前,请确保您的环境满足以下条件:

  • Docker 环境:已安装 Docker 及 Docker Compose。

  • 基础知识:熟悉基本的命令行操作(创建文件夹、编辑文件)。

  • 网络环境:拥有可用的节点订阅链接。

3. 开始操作

准备 config.yaml 文件

市面上一般用的科学上网都是 Mihomo/clash。

  • 创建文件夹,命名为 mihomo

  • 在其中创建一个 config.yaml 文件。

  • 模板参考如下

alt text

提前下载 GeoIP/GeoSite 数据库文件

容器启动,一定会出现报错: level=fatal msg="Parse config error... can't download MMDB: context deadline exceeded"

这里先提前下载好文件,避免容器启动出错。

  1. 前往 MetaCubeX/meta-rules-dat 下载以下文件:

    • geoip.dat

    • geosite.dat

    • country-lite.mmdb

    • GeoLite2-ASN.mmdb

  2. 将这4个文件手动上传到宿主机的 mihomo 文件夹(与 config.yaml 同级)。

mihomo下载文件

4. 部署 Mihomo 核心Metacubexd (WebUI)

建议:在 mihomo 同级文件夹,创建 docker-compose.yml 文件。

关键配置说明 (TUN 模式支持): 为了支持 TUN 模式(虚拟网卡),容器必须拥有网络管理权限。所以在配置中加入了 cap_add: [NET_ADMIN]devices: [/dev/net/tun],这是实现透明代理的关键。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
version: '3'

services:
  # Web 管理面板
  metacubexd:
    container_name: metacubexd
    #image: ghcr.io/metacubex/metacubexd
    # 国内加速源
    image: ghcr.1ms.run/metacubex/metacubexd
    restart: always
    ports:
      - '9097:80' # WebUI 访问端口

  # Mihomo 核心
  mihomo:
    container_name: mihomo
    #image: docker.io/metacubex/mihomo:latest
    # 国内加速源
    image: docker.1ms.run/metacubex/mihomo:latest
    restart: always
    pid: host
    ipc: host
    network_mode: host # 推荐使用 Host 模式,性能最好且便于处理 IPv6
    
    # --- TUN 模式核心配置 ---
    cap_add:
      - NET_ADMIN      # 赋予网络管理权限
    devices:
      - /dev/net/tun:/dev/net/tun # 映射宿主机的 TUN 设备
    volumes:
      # ⚠️ 注意:冒号左边请修改为你 config.yaml 所在的实际绝对路径
      - ./mihomo:/root/.config/mihomo

5. 启动容器

docker-compose.yml 目录执行如下命令:

1
sudo docker-compose up -d

一般NAS都具有图形化系统,可以直接在docker管理中创建Docker Compose项目,导入 docker-compose.yml 文件,启动容器即可。

6. 配置 WebUI

  1. 打开浏览器访问:http://设备IP:9097

  2. 进入设置页面,添加后端:

    • API Base URL: http://设备IP:9090

    • Secret: 在 config 第 7 行设置的 API 访问密钥

7. 进阶:关于 TUN 模式与透明代理

TUN 模式允许 Mihomo 创建一个虚拟网卡,接管设备上所有层级的流量(包括不走系统代理的终端命令、游戏等)。

为什么需要特殊权限?

在 Docker 中,默认容器是没有权限创建网络设备的。要启用 TUN 模式,必须在启动参数中显式声明:

  • --cap-add=NET_ADMIN:允许容器修改网络堆栈。

  • --device=/dev/net/tun:允许容器访问 Linux 的 TUN 字符设备。

在本文提供的 docker-compose.yml 中,已经默认添加了这两项配置。

如何启用?

  1. 确保 Docker 配置已包含上述权限参数。

  2. 在 WebUI 的设置页面中勾选 TUN 模式

  3. 或者在 config.yaml 中将 tun: enable 设置为 true 并重启容器。

此时,配合路由表的设置,Mihomo 即可变身为一个网关,实现透明代理。

alt text