1 外部控制器:给面板与脚本用的「管理口」
在 Clash 系内核里,external-controller 用来指定 REST API 监听的 IP 与端口。启用后,兼容的控制台(例如 Yacd、Yacd-meta)、自写脚本或自动化工具可以通过 HTTP 请求读取当前配置、切换 策略组选中的节点、查看实时连接等。对桌面图形客户端(如 Clash Verge Rev)而言,内置界面往往已经封装了同类能力;而当你使用纯命令行或路由器/服务器上只跑核心、没有常驻 GUI 时,Web 面板就成了最省事的可视化入口。
与「代理流量走的混合口/透明代理」不同,external-controller 只服务管理面:它不负责转发用户上网流量,但能改运行态策略。因此一旦端口暴露在不可信网络且缺少鉴权,他人可能切换你的出口、窥探连接摘要,甚至在部分场景下结合其他配置造成更大影响——下文会反复强调:绑定地址、secret 与网络边界要一起设计,而不是只改一个开关。
若你尚未在本机或 VPS 上跑过 Mihomo,可先对照《Linux 安装 Mihomo 并开机自启:systemd 服务与最小 YAML 配置》完成最小可启动配置,再回到本文把 external-controller 与 secret 配齐。
2 在配置里写 external-controller 与 secret
在根配置(或经客户端合并后的最终 YAML)中,常见写法如下。端口可按需修改,只要不与系统其他服务冲突即可;secret 为访问 API 时使用的口令,面板与脚本会在请求头里携带(与 Clash 约定一致)。
# REST API(Yacd / 脚本 / 其他控制台)
external-controller: 127.0.0.1:9090
secret: "请替换为足够长的随机字符串"
# 若需同时从局域网其他设备访问 API,可改为监听网卡地址或 0.0.0.0,
# 但必须配合防火墙与强 secret,切勿对公网裸奔。
# external-controller: 0.0.0.0:9090
为何默认绑在 127.0.0.1
127.0.0.1 表示仅本机回环可连:同一台电脑上的浏览器打开 Yacd、或本机脚本访问 http://127.0.0.1:9090 没问题,但局域网里另一台手机或电脑默认连不上。这是最安全的基础缺省:先把管理口关在本机,再按需要逐步放开,而不是一上来就监听 0.0.0.0。
secret 应满足什么强度
secret 应视为与登录密码同级的机密:足够长、不可预测,避免使用默认的 "" 或常见弱口令。修改 secret 后需重载配置或重启核心,并在 Yacd 里同步更新填写的密钥,否则会出现 401 未授权。若你使用图形客户端,部分版本会在 UI 里单独展示或覆盖 API 相关项,请以实际生效的运行配置为准。
3 使用 Yacd Web 面板连接 Mihomo
Yacd(Yet Another Clash Dashboard)是广为人知的开源 Web 面板,静态资源可托管在本地或 CDN。使用流程通常是:打开面板页面,在设置里填写 API Base URL(例如 http://127.0.0.1:9090),并填入与配置中一致的 secret。保存后,面板会通过浏览器向该地址发起请求,展示策略组、节点列表与当前连接等信息;你可以在界面上点击切换节点,效果与在客户端里改选组等价。
若你使用面向 Meta 内核的分支(名称常含 meta),其交互与 API 路径在多数场景下仍与 Clash 习惯兼容;若遇版本差异,以当前 Mihomo 文档与面板发布说明为准。策略组类型(如 select、url-test)的含义与调优思路,可延伸阅读《Clash URL-Test 与 Fallback:测速选节点与故障转移》,便于在面板里理解各组行为。
浏览器跨域与 HTTPS 混合内容
当你从互联网上的 HTTPS 页面访问本机 HTTP API 时,浏览器可能因混合内容或CORS 策略拦截请求。常见处理方式包括:在本机打开面板静态页、使用浏览器扩展或本地服务同域代理、以及用 SSH 端口转发把远程 9090 映到本机再访问。不要为满足面板访问而随意把 API 暴露到公网;优先收敛到可信通道内再操作。
curl 探测(需带鉴权头,具体路径以 Mihomo 文档为准)。若连 curl 都连不上,应先检查核心是否运行、端口是否被占用、以及 YAML 是否已重载。
4 局域网内其他设备访问:绑定、防火墙与 Allow LAN
若你希望同一 Wi-Fi 下的手机或另一台电脑用浏览器打开 Yacd 并管理运行在某台 PC 或 NAS 上的 Mihomo,需要同时满足几件事:① external-controller 监听地址不能仅限 127.0.0.1,应改为局域网 IP(例如 192.168.1.10:9090)或 0.0.0.0:9090(表示所有网卡);② 操作系统或路由器防火墙放行该端口,且建议限制源地址为家庭网段;③ 若要让其他设备使用该机提供的代理端口,还需关注 allow-lan 与混合口监听方式——这与「仅管理 API」不同,但常被同一批用户同时开启。
远程(跨公网)场景下,不建议直接把 9090 映射到公网 IP。更稳妥的做法包括:先连入家庭 VPN 或WireGuard 再访问局域网地址;使用 SSH -L 本地转发把远端 API 转到本机 127.0.0.1;或在自管服务器上用 Nginx/Caddy 做HTTPS 终止、加HTTP 基本认证或 mTLS,仅对可信客户端开放。每一种都比「公网裸端口 + 弱 secret」更可控。
5 降低面板被他人访问的风险:清单式加固
- 默认本机:无特殊需求时保持
external-controller绑定127.0.0.1,把管理操作限制在本机用户会话内。 - 强 secret:使用足够长的随机字符串,定期轮换;修改后同步更新所有使用该 API 的面板与脚本。
- 最小暴露面:必须对局域网开放时,在防火墙中限制源 IP 或网段,避免
0.0.0.0/0。 - 分层的管理通道:远程优先 SSH 隧道或 VPN,而不是把控制端口直接暴露到互联网。
- 反向代理与 TLS:在服务器场景用 HTTPS 与访问控制保护管理入口,避免明文口令在公共网络中传输。
- 意识层面:API 能改策略与查看连接摘要,应像 root 密码一样保管;不要在截图、录屏或公开仓库中泄露完整配置。
这些措施与「代理上网流量」的安全是两条线:即便你的节点与规则很讲究,一个敞开且未鉴权的 external-controller 仍可能让局域网内的恶意设备或误配置的端口转发带来风险。把管理面锁好,与写好 secret 同等重要。
6 常见问题
- 面板提示 401 或未授权:核对 YAML 中的
secret与面板填写是否完全一致;确认已重载配置;检查是否有多份配置被客户端覆盖。 - 本机可连、他机连不上:检查监听地址是否为
127.0.0.1;若已改为局域网或0.0.0.0,继续查系统防火墙、路由器 AP 隔离与 IP 是否在同一网段。 - 能打开面板但无数据或跨域报错:多为浏览器安全策略;改在本机打开面板静态资源,或使用 SSH 转发到本机再访问。
- 端口已被占用:更换
external-controller端口并同步修改 Yacd 中的 API 地址。
7 总结
Mihomo 的 external-controller 让你能用标准 REST API 管理内核;配合 Yacd 等 Web 面板,可以在浏览器里直观完成策略组与节点切换。配置时请务必写好 secret、谨慎选择监听地址,并在局域网或远程场景下叠加防火墙与可信通道,避免管理接口被无关设备访问。
相比仅依赖桌面客户端,这种组合特别适合无 GUI 的服务器、长期开机的家庭 NAS,以及希望用大屏浏览器快速看一眼连接与组状态的用户。若你更习惯带图形界面的一体化体验,也可从本站下载页获取各平台客户端,与命令行或 Web 方案互为补充;图形端通常在内置了相似能力的同时,把订阅与系统代理入口打包得更省心。
最后提醒:Web 面板解决的是「怎么管」;节点质量、规则分流与 DNS 仍决定「好不好用」。把 external-controller 当作高权限管理口来防护,你的远程换节点体验才能在方便与安全之间取得稳妥平衡。