在 Docker 中部署 mihomo,并让本机与局域网电脑接入
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
按规则直连或走代理节点
关键点只有三个:
- mihomo 配置里开启
allow-lan: true。 - mihomo 监听地址使用
bind-address: "*"或宿主机局域网 IP。 - 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
能返回 204、200 或正常 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
如果你的控制面板打不开,先确认三件事:
9090是否映射或暴露出来。external-controller是否是0.0.0.0:9090,而不是127.0.0.1:9090。- 防火墙是否放行了
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。
在云服务器上不建议把 7890、9090 暴露到公网。本文讨论的是家庭或办公室局域网场景。
常见问题 / 排查思路#
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 的核心并不复杂:
- 用 Docker Compose 跑起
metacubex/mihomo。 - 在
config.yaml里开启allow-lan。 - 把
7890暴露给局域网。 - Windows、Linux、手机等客户端把代理地址设置成
宿主机IP:7890。
如果只是给局域网电脑提供代理,普通端口映射就够用;如果未来还要做透明代理、TUN、旁路由,再考虑 host 网络、/dev/net/tun、路由表和 DNS 劫持等更复杂的配置。
参考资料:
- mihomo 官方配置文档:https://wiki.metacubex.one/en/config/general/
- MetaCubeX Dashboard:https://github.com/MetaCubeX/metacubexd
- mihomo Docker 镜像:https://hub.docker.com/r/metacubex/mihomo