本文目录
远程面板不只是看流量,它还连接着能改配置、关连接的控制接口。能打开页面,不代表接口已经安全连通:监听范围、凭据认证和网页来源要分别检查,后者不能代替认证。确认无凭据与错误凭据都被拒绝后,再选择临时隧道或长期远程访问方式。
Dashboard 能修改配置,访问权限怎样限制?
在 external-controller 设置中核对实际监听端口,例如 9090,以及可访问范围。Clash Dashboard 使用该 REST API 读取连接、流量、代理组和规则,也能切换节点、重载配置、修改部分运行设置和关闭连接;直接开放公网的风险远高于只读状态页。
访问场景与推荐入口
| 场景 | 监听方式 | 访问限制 |
|---|---|---|
| 本机客户端自带面板 | 127.0.0.1:9090 | 强 secret,避免任意网页调用本机接口 |
| 家庭 LAN 内管理 | 明确的 LAN 地址或受限监听 | 防火墙只允许管理设备或私有网段 |
| 异地临时维护 | 仍保持本机监听 | SSH 本地转发,也可经 Tailscale 建立该转发 |
| 公网服务 | 不建议直接开放 | 至少应有独立反向代理、TLS、认证与来源限制 |
本机监听与 secret 认证的配置和测试
在最终生效的 Mihomo 配置中,将 external-controller 绑定到 127.0.0.1。图形客户端可能通过“设置 → 外部控制器”或覆写文件生成这个字段,因此修改订阅原文未必会生效;重载后要查看最终配置和实际监听。
REPLACE_WITH_RANDOM_SECRET 只是占位符。使用密码管理器生成长随机值,替换 Mihomo 配置和 Dashboard 连接设置中的值,再重载。不要把示例占位符当密码。
external-controller: 127.0.0.1:9090
secret: "REPLACE_WITH_RANDOM_SECRET"# Windows PowerShell
Get-NetTCPConnection -LocalPort 9090 -State Listen
# Linux / OpenWrt
ss -lntp | grep ':9090'secret 是本文 TCP 控制接口的 Bearer Token。空值不提供这层认证,短口令容易被猜中,多设备复用会扩大泄露影响。不要把完整 token 放入截图、前端仓库或公开故障日志。
# 无 Authorization,应返回未授权,而不是接口数据
curl -i http://127.0.0.1:9090/version
# 错误 token 也必须被拒绝
curl -i -H "Authorization: Bearer WRONG_TOKEN" http://127.0.0.1:9090/version
# 只在自己的终端中替换 REAL_TOKEN
curl -i -H "Authorization: Bearer REAL_TOKEN" http://127.0.0.1:9090/version认证生效的结果
- 无 Authorization 的请求得到 401,而不是版本 JSON
- 正确 secret 能读取 /version
- 错误 secret 也被拒绝
- Dashboard 刷新后能正常显示连接与代理组
- 日志和浏览器地址栏没有暴露 secret
Dashboard 打不开时,不要直接把 CORS 放成任意来源
远程托管的 Dashboard 是一个网页来源,它在浏览器里向 external-controller 发请求。CORS 只限制哪些网页来源可以调用接口,不能替代用户认证。
把 allow-origins 设为 *,再允许私有网络请求,会让任意网页更容易尝试访问本机或局域网控制端口。即使设置了 secret,泄露后可被利用的范围也会更大。
先确认 Dashboard 的实际 origin,例如 https://dashboard.example.com,再只放行这个完整来源。域名、协议或端口变化都会形成不同 origin。配置中的 UI 静态文件路径和 API 监听地址也不是一回事:页面能打开,不代表控制 API 已安全连接。
external-controller-cors:
allow-origins:
- "https://dashboard.example.com"
allow-private-network: false临时远程维护,用 SSH 隧道把 9090 带到本机
如果 Mihomo 运行在家中服务器,可让 external-controller 保持 127.0.0.1:9090,通过 SSH 本地转发把远端回环端口映射到当前电脑。浏览器仍访问自己的 127.0.0.1,公网看不到 9090。
ssh -N -L 19090:127.0.0.1:9090 [email protected]
# Dashboard 后端填写
http://127.0.0.1:19090使用 Tailscale 连接服务器后,仍需通过上述 SSH 转发访问仅监听回环的控制器;接入 tailnet 不会自动开放这个端口。通过 tailnet policy 限制哪些用户或设备能访问主机与转发所需的端口,并保留 secret。
家庭路由器上若必须监听 LAN 地址,防火墙规则只允许管理电脑,不要允许 Guest Wi-Fi 或整个 WAN zone。
- 你的浏览器只从受信设备发起访问
- SSH 转发(可经 VPN 连接)不直接暴露控制端口
- 127.0.0.1:9090external-controller 仅本机监听
- Mihomo使用 secret 校验控制请求
如果必须监听局域网地址,也要同时限制防火墙来源,并保留足够长的 secret。
长期远程访问需要哪些反向代理保护?
只有需要固定域名和长期远程访问时,才值得部署反向代理。Mihomo 的 external-controller 仍监听 127.0.0.1:9090,由同机的 Nginx、Caddy 或其他网关对外提供 HTTPS;公网只开放反向代理端口,不开放 9090。
反向代理至少要有可信 TLS、独立登录或客户端认证、来源限制和访问日志,并正确转发 Dashboard 使用的 WebSocket。Mihomo 的 secret 仍然保留,它和反向代理登录是两层保护,不能互相替代。secret 放在 Dashboard 的连接设置中,不拼进公开 URL。
若 Dashboard 网页与 API 使用不同域名,还要把实际网页 origin 精确加入 CORS。配置完成后,从公网扫描或另一台设备测试:HTTPS 域名可以登录,直接访问服务器公网 IP:9090 应连接失败。
检查控制器认证与未授权网络的访问结果
完整验收
本机看监听
确认端口绑定的是预期地址,进程确实为当前 Mihomo,而不是旧实例。
未授权访问
用 curl 请求 /version,确保缺少或错误 token 都返回 401。
授权访问
打开 Dashboard,切换一个测试策略组并在 Mihomo 中看到相同结果。
从无权限网络测试
从不应有权限的 LAN、Guest Wi-Fi 或公网地址测试,连接应超时或被拒绝。
重启复测
重启 Mihomo 后确认监听地址、secret 和防火墙规则没有被客户端覆写。
如果怀疑控制器曾经暴露,先收紧监听和防火墙,再轮换 secret。随后检查端口映射、云安全组、反向代理访问日志和配置仓库历史;只改 Dashboard 密码不能让已经泄露的 Bearer Token 失效。
