API 自动化

网关上的 Clash API:节点自动切换与故障转移

2024年11月20日 约11分钟 网关运维

全屋流量的稳定性取决于节点,而节点会挂。靠人盯着不现实,更好的办法是用 Clash 的 外部控制器 API 做自动化:定时测速、自动切到最优节点、检测到故障自动转移。 这篇文章给出可在路由器上直接跑的脚本。

先开外部控制器

在 Clash 配置里确保 external-controller 已监听(默认 9090 端口),并设置一个 secret。 secret 是 API 的钥匙,不设置的话局域网内任何人都能切你的节点。

external-controller: 0.0.0.0:9090
secret: "your-secret-here"

三个核心接口

接口 用途
GET /proxies 列出所有代理组与节点
GET /proxies/{组名}/delay 批量测延迟,返回每个节点结果
PUT /proxies/{组名} 把组切到指定节点

定时测速并自动切换

下面脚本每 10 分钟测一次「主力组」所有节点延迟,自动选中延迟最低的节点并切换。 用 curl 就能跑,不依赖额外软件,适合丢进路由器 crontab。

#!/bin/sh
# 自动切换到延迟最低的节点
HOST="127.0.0.1:9090"
SECRET="your-secret-here"
GROUP="主力"

BEST=$(curl -s -H "Authorization: Bearer $SECRET" \
  "$HOST/proxies/$GROUP/delay?url=http://www.gstatic.com/generate_204&timeout=3000" \
  | jq -r '.delay | to_entries | map(select(.value != null)) | min_by(.value) | .key')

echo "切到节点: $BEST"
curl -s -X PUT -H "Authorization: Bearer $SECRET" \
  -d "{\"name\":\"$BEST\"}" "$HOST/proxies/$GROUP"

故障自动转移

测速接口返回 null 的节点即视为不可用。故障转移逻辑:如果当前主力节点连续 3 次测速超时, 就把组切到兜底节点并写一条日志;主力恢复后(延迟回到正常范围)再切回来。 建议把检测间隔设为 1–5 分钟,太频繁会在高峰误判。

在路由器上定时运行

# crontab 示例:每 10 分钟跑一次自动切换
*/10 * * * * /etc/clash/auto-select.sh >> /tmp/clash-auto.log 2>&1

注意事项

网关上的 API 只允许内网访问,不要暴露到公网;secret 不要用默认值。 自动切换只改变当前选中节点,不影响订阅与规则。若网关内存紧张, 把 jq 换成 grep/awk 也能实现同样的解析。

相关阅读