secret密钥的作用与配置方式
secret是API访问的身份验证凭证
Clash VPN外部控制器(External Controller)的secret字段是一个可选的认证密钥,用于验证访问API的请求是否具有合法权限。当secret被设置后,所有向API端点发起的请求都需要在HTTP头中包含Authorization: Bearer <secret值>才能成功执行。该机制通过简单的密钥认证保护API免受未授权访问,防止攻击者通过API获取Clash的运行状态、修改代理配置或切换节点。secret的配置在config.yaml中的secret: "your-password"字段完成。
secret的配置位置与格式
secret字段与external-controller位于config.yaml的同一层级,格式为secret: "your-strong-password"。配置示例为external-controller: 127.0.0.1:9090和secret: "mySecurePassword2024",两者配合使用。配置完成后需重启Clash内核使修改生效。secret推荐使用包含大小写字母、数字和特殊字符的强密码,避免使用123456、admin等简单密码。若secret留空或不配置该字段,API无需认证即可访问,任何能连接到API端口的人都能执行管理操作。
设置secret后的API调用方式
配置secret后,所有API调用都需在请求头中添加认证信息才能成功。使用curl命令时添加-H "Authorization: Bearer your-password"参数,例如curl -H "Authorization: Bearer mypass" http://127.0.0.1:9090/proxies。在Web Dashboard面板(如YACD)中,登录时需要在设置页面填入API地址和secret密钥,面板会在后续请求中自动添加认证头。若请求未携带正确的secret,API会返回401 Unauthorized状态码,拒绝访问。
不设置secret的安全风险
未授权访问导致节点信息泄露
当secret未设置时,任何能访问Clash API端口(默认9090)的人均可通过GET /proxies接口获取完整的节点列表和策略组信息。这些信息包括节点名称、服务器地址、端口、加密方式等敏感配置,若API暴露在局域网或公网中,这些信息可能被外部人员获取。攻击者可利用这些信息了解用户的代理网络结构,或识别可攻击的目标节点。
攻击者可通过API修改代理配置
未设置secret的API允许任意请求执行PUT /config重新加载配置,或通过PUT /proxies/:name切换节点,攻击者可借此干扰用户的代理服务。攻击者可将用户的代理切换至不可用节点导致网络中断,或切换至恶意节点实施中间人攻击。若攻击者能访问PUT /config端点,还可能上传恶意配置文件完全控制Clash的行为,包括将所有流量重定向至攻击者控制的服务器。
Dashboard面板被他人操控的风险
在同一局域网环境中,若其他设备能访问本机的9090端口且未设置secret,这些设备上的浏览器可通过Dashboard面板直接操控本机的Clash。他人可随意切换节点、查看浏览记录对应的目标地址、关闭当前连接或修改代理模式,严重影响用户隐私和网络稳定性。在公共网络或多人共享的家庭网络中,这一风险尤为突出。
不同使用场景下的安全性分析
仅本机访问时的安全评估
当external-controller监听127.0.0.1:9090时,API仅允许本机访问,外部设备无法连接。在此场景下,不设置secret的安全风险相对较低,因为只有本机用户和运行在本机的程序能访问API。但本机上的其他用户账户或恶意软件仍可访问API,若电脑存在多用户登录或安全风险,设置secret仍有必要。多数桌面用户在127.0.0.1模式下不设置secret也可正常使用,但建议养成良好的安全习惯。
局域网或公网暴露时的严重风险
当external-controller监听0.0.0.0:9090允许局域网访问,或通过端口转发暴露在公网时,不设置secret存在严重安全隐患。任何能访问该端口的设备和人员均可完全控制Clash,获取所有节点信息、查看实时连接记录、切换节点等。在公网暴露的情况下,攻击者扫描到9090端口后可通过简单请求确认Clash API的存在,并执行未授权操作。此种配置下必须设置强secret,否则应避免将API暴露在公网。
容器环境中的安全考量
在Docker或Kubernetes容器中运行Clash时,若将9090端口映射到宿主机,且external-controller设为0.0.0.0,同样存在API暴露风险。容器环境中的API可能被同一宿主机上的其他容器访问,或被集群内其他服务调用。建议在容器部署时设置secret,并仅在需要外部管理时才映射端口。若仅需本地管理,可将端口映射绑定到127.0.0.1而非0.0.0.0,例如-p 127.0.0.1:9090:9090,限制仅本机访问。
secret密钥的最佳实践
使用强密码作为secret值
secret的强度直接影响API的安全性,应使用包含大小写字母、数字和特殊字符的长字符串作为密钥。推荐使用密码生成器创建16位以上的随机字符串,如kL8#mP2$qR9@nS5!,避免使用admin、password、123456等常见弱密码。强secret可有效抵御暴力破解攻击,确保API认证机制的有效性。定期更换secret也是良好的安全习惯。
定期更换secret避免长期泄露
secret密钥与API访问权限绑定,若密钥长期使用且未更换,一旦泄露将导致攻击者长期持有Clash的控制权。建议每隔3-6个月更换一次secret,或在发现API可能被异常访问时立即更换。更换secret后需同步更新所有使用该API的工具和Dashboard面板的密钥配置,否则它们将无法连接API。定期更换密钥可在泄露后限制攻击窗口。
不同环境使用不同secret
在开发环境、测试环境、生产环境或多台Clash设备之间,应使用不同的secret值。同一密钥在多环境中复用会放大泄露后的影响范围,攻击者获得一个secret即可控制所有使用该密钥的Clash实例。为每个环境分配独立的secret可隔离风险,确保某个环境的泄露不会波及其他环境。记录各环境的secret值并妥善保管。
不设置secret的替代保护方案
使用防火墙限制API访问来源
若不设置secret,可通过防火墙规则限制API端口的访问来源,仅允许信任的IP地址连接。在Linux中使用iptables配置iptables -A INPUT -p tcp --dport 9090 -s 127.0.0.1 -j ACCEPT和iptables -A INPUT -p tcp --dport 9090 -j DROP仅允许本机访问。在Windows防火墙中可创建入站规则,仅允许特定的IP地址或子网访问9090端口。防火墙方案可有效防止未授权的网络访问,但无法防御本机恶意程序。
更改external-controller的默认端口
将external-controller端口从默认的9090改为其他端口,可减少被扫描和发现的风险。配置示例为external-controller: 127.0.0.1:9876,将端口改为9876。改端口虽然不能作为唯一安全措施,但可降低自动化扫描工具发现API的概率,减少被盲目探测的风险。建议将改端口与secret设置或防火墙限制结合使用。
仅本地监听不对外开放
若不需要远程管理Clash,将external-controller的监听地址固定为127.0.0.1,不让API暴露在局域网或公网。配置示例为external-controller: 127.0.0.1:9090,外部设备无法连接该端口。在此配置下,不设置secret的风险大幅降低,但仍需考虑本机其他用户或恶意程序的访问风险。仅本地监听是最安全的部署方式,适合大多数桌面用户。
常见问题FAQ
不设置secret会有什么安全风险?
不设置secret时,任何能访问Clash API端口的人员均可通过API获取节点列表、切换代理节点、查看实时连接、重新加载配置等。若API暴露在局域网或公网,攻击者可完全控制Clash,获取敏感信息或干扰代理服务。建议在配置文件中设置强secret保护API安全。
设置secret后Dashboard连接不上怎么办?
设置secret后,Dashboard登录时需要填入正确的密钥才能连接。检查Dashboard设置中的密钥字段是否与config.yaml中的secret值完全一致(包括大小写和特殊字符)。若使用YACD面板,在设置页面的“Secret”输入框中填入密钥即可。若忘记密钥,可在config.yaml中查看或重新设置后重启Clash。
API端口暴露在公网但不设secret有多大风险?
secret并使用防火墙限制访问来源IP。本机使用时不设secret是否安全?
在external-controller监听127.0.0.1:9090时,仅本机用户能访问API,外部网络无法连接。此场景下不设secret的风险较低,但本机上的其他用户账户或恶意软件仍可能访问API。若电脑存在多用户登录或安全风险,建议设置secret。多数桌面用户在仅本机使用时可省略secret,但配置secret可提供额外的安全保护。
