mihomo 是 Clash.Meta 的延续版本,常见用法是把它作为一个代理内核运行在一台长期在线的机器上,然后让本机、手机、Windows 电脑、Linux 电脑都通过这台机器访问代理服务。

这篇文章记录一个最实用的部署方式:在 Docker 里运行 mihomo,宿主机负责提供端口,局域网里的其他设备只需要把 HTTP / SOCKS 代理指向这台机器即可。

总览:先看整体链路#

假设运行 Docker 的机器局域网 IP 是 192.168.1.10,mihomo 在这台机器上监听 7890 端口:

Windows / Linux / 手机
        |
        |  HTTP / SOCKS 代理:192.168.1.10:7890
        v
Docker 宿主机:192.168.1.10
        |
        |  mihomo 容器
        v
按规则直连或走代理节点

关键点只有三个:

  1. mihomo 配置里开启 allow-lan: true
  2. mihomo 监听地址使用 bind-address: "*" 或宿主机局域网 IP。
  3. Docker 把 7890 端口暴露给局域网。

第一步:准备目录#

在准备用作代理网关的机器上创建目录:

mkdir -p ~/mihomo/config
cd ~/mihomo

后面所有文件都放在 ~/mihomo 目录里:

~/mihomo/
├── compose.yaml
└── config/
    └── config.yaml

第二步:编写 mihomo 配置#

创建 ~/mihomo/config/config.yaml

mixed-port: 7890
allow-lan: true
bind-address: "*"
mode: rule
log-level: info
ipv6: false

external-controller: 0.0.0.0:9090
secret: "change-this-secret"

profile:
  store-selected: true
  store-fake-ip: true

dns:
  enable: true
  listen: 0.0.0.0:1053
  ipv6: false
  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.1/16
  nameserver:
    - 223.5.5.5
    - 119.29.29.29
  fallback:
    - https://1.1.1.1/dns-query
    - https://8.8.8.8/dns-query

proxy-providers:
  my-subscription:
    type: http
    url: "https://example.com/your-subscription.yaml"
    interval: 3600
    path: ./providers/my-subscription.yaml
    health-check:
      enable: true
      interval: 600
      url: https://www.gstatic.com/generate_204

proxy-groups:
  - name: PROXY
    type: select
    use:
      - my-subscription
    proxies:
      - DIRECT

rules:
  - GEOIP,LAN,DIRECT
  - GEOSITE,cn,DIRECT
  - GEOIP,CN,DIRECT
  - MATCH,PROXY

这里需要修改两处:

  • url:替换成你自己的订阅地址,或者删除 proxy-providers 后手写 proxies 节点。
  • secret:改成一个只有你知道的随机字符串,避免局域网里其他人随意控制面板。

如果你只想先验证容器能不能启动,可以暂时把规则改成全部直连:

mixed-port: 7890
allow-lan: true
bind-address: "*"
mode: direct
log-level: info
external-controller: 0.0.0.0:9090
secret: "change-this-secret"

第三步:用 Docker Compose 启动#

如果 Docker 宿主机是 Linux,推荐先用 host 网络模式,端口映射最简单,也更适合后续扩展 TUN、透明代理等玩法。

创建 ~/mihomo/compose.yaml

services:
  mihomo:
    image: docker.io/metacubex/mihomo:latest
    container_name: mihomo
    restart: unless-stopped
    network_mode: host
    volumes:
      - ./config:/root/.config/mihomo

启动:

docker compose up -d

查看日志:

docker logs -f mihomo

如果能看到 mihomo 读取配置并监听端口,说明服务已经跑起来了。

如果不能使用 host 网络模式#

在部分 NAS、Docker Desktop 或受限制环境里,network_mode: host 可能不符合预期。这时可以改成普通端口映射:

services:
  mihomo:
    image: docker.io/metacubex/mihomo:latest
    container_name: mihomo
    restart: unless-stopped
    ports:
      - "7890:7890"
      - "9090:9090"
    volumes:
      - ./config:/root/.config/mihomo

这个模式足够满足“局域网其他电脑通过代理端口接入”的需求。

第四步:确认宿主机局域网 IP#

在 Docker 宿主机上执行:

ip -4 addr

找到类似这样的地址:

192.168.1.10/24

后面局域网客户端都使用这个 IP。本文继续假设宿主机 IP 是:

192.168.1.10

在宿主机本机测试代理端口:

curl -x http://127.0.0.1:7890 https://www.gstatic.com/generate_204 -I

在另一台局域网电脑上测试:

curl -x http://192.168.1.10:7890 https://www.gstatic.com/generate_204 -I

能返回 204200 或正常 HTTP 响应,说明端口已经能从局域网访问。

第五步:本机如何接入#

如果 Docker 就运行在当前 Linux 主机上,本机程序可以直接使用:

HTTP 代理:  127.0.0.1:7890
HTTPS 代理: 127.0.0.1:7890
SOCKS 代理: 127.0.0.1:7890

命令行临时使用:

export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890
export all_proxy=socks5://127.0.0.1:7890

验证:

curl https://ipinfo.io/ip

取消代理:

unset http_proxy https_proxy all_proxy

第六步:Windows 电脑如何接入#

