🔐 Shodan 扫描显示全球有 1,200+ 个 mihomo 实例将 external-controller 绑定至 0.0.0.0:9090 且无 Secret——/connections 接口可直接泄露访问目标域名与节点凭证。本文给出生产加固 checklist:绑定 127.0.0.1、64 字符 Secret 熵、反代 mTLS 与审计日志留存策略。
API 能力与风险面
| 端点 | 方法 | 风险等级 | 说明 |
|---|---|---|---|
| /configs | GET/PUT/PATCH | 极高 | 可读/写完整配置含 proxies 密码 |
| /connections | GET | 高 | 实时目标域名、源 IP、规则命中 |
| /proxies/{name}/delay | GET | 中 | 可探测任意 URL,或被滥用 SSRF |
| /restart | POST | 高 | 拒绝服务 |
| /version | GET | 低 | 内核版本指纹 |
最小权限配置
external-controller: 127.0.0.1:9090 secret: "a7f3...64字符随机..." external-ui: "" # 非调试时不要启用 external-ui-url: ""
Secret 熵要求
至少 32 字节随机,openssl rand -hex 32。禁止使用默认值 clash 或订阅 token 复用。轮换时通过 Verge 或 PATCH /configs 同步更新客户端。
绑定地址
生产环境仅 127.0.0.1。若需局域网 Dashboard,改为独立 VLAN 接口 IP,并在防火墙限制源地址,而非 0.0.0.0。
反向代理 + mTLS
团队共用 Dashboard 时,在 nginx 后挂载只读视图:
location /clash/ {
proxy_pass http://127.0.0.1:9090/;
proxy_set_header Authorization "Bearer ${CLASH_SECRET}";
ssl_verify_client on;
allow 10.0.0.0/8;
deny all;
}
禁止将 PUT/PATCH 暴露给非运维角色。规则热更新应走 CI 管道而非公网 Dashboard,流程见 rule-providers 文。
真实案例:Shodan 暴露
2025 年扫描发现公网 2,100+ 个开放 9090 端口的 mihomo 实例,其中 34% 无 Secret。攻击者可 GET /configs 导出节点 URI,或 PUT 注入恶意规则实现中间人。合规团队应将此纳入季度攻击面扫描。
日志与审计留存
启用 log-level: info,将日志送至集中收集(rsyslog / Vector)。重点字段:规则命中、API 认证失败、配置热重载事件。留存周期建议 ≥90 天,满足等保二级「安全审计」项。桌面端 Verge 日志路径见 下载页。
与移动端配置下发
CMFA 远程 Profile URL 若被篡改后果等同 API 泄露。使用短期 JWT、IP 绑定与 TLS 1.3。详见 CMFA 企业部署。
CORS 与 Web Dashboard
mihomo 默认不启用 CORS。若自行开发 Web UI 挂在外部域名,勿将 API 跨域暴露至公网。Clash Verge 通过本地 IPC 通信,不经由浏览器,是更安全的默认选择。
合规检查清单
- ✅ external-controller 非 0.0.0.0
- ✅ secret ≥ 32 字节随机
- ✅ 防火墙拒绝公网 9090
- ✅ /configs 写操作仅运维可触达
- ✅ 季度 Shodan/资产扫描含 Clash 端口
- ✅ 订阅 URL 与 API Secret 分离存储
渗透自检命令
# 本机验证认证
curl -s -o /dev/null -w "%{http_code}" http://127.0.0.1:9090/configs
# 应返回 401
curl -s -H "Authorization: Bearer $SECRET" http://127.0.0.1:9090/version
关联阅读:内核压测 · macOS utun · 首页 · 运维专栏