使用 Clash(mihomo)控制接口前,应把监听、鉴权、传输与界面相关项逐项对齐。外部控制接口通过 RESTful API 管理内核,和代理端口不是同一组字段。漏配、混用或未理解“哪些路径不校验密钥”,都会让后续面板或脚本调用失败,或把接口暴露在未预期的地址上。
适用条件
适用于已经准备配置文件、即将用面板、脚本或内置静态页访问 API 的场景。官方文档将外部控制器定义为:可以用 RESTful API 控制 Clash 内核。若只用本机回环、且调用方不是浏览器跨域页面,重点仍是地址与密钥;一旦涉及 HTTPS、Unix socket、Windows named pipe、外部用户界面,或在 REST 端口上开启 DOH,就必须同时满足对应字段的前置条件。尚未决定调用通道时,不要先改监听范围。
使用前要逐项确认的配置
先确认 API 监听。external-controller 的示例为 127.0.0.1:9090。文档写明可以把 127.0.0.1 改成 0.0.0.0 以监听所有 IP。使用前要能回答:调用方连接的主机和端口,是否就是内核将监听的那一组。仅本机管理时,回环地址通常已足够;只有明确需要其他设备访问 API 时,才考虑监听全部地址,并评估暴露范围。Linux 上还可为监听 socket 设置 external-controller-routing-mark,该项仅支持 Linux。
再确认密钥与“不校验密钥”的例外。secret 是 API 的访问密钥。走 TCP 上的 REST 时,应按文档把它当作访问控制。同时必须记下三条例外:从 Unix socket 访问 API 不会验证 secret;从 Windows named pipe 访问也不会验证 secret;在 RESTful API 端口上开启的 DOH 路径同样不验证 secret。文档对这三类能力都写明:若开启,请自行保证安全。因此使用前要分清调用走的是端口、TLS 端口、套接字、管道还是 DOH 路径,不能默认“填了 secret 就一定会被校验”。
若准备用 HTTPS-API,还要确认 external-controller-tls 与 tls。HTTPS 监听需要配置证书和私钥;使用 TLS 时也必须填写 external-controller。只写 TLS 地址、不写 external-controller,不符合文档要求。证书与私钥可以是 PEM 文本或路径。自指定版本起,当这些字段指向本地文件时支持自动重载,但这不改变“TLS 与明文 API 监听同时存在”的配置关系。
若面板以静态页形式挂在内核上,确认 external-ui。静态资源运行在 Clash API 上,路径为 API 地址加 /ui。路径可以是绝对路径或工作目录相对路径。若路径不在工作目录,需手动设置 SAFE_PATHS 环境变量加入安全路径;该变量语法与操作系统 PATH 相同,Windows 下以分号分割,其他系统以冒号分割。浏览器访问时再核对 external-controller-cors 的 allow-origins 与 allow-private-network,避免页面来源不被接受。
不要把 allow-lan、bind-address、authentication、skip-auth-prefixes 当成控制接口的前置项。文档把它们归在允许局域网与代理用户验证,作用对象是 http(s)/socks/mixed 代理端口,不是 REST 控制接口。
判断依据与失败时下一步
可以按这条链判断是否具备使用条件:面板或脚本将连接的地址端口,是否等于 external-controller(若走 HTTPS 则还要核对其 TLS 端口);secret 是否与当前通道的校验规则一致;TLS 是否同时具备证书、私钥和明文 API 监听;界面路径是否落在工作目录或已进入 SAFE_PATHS;跨域来源是否被允许。Unix socket 与 named pipe 一旦启用,判断重点转向路径权限,而不是密钥是否填写。
核对后仍无法进入可用状态时:先排除把代理端口误当成 API 端口;再检查 HTTPS 是否缺证书或漏写 external-controller;界面无法加载时检查 external-ui 与 SAFE_PATHS。确认无误后再启动或重载内核,避免带着错误监听进入调用阶段。