在 Windows 上不需要安装 mihomo 内核,只要把系统代理指向 Docker 宿主机即可。

打开:

设置 -> 网络和 Internet -> 代理 -> 手动设置代理

填写:

代理服务器地址:192.168.1.10
端口:7890

保存后,浏览器和大多数遵循系统代理的软件都会走这台 mihomo 服务。

如果某些软件不读取系统代理,可以在软件自己的网络设置里单独填写:

HTTP Proxy:  192.168.1.10:7890
HTTPS Proxy: 192.168.1.10:7890
SOCKS5 Proxy: 192.168.1.10:7890

PowerShell 临时使用代理:

$env:HTTP_PROXY="http://192.168.1.10:7890"
$env:HTTPS_PROXY="http://192.168.1.10:7890"

验证:

curl.exe -x http://192.168.1.10:7890 https://www.gstatic.com/generate_204 -I

取消当前 PowerShell 会话里的代理:

Remove-Item Env:HTTP_PROXY
Remove-Item Env:HTTPS_PROXY

第七步:Linux 电脑如何接入#

Linux 桌面环境可以在系统网络设置里配置代理:

HTTP Proxy:  192.168.1.10  Port: 7890
HTTPS Proxy: 192.168.1.10  Port: 7890
SOCKS Proxy: 192.168.1.10  Port: 7890

命令行临时使用:

export http_proxy=http://192.168.1.10:7890
export https_proxy=http://192.168.1.10:7890
export all_proxy=socks5://192.168.1.10:7890

测试:

curl -I https://www.gstatic.com/generate_204

APT 临时使用代理:

sudo apt -o Acquire::http::Proxy="http://192.168.1.10:7890" update

如果想让当前用户长期生效,可以把下面内容写入 ~/.profile~/.bashrc

export http_proxy=http://192.168.1.10:7890
export https_proxy=http://192.168.1.10:7890
export all_proxy=socks5://192.168.1.10:7890

第八步:使用 Web 面板#

mihomo 的控制 API 在上面的配置里监听 9090

external-controller: 0.0.0.0:9090
secret: "change-this-secret"

可以使用 MetaCubeX 的 Web Dashboard 连接:

API 地址:http://192.168.1.10:9090
Secret:change-this-secret

如果你的控制面板打不开,先确认三件事:

  1. 9090 是否映射或暴露出来。
  2. external-controller 是否是 0.0.0.0:9090,而不是 127.0.0.1:9090
  3. 防火墙是否放行了 9090

如果只是给局域网设备提供代理,9090 不是必须开放;它只用于控制面板。

防火墙设置#

如果宿主机启用了 ufw,需要放行代理端口:

sudo ufw allow from 192.168.1.0/24 to any port 7890 proto tcp
sudo ufw allow from 192.168.1.0/24 to any port 9090 proto tcp

如果你不需要局域网访问控制面板,就不要放行 9090

在云服务器上不建议把 78909090 暴露到公网。本文讨论的是家庭或办公室局域网场景。

常见问题 / 排查思路#

1. 容器启动后立刻退出#

先看日志:

docker logs mihomo

常见原因是 config.yaml 缩进错误、订阅地址不可访问、规则集配置错误。可以先用最小直连配置启动,确认容器本身没有问题,再逐步加回订阅和规则。

2. 本机能用,局域网电脑不能用#

重点检查:

allow-lan: true
bind-address: "*"

然后检查 Docker 是否暴露端口,以及宿主机防火墙是否拦截 7890

在局域网电脑上可以测试端口连通性:

nc -vz 192.168.1.10 7890

Windows PowerShell 可以用:

Test-NetConnection 192.168.1.10 -Port 7890

3. 浏览器能用,命令行不能用#

浏览器可能读取系统代理,但命令行不会自动读取。给当前终端设置环境变量:

export http_proxy=http://192.168.1.10:7890
export https_proxy=http://192.168.1.10:7890

Windows PowerShell 则设置:

$env:HTTP_PROXY="http://192.168.1.10:7890"
$env:HTTPS_PROXY="http://192.168.1.10:7890"

4. Web 面板能打开,但没有节点#

通常是订阅没有拉取成功。检查:

docker logs mihomo

也可以确认容器内配置目录是否有 provider 文件:

docker exec -it mihomo ls -lah /root/.config/mihomo/providers

5. 不想让所有局域网设备都能连接#

可以在 mihomo 配置里限制允许的 IP 段,例如只允许 192.168.1.0/24

allow-lan: true
bind-address: "*"
lan-allowed-ips:
  - 192.168.1.0/24

也可以直接通过系统防火墙限制来源 IP。

总结#

Docker 部署 mihomo 的核心并不复杂:

  1. 用 Docker Compose 跑起 metacubex/mihomo
  2. config.yaml 里开启 allow-lan
  3. 7890 暴露给局域网。
  4. Windows、Linux、手机等客户端把代理地址设置成 宿主机IP:7890

如果只是给局域网电脑提供代理,普通端口映射就够用;如果未来还要做透明代理、TUN、旁路由,再考虑 host 网络、/dev/net/tun、路由表和 DNS 劫持等更复杂的配置。

参考资料: