TL;DR:Mihomo external-controller 是管理接口,不是普通代理端口。默认只监听
127.0.0.1;需要跨设备管理时再开放到局域网,并给secret设置长随机值。
Mihomo 的 dashboard 能切换策略、查看连接、更新 provider,靠的就是 external-controller。这个接口权限很高:如果没有密钥保护,别人拿到接口地址就可能读取运行状态、改策略、刷新配置。安全配置的核心只有三件事:监听范围、secret、外层访问控制。
三种常见场景
| 场景 | 推荐监听 | 是否需要 secret | 说明 |
|---|---|---|---|
| 本机面板 | 127.0.0.1:9090 | 需要 | 最小暴露面 |
| 局域网面板 | 192.168.x.x:9090 | 必须 | 只给内网设备访问 |
| 远程管理 | 本机或内网地址 + 反向代理 | 必须 | 外层再加 HTTPS 和认证 |
不要把 external-controller: 0.0.0.0:9090 当成默认写法。它表示所有网卡都监听,包括公网网卡、Docker 暴露端口和旁路由接口。
基础配置模板
本机使用:
external-controller: 127.0.0.1:9090
secret: "换成一段长随机字符串"
局域网使用:
external-controller: 192.168.1.10:9090
secret: "换成另一段长随机字符串"
dashboard 里填写 API 地址时,要同时填地址和 secret。地址错会连不上;secret 错会出现 401、403 或读取失败。
不要混淆 controller 和代理端口
Mihomo 常见端口有几类:
mixed-port:应用流量入口。socks-port/port:SOCKS 或 HTTP 代理入口。external-controller:管理 API。- dashboard 静态文件:只是网页资源,不等于 API 权限。
面板网页能打开,不代表 controller 安全;controller 能访问,也不代表代理端口正常。排查时要分开看。
验证 secret 是否生效
本机可以这样测:
curl -i http://127.0.0.1:9090/configs
没有带 Authorization 时,应该无法读取敏感接口。再带上 secret:
curl -i -H "Authorization: Bearer 你的secret" http://127.0.0.1:9090/configs
如果不带 secret 也能读取配置,说明你的 controller 没有保护,先停用局域网或远程访问再修配置。
远程访问要加外层认证
如果确实要在外部网络管理 Mihomo,不要直接开放 9090。建议做法:
- controller 仍监听本机或内网地址。
- Nginx、Caddy 或内网穿透入口启用 HTTPS。
- 外层加 Basic Auth、单点登录或访问白名单。
- dashboard 仍使用 Mihomo secret。
这不是重复保护。secret 保护 Mihomo API,外层认证保护入口,两层负责的范围不同。
CORS 与 dashboard 地址
浏览器面板跨域访问 controller 时,可能遇到 CORS。不要为了省事把任意来源全部放开。优先让 dashboard 和 controller 处在同一反向代理域名下;如果必须跨域,只允许你实际使用的 dashboard 来源。
使用配套订阅线路导入配置后,也要检查它有没有覆盖本地 external-controller 和 secret 字段。远程订阅不应该替你决定管理接口暴露范围。
最小安全清单
上线前逐项确认:controller 不监听公网地址;secret 不是空值;远程入口有 HTTPS 和认证;防火墙只放行必要来源;dashboard 地址里没有把 secret 分享给他人。做到这些,面板管理才适合长期使用。