Skip to content

无需重启的变更 ​

当你编辑入站、添加用户或修改路由时,面板不会向每个受影响的节点发送一份全新的配置并重启它。它会算出该节点应该运行什么,与节点正在运行的内容比较,只发送差异。本页说明这是如何做到的,以及每类变更会给当时已连接的用户带来什么影响。

规则 ​

每个变更都只以该变更本身到达节点:

  1. 实时生效:节点能把它应用到正在运行的内容上时。不会断开任何连接。
  2. 重建单个项目:无法实时生效时。只替换那个入站、出站或端点。
  3. 重启节点的核心:只在其他方式都无法应用变更时。

而且变更永远不会让节点变得比之前更糟:失败的部分会被报告,其余部分照常应用。

哈希:了解节点在运行什么 ​

节点会报告它所运行内容的清单,每个项目都带有一个哈希:

  • 每个出站、端点和隧道半边一个哈希,基于面板发送的精确字节计算;
  • 每个入站两个哈希:一个针对入站本身,一个针对它的用户集合,这样就能区分用户的变更和入站的变更;
  • 基础部分一个哈希:路由、DNS、日志级别、时间同步和节点信任的证书,合在一起计算。

面板构建节点应该运行的内容,并用同样的方式计算哈希。哈希不同的地方,就是变化的项目。哈希相同的项目则不动。空的应答永远不会被当作“相同”:无法判断的节点被视为不同。

哪些变更实时生效 ​

变更如何到达节点
入站的用户:添加、删除、启用、停用、续期、新凭据就地替换该入站的整个用户集合。其他用户的现有连接不受影响。与入站现有集合相同的集合不会改变任何东西。
隧道成员:添加或删除源节点、轮换凭据告知正在运行的半边它的新对端。已建立的链路保持不变;被删除源节点的链路会断开。
路由规则、规则集、最终出站、DNS、日志级别、时间同步、信任的证书作为一次基础更新一起应用。如果中途某一步被拒绝,已经执行的步骤会被撤销。
新的入站、出站或端点添加到正在运行的内容旁边。
删除的项目删除。节点会拒绝删除正在运行的配置仍然需要的内容(例如最终出站);面板会先添加替代项,再重试删除。

当用户被添加、启用、停用或删除时,面板会向该用户涉及的每个节点发送那里每个入站的用户集合。用户的变更永远不会到达其模板之外的节点。

哪些会被重建 ​

有些变更无法应用到正在运行的项目上,这时只重新构建那一个项目:

  • 变更的入站:它的端口、TLS、证书、传输或协议选项。
  • 少数协议的用户,这些协议的用户列表无法就地修改:SOCKS、HTTP、mixed、Naive、Mieru、ShadowTLS 和 WireGuard 会在用户变更时重建该项目。
  • 隧道的形态:它的端口、TLS、传输或负载均衡。

重建的代价比听起来小:

  • 重建的 TCP 入站保留其现有连接。
  • 重建的 QUIC 入站(Hysteria2、TUIC)会通知其客户端,让它们立即重连,而不是等待超时。
  • WireGuard 客户端大约 20 秒后恢复。

节点何时重启 ​

只有当基础部分无法实时应用时,节点才会应答需要重启,并且什么都不应用。面板随后发送完整配置,节点的核心重启。其他所有变更都会避免重启。

没有任何内容在运行的节点也会收到完整配置:刚启动的节点,或刚被重新启用的节点。

一个坏项目不会让节点停下 ​

在做任何改动之前,节点会先解析并构建新配置。只有新配置准备就绪后,正在运行的配置才会停止。

  • 构建失败的项目会被跳过,并附带一条警告。其他一切照常运行。这条警告显示在面板的该节点上,直到之后的某次变更成功应用该项目。
  • 启动失败会回滚到之前运行的配置,节点继续提供该配置的服务。
  • 某个项目上实时变更失败时,会在节点的警告中报告。同一变更的其他项目仍然会被应用。

面板会在保存时检查节点在加载时会拒绝的内容,所以大多数错误都在表单中被发现,不会到达任何节点。

自我修复 ​

变更可能在途中失败:节点短暂无法访问、某一步被拒绝,或两个变更相互交错。面板不会假定变更已经落地:

  1. 每个单独的变更都以完整比较作为后备。 如果添加一个用户失败,面板会把整个节点与它应运行的内容比较,并发送所有差异。
  2. 完整比较以完整推送作为后备,用于节点没有任何内容在运行或无法实时接受基础部分的情况。
  3. 心跳每 15 秒一次,向没有在提供所给配置的节点重新发送配置。节点持续拒绝时,间隔从 30 秒逐步退避到 10 分钟。
  4. 偏差巡检每 10 分钟把每个节点的基础部分(路由、DNS 和规则集)与应有的内容比较,并纠正任何差异。

节点菜单中的 同步 会手动运行同样的比较。

节点上的规则集 ​

面板下载每个规则集,保持其最新,并通过控制链路推送给需要它的每个节点。节点自己从不从互联网获取任何东西。

列表的新版本以新名称的新文件到达,节点在一次基础更新中切换到它。节点正在读取的文件永远不会在它读取时发生变化。旧副本在没有任何地方引用后被删除。节点没有的列表会连同引用它的规则一起被省略,而不是让节点失败。

永远不会发送的内容 ​

  • 会为任何人服务、或不为任何人服务的项目。 空用户列表会造成开放代理(SOCKS、HTTP、mixed)或单一共享密钥服务器(Shadowsocks、Snell)时,没有用户的入站会被省略;没有用户的 OpenVPN 或 OpenConnect 服务器也一样。有了用户后才会发送。
  • 缺少其协议所需凭据的用户。 该用户会从该入站中省略,并在节点上显示一条警告,其他所有用户照常获得服务。
  • 节点与面板:会话、心跳,以及节点在没有面板时做什么。
  • 隧道内部:隧道成员如何实时变更。
  • 节点:节点列表、它的警告以及 同步 操作。

文字与图片采用 CC BY 4.0 许可。