无需重启的变更
当你编辑入站、添加用户或修改路由时,面板不会向每个受影响的节点发送一份全新的配置并重启它。它会算出该节点应该运行什么,与节点正在运行的内容比较,只发送差异。本页说明这是如何做到的,以及每类变更会给当时已连接的用户带来什么影响。
规则
每个变更都只以该变更本身到达节点:
- 实时生效:节点能把它应用到正在运行的内容上时。不会断开任何连接。
- 重建单个项目:无法实时生效时。只替换那个入站、出站或端点。
- 重启节点的核心:只在其他方式都无法应用变更时。
而且变更永远不会让节点变得比之前更糟:失败的部分会被报告,其余部分照常应用。
哈希:了解节点在运行什么
节点会报告它所运行内容的清单,每个项目都带有一个哈希:
- 每个出站、端点和隧道半边一个哈希,基于面板发送的精确字节计算;
- 每个入站两个哈希:一个针对入站本身,一个针对它的用户集合,这样就能区分用户的变更和入站的变更;
- 基础部分一个哈希:路由、DNS、日志级别、时间同步和节点信任的证书,合在一起计算。
面板构建节点应该运行的内容,并用同样的方式计算哈希。哈希不同的地方,就是变化的项目。哈希相同的项目则不动。空的应答永远不会被当作“相同”:无法判断的节点被视为不同。
哪些变更实时生效
| 变更 | 如何到达节点 |
|---|---|
| 入站的用户:添加、删除、启用、停用、续期、新凭据 | 就地替换该入站的整个用户集合。其他用户的现有连接不受影响。与入站现有集合相同的集合不会改变任何东西。 |
| 隧道成员:添加或删除源节点、轮换凭据 | 告知正在运行的半边它的新对端。已建立的链路保持不变;被删除源节点的链路会断开。 |
| 路由规则、规则集、最终出站、DNS、日志级别、时间同步、信任的证书 | 作为一次基础更新一起应用。如果中途某一步被拒绝,已经执行的步骤会被撤销。 |
| 新的入站、出站或端点 | 添加到正在运行的内容旁边。 |
| 删除的项目 | 删除。节点会拒绝删除正在运行的配置仍然需要的内容(例如最终出站);面板会先添加替代项,再重试删除。 |
当用户被添加、启用、停用或删除时,面板会向该用户涉及的每个节点发送那里每个入站的用户集合。用户的变更永远不会到达其模板之外的节点。
哪些会被重建
有些变更无法应用到正在运行的项目上,这时只重新构建那一个项目:
- 变更的入站:它的端口、TLS、证书、传输或协议选项。
- 少数协议的用户,这些协议的用户列表无法就地修改:SOCKS、HTTP、mixed、Naive、Mieru、ShadowTLS 和 WireGuard 会在用户变更时重建该项目。
- 隧道的形态:它的端口、TLS、传输或负载均衡。
重建的代价比听起来小:
- 重建的 TCP 入站保留其现有连接。
- 重建的 QUIC 入站(Hysteria2、TUIC)会通知其客户端,让它们立即重连,而不是等待超时。
- WireGuard 客户端大约 20 秒后恢复。
节点何时重启
只有当基础部分无法实时应用时,节点才会应答需要重启,并且什么都不应用。面板随后发送完整配置,节点的核心重启。其他所有变更都会避免重启。
没有任何内容在运行的节点也会收到完整配置:刚启动的节点,或刚被重新启用的节点。
一个坏项目不会让节点停下
在做任何改动之前,节点会先解析并构建新配置。只有新配置准备就绪后,正在运行的配置才会停止。
- 构建失败的项目会被跳过,并附带一条警告。其他一切照常运行。这条警告显示在面板的该节点上,直到之后的某次变更成功应用该项目。
- 启动失败会回滚到之前运行的配置,节点继续提供该配置的服务。
- 某个项目上实时变更失败时,会在节点的警告中报告。同一变更的其他项目仍然会被应用。
面板会在保存时检查节点在加载时会拒绝的内容,所以大多数错误都在表单中被发现,不会到达任何节点。
自我修复
变更可能在途中失败:节点短暂无法访问、某一步被拒绝,或两个变更相互交错。面板不会假定变更已经落地:
- 每个单独的变更都以完整比较作为后备。 如果添加一个用户失败,面板会把整个节点与它应运行的内容比较,并发送所有差异。
- 完整比较以完整推送作为后备,用于节点没有任何内容在运行或无法实时接受基础部分的情况。
- 心跳每 15 秒一次,向没有在提供所给配置的节点重新发送配置。节点持续拒绝时,间隔从 30 秒逐步退避到 10 分钟。
- 偏差巡检每 10 分钟把每个节点的基础部分(路由、DNS 和规则集)与应有的内容比较,并纠正任何差异。
节点菜单中的 同步 会手动运行同样的比较。
节点上的规则集
面板下载每个规则集,保持其最新,并通过控制链路推送给需要它的每个节点。节点自己从不从互联网获取任何东西。
列表的新版本以新名称的新文件到达,节点在一次基础更新中切换到它。节点正在读取的文件永远不会在它读取时发生变化。旧副本在没有任何地方引用后被删除。节点没有的列表会连同引用它的规则一起被省略,而不是让节点失败。
永远不会发送的内容
- 会为任何人服务、或不为任何人服务的项目。 空用户列表会造成开放代理(SOCKS、HTTP、mixed)或单一共享密钥服务器(Shadowsocks、Snell)时,没有用户的入站会被省略;没有用户的 OpenVPN 或 OpenConnect 服务器也一样。有了用户后才会发送。
- 缺少其协议所需凭据的用户。 该用户会从该入站中省略,并在节点上显示一条警告,其他所有用户照常获得服务。
