安全与隐私 · Clash 技术博客

Clash Dashboard 怎么安全远程访问?

Dashboard 实际连接的是可以切换节点、改配置和关闭连接的控制接口。需要远程使用时,应先限制监听地址并设置 secret,再通过内网或隧道访问。

  • 安全
  • Dashboard
  • secret
本文目录

Clash Dashboard 要远程访问,先把它当成管理入口保护

Clash Dashboard 通过 external-controller 提供的 REST API 读取连接、流量、代理组和规则。这个接口还能切换节点、重新加载配置、修改部分运行设置和关闭连接,所以把 9090 端口直接暴露到公网,风险远高于公开一张只读状态页。

先回答谁需要访问:只在本机使用,就只监听回环地址;同一局域网偶尔查看,也应限制来源、设置 secret 并加防火墙;需要远程管理时,用 SSH 隧道或受控的 Tailscale 网络转发,不应把 0.0.0.0:9090 直接映射到公网。

访问场景与推荐入口

场景监听方式访问限制
本机客户端自带面板127.0.0.1:9090强 secret,避免任意网页调用本机接口
家庭 LAN 内管理明确的 LAN 地址或受限监听防火墙只允许管理设备或私有网段
异地临时维护仍保持本机监听SSH 本地转发或经过 Tailscale 后访问
公网服务不建议直接开放至少应有独立反向代理、TLS、认证与来源限制

不需要跨设备访问时,把监听地址收回本机

在最终生效的 Mihomo 配置中,将 external-controller 绑定到 127.0.0.1。图形客户端可能通过“设置 → 外部控制器”或覆写文件生成这个字段,因此修改订阅原文未必会生效;重载后要查看最终配置和实际监听。

下面的 REPLACE_WITH_RANDOM_SECRET 只是占位符。先用密码管理器生成一段长随机值,把配置和 Dashboard 连接设置中的值同时替换,再重载 Mihomo。不要把占位符原样当密码。

只供本机 Dashboard 使用的起点
external-controller: 127.0.0.1:9090
secret: "REPLACE_WITH_RANDOM_SECRET"
确认谁在监听 9090
# Windows PowerShell
Get-NetTCPConnection -LocalPort 9090 -State Listen

# Linux / OpenWrt
ss -lntp | grep ':9090'

设置 secret 后,要验证未认证请求确实被拒绝

secret 是外部控制器的 Bearer Token。空值、短口令或在多台设备长期复用,都等于把管理权限交给能访问端口的人。生成随机值后,把它分别填进 Mihomo 配置和 Dashboard 的后端地址设置;不要把完整 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 已安全连接。

把示例域名替换成真实 Dashboard 来源
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。

示例:将远端控制器映射到本机 19090
ssh -N -L 19090:127.0.0.1:9090 [email protected]

# Dashboard 后端填写
http://127.0.0.1:19090

使用 Tailscale 时也不要默认整个 tailnet 都是管理员。通过 tailnet policy 限制哪些用户或设备能访问主机与端口,再保留 secret。家庭路由器上若必须监听 LAN 地址,防火墙规则只允许管理电脑,不要允许 Guest Wi-Fi 或整个 WAN zone。

远程管理面板的安全访问路径
  1. 你的浏览器只从受信设备发起访问
  2. SSH 隧道或 VPN不直接暴露控制端口
  3. 127.0.0.1:9090external-controller 仅本机监听
  4. Mihomo使用 secret 校验控制请求

如果必须监听局域网地址,也要同时限制防火墙来源,并保留足够长的 secret。

需要长期访问时,再在 9090 前增加反向代理

只有需要固定域名和长期远程访问时,才值得部署反向代理。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 应连接失败。

长期远程入口应满足

  • external-controller 仍只监听 127.0.0.1
  • 公网没有 9090 端口映射
  • 反向代理强制 HTTPS 并有独立认证
  • WebSocket 日志和流量页面可正常更新
  • Mihomo secret 仍验证成功
  • 未授权来源无法访问

从服务器本机和另一台设备各测一次

完整验收

  1. 本机看监听

    确认端口绑定的是预期地址,进程确实为当前 Mihomo,而不是旧实例。

  2. 未授权访问

    用 curl 请求 /version,确保缺少或错误 token 都返回 401。

  3. 授权访问

    打开 Dashboard,切换一个测试策略组并在 Mihomo 中看到相同结果。

  4. 从无权限网络测试

    从不应有权限的 LAN、Guest Wi-Fi 或公网地址测试,连接应超时或被拒绝。

  5. 重启复测

    重启 Mihomo 后确认监听地址、secret 和防火墙规则没有被客户端覆写。

如果怀疑控制器曾经暴露,先收紧监听和防火墙,再轮换 secret。随后检查端口映射、云安全组、反向代理访问日志和配置仓库历史;只改 Dashboard 密码不能让已经泄露的 Bearer Token 失效。

参考资料