Skip to content
RachelMisakaPublic

About

A Decentralized, High-Resilience Self-Organizing Communication Topology

Resources

Stars

0 stars

Watchers

0 watching

Forks

Latest commit

 

History

5 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 

Repository files navigation

SlimeNet:一种去中心化高容灾自组网通信拓扑

English

技术白皮书(设计原理与实现路径)

御坂瑞秋 2026/08/28

设计者声明:本系统设计灵感源于对"互联网基础设施大规模失效场景下通信重建"的可行性思考。所有核心机制均基于标准化网络协议(如 IS-IS、OSPFv3、NDP、SRv6)构建,不依赖任何专有硬件或未公开技术,具备理论上的可落地性与工程上的可复现性。


一、设计背景与目标

1.1 问题定义

在互联网基础设施因自然灾害、人为破坏或系统故障而大规模失效的场景下,传统依赖中心化核心路由器、公网 DNS 和 DHCP 服务器的网络架构将全面瘫痪。本研究旨在设计一种不依赖任何中心节点、不依赖互联网基础设施、具备自动发现与自愈能力的本地组网拓扑。

1.2 设计目标

目标 说明
去中心化 无任何单点故障(No Single Point of Failure),任意节点损毁不影响全局存活
高容灾 物理链路断裂时自动重构,网络"缩而不崩"
即插即用 在 CA/信任锚已预置或网络物理可控的受信环境下,新设备接入无需人工配置,通过广播自动融入本层拓扑(非受信场景走 4.5 两阶段信任准入;三档运行层级见 4.13)
低开销 每个节点仅存储本层全量拓扑与上级下发的汇总路由,下级明细绝不向上传播,不对全局网络负责
高兼容 对传统的 IPv4 设备和无法成为标准节点的设备提供兼容性接入(见 3.6 兼容层)

1.3 核心设计哲学

  1. 用层级封装对抗复杂度——每层只产生本层汇总路由并向下广播,下级明细绝不上行,将指数级的路由表增长控制为线性。
  2. 用分布式智能对抗中心依赖——每节点独立拥有本层拓扑地图,自行决策转发路径,无需中央指挥。
  3. 用广播发现对抗人工配置——受信环境下设备接入即通过 L2 广播融入网络,实现零配置自动组网(非受信场景需经 4.5 两阶段信任准入)。
  4. 用可信转发对抗恶意接入——"只通过可信节点通信"的约束落地到转发面,未验证节点可被看见但永不被信任。

二、网络架构与编址

2.1 分层封装架构(Layered Encapsulation Architecture)

系统采用严格的层级化编址与路由聚合策略,将整个网络从物理设备到全局骨干划分为四个层级:

层级 组成单元 IPv6 前缀示例 对外表现示例
终端层 电脑、手机、传感器等接入设备 fd0c:3632:1fd:100:1:1::/64 获取本楼栋子网地址
楼栋层 边缘节点(东窗/西窗节点) fd0c:3632:1fd:100:1::/60 对外打成一个 /60 汇总路由
区域层 边界路由器(BR)与组织/集群 fd0c:3632:1fd:100::/56 对外打成一个 /56 汇总路由
骨干层 区域边界互联链路 fd0c:3632:1fd::/48(ULA) 仅交换汇总路由,不感知内部拓扑细节

设计哲学:链路状态遵循 "逐级汇总、单向下行"——每一层只产生本层的汇总路由并向下广播,下级明细绝不向上传播;节点出向寻址完全依赖上级下发的聚合路由。绝无内部微观细节上行(子网震荡、节点增减),从而实现"故障爆炸半径控制"与"路由表规模可控"。

2.2 IPv6 地址规划

系统基于 RFC 4193(ULA,唯一本地地址) 定义站点本地地址空间,确保在无公网 ISP 前缀的情况下依然具备完整可用的编址能力:

层级 前缀分配(示例) 可用子网数量 用途说明
全局站点 fd0c:3632:1fd::/48 1 个全局站点 整个自组网的根前缀
区域级 /56(从 /48 划分) 256 个区域 每个区域(一个组织/集群)分配一个 /56
楼栋/子网级 /60(从 /56 划分) 16 个楼栋/子网 每栋楼或每个 VLAN 分配一个 /60
终端设备级 /64(从 /60 划分) 1 个子网 每个物理网段必须使用 /64 以支持 SLAAC

地址分配示意:

全局 ULA 前缀:fd0c:3632:1fd::/48
│
├── 区域 A(/56):fd0c:3632:1fd:100::/56
│   ├── A1 楼(/60):fd0c:3632:1fd:100:1::/60
│   │   ├── 用户子网:fd0c:3632:1fd:100:1:1::/64
│   │   └── 互联链路:fd0c:3632:1fd:100:1:ff::/64
│   └── A2 楼(/60):fd0c:3632:1fd:100:2::/60
│       └── ...
│
├── 区域 B(/56):fd0c:3632:1fd:200::/56
│   ├── B1 楼(/60):fd0c:3632:1fd:200:1::/60
│   └── ...
│
└── 区域互联链路池:fd0c:3632:1fd:fff::/64(点对点 /127)

注:若未来需要对接公网 ISP 前缀(如联通的 2408::/60),可在边界路由器上配置 NPTv6(无状态前缀转换),实现 ULA 与公网前缀之间的一对一映射,无需重新编址。

2.3 故障隔离与爆炸半径控制(Fault Isolation)

这是系统高容灾能力的核心保障:

故障类型 影响范围 上层是否感知
某终端设备离线 仅本子网 /64 否
某楼栋边缘节点宕机 仅本楼栋内部 /60 否(上层仅感知该楼栋汇总路由的变化,不感知内部细节)
某区域边界路由器(BR)宕机 仅本区域 /56 内部 否(上层仅丢失一条汇总路由)

原理:由于下级明细绝不向上传播,每一层只感知本层细节与上级下发的汇总路由,内部的微观震荡被完全隔离在本层边界内,不会引发全网路由抖动。

2.4 节点路由任务分层模型

本系统的核心设计理念之一,是将路由智能分布在每一个节点上,而非集中由核心设备承担。每个节点根据自身在网络中的层级位置,同时维护多级拓扑视图。这些视图呈金字塔结构,由底层细节向上逐级抽象,共同支撑节点的独立转发决策。

(一)分层拓扑认知模型

以网络结构 [[[A],[B]],[C],[D]] 为例(其中 A、B 为底层楼栋子网,[A,B] 构成一个逻辑集群/区域,C、D 为该集群的平级对等区域),处于最内层的 A 内部任一节点承载以下三级拓扑:

第一级:微观拓扑(A 内部全量拓扑)

节点通过链路层广播(如 IS-IS L1 Hello 或 LLDP)感知 A 内所有的边缘节点、终端设备及其直连链路状态。此级地图包含 A 内部所有 /64 子网的明细信息,负责本楼栋/本子网内的毫秒级通信与即时故障检测。节点基于该层数据独立计算发往 A 内部任意目的地的最优路径,无需任何中间节点协助解析。

第二级:中观拓扑([A, B] 集群拓扑)

节点通过本集群边界路由器(BR)周期性下发的汇总链路状态协议数据单元(LSP),感知 A 与 B 共同组成的逻辑集群结构。在此视图中,A 和 B 被呈现为两个相互连接的对等子单元——节点不感知 B 内部的终端明细(B 的 /64 子网被聚合隐藏),但完整掌握 A-B 间的互联链路状态(如"A-东窗 ↔ B-西窗")以及本集群的整体拓扑。该级地图支撑节点在向外转发时的独立决策:数据包是应留在 A 内部,还是跨越边界送往 B,全部由节点本地查表判定,无需向上级发起路由询问。

第三级:宏观拓扑([A,B], C, D 根级拓扑)

节点通过顶层骨干路由器下发的聚合路由,感知整个网络的根级拓扑结构。在此视图中,整个 [A,B] 集群被虚拟压缩为一个逻辑上的单一节点(路由汇总实体),与 C、D 并列呈三节点互联状。节点不感知 C、D 的内部细节,但完整保存根级三节点间的链路状态与开销度量(Metric)。基于该级地图,节点自主计算出顶层转发方向:若目的地址不在 A 内部,节点只需判断应发往本集群的哪个出口以到达 C 或 D,从而将数据包精准交付给对应的边界路由器。

(二)三级视图的协同决策机制

上述三级拓扑并非孤立运行,而是构成 "由近及远、逐级聚合" 的决策链条。当节点收到一个目标地址时,其路由查找逻辑如下:

  1. 查微观:目标是否在 A 内部?若是,直接按第一级地图精确转发。
  2. 查中观:目标是否在 B 内(即本集群内但跨子网)?若是,按第二级地图转发至连接 B 的边界接口。
  3. 查宏观:目标在 C 或 D 中?按第三级地图转发至本集群的顶层出口。

核心优势:这套模型使得 A 内的每一台非核心设备也具备完整的层级路由智能——它既不需要存储全网的海量明细数据(C 和 D 的内部 /64 对其完全透明),也绝不依赖任何中心控制器下发流表。仅凭本地维护的三层拓扑数据库,节点即可独立完成从"楼内寻址"到"跨域出局"的全部转发决策,真正实现了 "认知受限但决策自主" 的分布式路由架构。

(三)层级认知的边界与原则

为确保系统可扩展性,节点对分层拓扑的维护遵循三条刚性原则:

原则 说明
逐级汇总 每一层只广播本层的汇总链路状态,对外表现为抽象的一个路由;本层内部细节(全量 LSP)只在层内泛洪。
单向下行 汇总路由仅由上向下分发:本层节点通过边界路由器(BR)下发的汇总 LSP 感知所在集群与上层骨干的聚合拓扑;下级明细绝不向上广播。
故障不跨区 某级拓扑内部的链路震荡(如 A 内某边缘节点闪断),其 LSP 泛洪被限制在本级边界内,上级拓扑地图不受任何影响。节点的分层视图保持独立稳定,爆炸半径被锁死在发生层级。

2.5 跨 ULA 前缀的路由规则

本文以 IPv6/ULA 为基线描述,但系统运行机制与地址族无关:通过 NAT、隧道、翻译等标准手段(IPv4 对应 RFC 1918 私有地址 + NAT,IPv6 对应 ULA + NPTv6),系统可完整运行在 IPv4 之上,此处不再赘述。不同 ULA 前缀(如本站点 fd0c:3632:1fd::/48 与另一组织独立生成的 ULA 前缀)之间的互通需遵循以下规则:

(一)ULA 的站点隔离属性

RFC 4193 定义的 ULA(fd00::/8)是站点本地地址:不通过互联网路由,亦不保证跨站点可达。两个独立组织的 ULA 前缀天然互相不可见,只有通过边界路由器(BR)建立显式互连与互信路由后才可能互通。这与 RFC 1918 私网地址(10/8、172.16/12、192.168/16)的隔离语义一致——隔离本身就是安全边界:默认互不可达,显式信任才开放通路。

(二)唯一性与冲突检测

ULA 的 40 位 Global ID 由 RFC 4193 伪随机算法生成,碰撞概率极低但非零;两个独立部署的站点可能生成相同前缀。互联时必须检测冲突:当 BR 收到对端宣告的 ULA 前缀与本站点重叠/重复时,按 4.6 的地址所有权规则仲裁——本组织前缀优先,本组织 BR 拒绝安装对端冲突路由并触发告警。

(三)路由交换规则(仅经互信 BR)

  1. 显式宣告:每个组织只经自己的 BR 向对端宣告整条 ULA 前缀汇总(如 fd12:3456::/48),不泄露内部任何细节(遵循 2.4 逐级汇总、单向下行)。
  2. 双向对称:跨 ULA 互通必须双向宣告回程前缀——A 宣告 fd0c:3632:1fd::/48,B 必须同样宣告自己的 /48,否则形成单程可达的非对称路由。
  3. 信任过滤:对端 ULA 路由必须经 4.8 的 CA 验签(信任等级传递)通过后才能装入 FIB;未导入信任锚的对端前缀保持 UNVERIFIED,不参与转发。
  4. 路由策略:BR 上以 route-map 按前缀列表过滤允许接受的对端 ULA 前缀(仅匹配已导入信任的条目),杜绝未授权前缀注入。
  5. 防黑洞保底:为对端 ULA 前缀配置指向 Null0 的保底静态路由,防止回程路由收敛期间流量被丢弃至虚空(呼应 5.4)。

(四)前缀重叠与翻译互连

若对端 ULA 前缀与本站点重叠或冲突(两站误用相同前缀),或需与公网互通,可在边界配置 NPTv6 做一对一前缀映射(本地 ULA ↔ 对端可接受前缀),无需重新编址;IPv4 场景对应 RFC 1918 与公网地址间的 NAT/隧道。

总结:不同 ULA 之间的路由本质是 "显式互信的双向前缀交换"——信任由 4.8 的证书体系保证,可达性由双方 BR 对称宣告保证,安全性由 route-map 过滤与防黑洞保底兜底。


三、核心机制

3.1 分布式智能路由(Distributed Intelligence Routing)

系统摒弃"中心控制器"或"总路由器"的概念,采用链路状态路由协议(如 IS-IS 或 OSPFv3)实现分布式决策:

  • 每节点独立计算:每个节点拥有本层完整拓扑地图(链路状态数据库 LSDB)以及所在各层的汇总拓扑地图,通过本地 CPU 独立运行 SPF(最短路径优先,Dijkstra 算法)计算最优转发路径。
  • 无需询问邻居:数据包转发由节点自行决策,无需向任何"上级"或"中心"发起查询。
  • 等价多路径支持:当存在多条等成本路径时,自动负载均衡;单条路径断裂时,本地重新计算备选路径。

3.2 基于广播的自动发现机制(Broadcast-Based Auto-Discovery)

系统底层采用不依赖 IP 地址的链路层(L2)广播协议(如 LLDP 或 IS-IS Hello)实现本层内的邻居自动发现:

  • 广播内容仅含两句原子信息:"我是谁(设备唯一标识)" + "我直连了哪几台设备(邻居列表)"。
  • TTL=1 物理隔离:邻居发现广播帧的生存时间严格限制为 1 跳,绝不跨层转发,将广播域物理锁定在本层内部。
  • 周期性保活与老化:节点周期性发送广播;若连续多次未收到某邻居的广播,本地即刻标记该邻居失效并重新计算拓扑。
  • 时间同步载荷(Time Synchronization Payload):所有节点的 Hello 广播帧强制附加一个 UTC 时间戳载荷(基于节点本地 RTC 硬件或高精度启动时钟),用于支撑证书时效校验、防重放与去中心化时间收敛(详见 3.3)。

链路状态的分层分发(逐级汇总、单向下行):本层全量 LSP 只在层内泛洪,下级明细绝不向上广播;各层仅产生本层的汇总路由,并由边界路由器(BR)向下分发给本层节点。节点的拓扑认知因此是"本层全量 + 上级各层汇总"的金字塔结构(详见 2.4)——任何层都看不到下级的微观细节,也无需向上层发送任何明细。

核心机制示意:

新节点物理接入(L2链路UP)
    ↓
发出 L2 广播 Hello(携带 Router ID + 链路本地地址 + UTC 时间戳)
    ↓
邻居收到 → 创建 LSDB 条目,Trust_Level = UNVERIFIED,启动 30s 验证计时器
    ↓
新节点发出 LSP 扩展(含证书 + 签名)
    ↓
邻居用本地信任锚验签:
    ├─ 验签通过 → Trust_Level 升级为 TRUSTED → 触发 SPF 重算 → 流量可达
    ├─ 验签失败 → Trust_Level 保持 UNVERIFIED → 不参与转发 → 仅记录日志
    └─ 超时未提供证书 → 同上,保持 UNVERIFIED
    ↓
【防抢占检查】若该 IP 已被 TRUSTED 节点占用 → 拒绝该 LSP,标记新节点为 BLOCKED

3.3 去中心化分布式时间同步(Distributed Time Sync over L2 Hello)

(一)设计目标与必要性

在缺乏 GPS/NTP 的外部灾备环境下,系统内部必须建立一个 自举的、无需中心授时服务器的分布式时间基准,用以支撑以下安全机制:

安全机制 对时间的依赖
证书有效期校验 验证当前时间是否在 Not Before 与 Not After 之间,防止过期证书重放
防重放攻击(Anti-Replay) 若攻击者截获合法 Hello 包并重放,接收方可凭时间戳跃变(Jump)感知异常
CRL(吊销列表)时效判定 每个吊销指令携带签发时间戳,节点只处理比本地时间新且偏差在容许范围内的指令
防 IP 地址抢占仲裁(见 4.6) 当两个节点同时声明同一 IPv6 地址时,比较双方证书签发时间与最近活跃时间戳,判定谁为合法持有者

时间戳载荷特性:

  • 精度要求:64 位整数 + 32 位小数(纳秒级精度),兼容 PTP(IEEE 1588)时间格式,便于未来对接硬件时间戳。
  • 广播周期:与 Hello 间隔一致(有线 1 秒,无线 10 秒),确保时间信息快速收敛。
  • 传递范围:TTL=1,严格不跨路由器转发,防止高层时钟偏差污染底层。

(二)时间同步算法:加权平均选举(无需主从)

系统摒弃传统 NTP 的"主从层级(Stratum)"模型(因为主服务器可能被摧毁),采用 "分布式加权平均收敛" 算法:

  1. 本地时钟维护:每个节点维护一个本地时间值 T_local(初始化为设备上电时的 RTC 值或 1970-01-01)。

  2. 收集邻居时间样本:节点在收到邻居的 Hello 包后,提取其中的时间戳 T_neighbor,并记录接收时刻的本地时间偏差(用于计算网络传输延迟,通常取最近 10 次 RTT 的中位数作为补偿)。

  3. 异常值剔除(防捣乱):若某邻居的时间戳与本节点当前时间的偏差绝对值 > 最大容许偏差(默认 ±5 秒),则丢弃该样本(防止被恶意节点带偏),并将该邻居的 Trust_Level 临时降级为 UNVERIFIED 并告警。

  4. 加权滑动平均:本节点每收到一轮 Hello 后,按以下公式更新自身时钟:

    T_local_new = (W_self × T_local + Σ(W_i × (T_neighbor_i - Δ_delay_i))) / (W_self + ΣW_i)

    • 权重规则:TRUSTED 节点的权重(W_i=10)远高于 UNVERIFIED 节点(W_i=1),BLOCKED 节点不参与计算。这确保了"默认只通过可信节点校准时间",恶意未验证节点无法通过注入虚假时间污染全网时钟基准。
  5. 收敛速度:在有线环境(1 秒 Hello 间隔)下,全网时钟偏差可在 10~15 个 Hello 周期(约 15 秒) 内收敛至 ±50ms 以内,足以满足证书校验(通常允许 ±5 分钟误差窗口)。

(三)Hello 包中时间广播 TLV 的详细定义

为了在工程上落地,在 IS-IS Hello 或 LLDP 报文中新增一个 自定义 TLV(Type-Length-Value),格式如下:

字段 字节长度 说明
Type 1 固定值 0xDD(实验扩展标志位,IANA 保留范围)
Length 2 整个 TLV 长度(不含 Type 和 Length 自身),固定为 20
Flags 1 低 4 位保留;高 4 位标记时钟源类型(0=RTC 硬件,1=自启动晶振,2=GPS 备份,3=人工设定)
Epoch_Seconds 8 自 1970-01-01 00:00:00 UTC 以来的秒数(64 位无符号整数)
Nano_Seconds 4 秒的小数部分,单位纳秒(32 位无符号整数)
Confidence_Interval 4 本节点对该时间戳的信心区间(±微秒数),用于后续加权计算时的误差预算
Local_Sequence 3 本节点发送 Hello 的递增序号(防止重放攻击,接收端要求 Seq 单调递增,否则丢弃)

注:对于不支持自定义 TLV 的旧设备,系统降级为强制使用被动监听模式,仅接收时间但不参与广播,确保向后兼容。

(四)时间同步与信任状态的联动逻辑

时间偏差不仅用于校准时钟,还作为 信任状态机的外部输入信号:

触发条件 本地动作
某 TRUSTED 节点的 Hello 时间戳连续 3 次跳变超过 ±2 秒 怀疑其私钥或 RTC 被篡改,将其降级为 UNVERIFIED,并触发安全告警
某 UNVERIFIED 节点的时间戳与本地基准偏差 > ±5 秒 直接忽略其所有时间广播,不纳入加权计算
收到时间戳早于本地最近一次重启时间(系统启动时间)的 Hello 判定为典型重放攻击,将该节点直接置为 BLOCKED,并向本层广播告警 LSP

时间阈值体系(由严到宽):多个时间门槛服务于不同目的,构成滞回(Hysteresis)设计,防止信任状态在边界处频繁抖动:

阈值 环节 作用
±1 秒 TRUSTED 升级(见 4.5) 新节点时间偏差小于此值才可升级为 TRUSTED,门槛最严
±2 秒 TRUSTED 降级 已信任节点连续 3 次跳变超过此值 → 降级 UNVERIFIED(上表第一行)
±5 秒 时间样本剔除 单样本偏差超过此值 → 丢弃样本并将该邻居临时降级(见(二)第 3 条)
±5 分钟 证书有效期窗口 NotBefore/NotAfter 校验的宽松容忍,防时钟微漂导致证书误判

升级门槛(±1s)严于降级触发(±2s):偏差落在两者之间时维持现状,形成滞回;±5s 为样本级剔除、±5 分钟为证书级宽松窗口,两者不参与信任状态迁移。

(五)冷启动与零基准引导(Bootstrap)

在完全断电重启、所有节点丢失 RTC 时间的极端场景下,系统采取 "首次通电节点以物理接触设定初值" 策略:

  • 若管理员在首次部署时设置了一个参考节点(如 BR),通过带外 CLI 执行 slimenet clock set 2026-08-28 12:00:00,该参考节点即成为整个区域的 初始时间基准锚。
  • 若没有任何节点被手动设定,则所有节点默认以各自上电时的系统启动时间(uptime)作为相对时间基准,此时证书的"绝对有效期"校验自动降级为"相对序列号校验"(仅对比证书签发时间的先后顺序,不校验是否过期),直至有一个节点通过外部渠道(如手机 GPS 或短波授时)获取到绝对时间并广播之。

3.4 基于物理观测的多粒度时间掩码门控(Temporal Acceptance Mask, TAM)

上述时间同步机制要求节点间维持一个相对一致的时钟基准,但灾备环境下节点可能完全丧失绝对时间认知。为此,系统引入 时间接受掩码(Temporal Acceptance Mask, TAM):允许每个节点根据自身可观测到的物理时间尺度,定义"什么是物理上可能的时间",将时间信任从简单的 start/end 窗口升级为 可编程的多粒度物理现实判定引擎。粒度越细,抗重放能力越强;粒度越粗,生存性越高。

(一)设计哲学:观测精度决定信任粒度

在数字世界崩溃后,人类获取"当前时间"的途径退化到物理观测层面。不同观测手段提供的时间精度截然不同:

观测手段 可达到的时间精度 典型误差 对应掩码示例
六分仪 + 经度计算(需晴空、地平线) 分钟级 ±1~3 分钟 14:35 ~ 14:38
日晷 / 立竿见影(影子最短时刻为正午) 刻钟级(15 分钟) ±10~15 分钟 14:30 ~ 15:00
手表/机械钟(未校准) 小时级 ±1~2 小时 14:00 ~ 16:00
月相/季节观察(知月份不知日) 月级 ±3~5 天 08月(八月)
墙上的划痕 / 树木年轮 / 已知重大事件(知年不知月日) 年级 ±1 年 2026年

核心机制:系统不强制要求全网同步到同一精度,而是允许 每个节点独立配置自己的时间接受掩码(TAM),告诉系统:"我只愿意相信符合这个模式的 Hello 包时间戳,其余的一律视为物理上不可能。"

(二)语法定义:类 Cron 的表达式掩码

系统采用一种 轻量级的时间模式匹配语言,借鉴了 Cron 的时间域语法(支持通配符、范围、列表、步进),同时兼容正则表达式的子集,以覆盖"年"这种大粒度场景。

格式:<Year>-<Month>-<Day> <Hour>:<Minute>:<Second> —— 由 日期段 与 时间段 两组字段组成,中间以空格分隔;时间戳先按节点配置的 TZ_OFFSET 折算为本地绝对时间,再逐字段比对。以空格连接多个模式表示"任一匹配(OR)"。

字段 允许值 通配符/操作符 示例
Year 四位数字(如 2026) *(任意年份),[0-9]{4}(正则),202[4-6] 2026 仅匹配 2026 年
Month 1-12 *,5-8(5 到 8 月),1,6,12 08 仅匹配八月
Day 1-31 *,1-15,*/2(偶数日) 28 仅匹配 28 号
Hour 0-23 *,9-17(工作时间),*/6(每 6 小时) 14 仅匹配下午 2 点
Minute 0-59 *,30-35,*/5(每 5 分钟) 3[5-9](正则,匹配 35-39 分)
Second 0-59 *,0-30 *(通常忽略秒级)

完整匹配规则:收到 Hello 包后,将其时间戳按 TZ_OFFSET 折算为本地绝对时间,再逐字段比对。所有显式指定的字段必须完全匹配;使用 * 的字段表示"不做限制"。若配置了多个模式,时间戳与任一模式匹配即通过(OR)。范围操作符 a-b 仅限单字段内;跨小时边界的连续窗口(如 14:45 ~ 15:15)需用两个模式的 OR 表达。

(三)典型配置场景与命令示例

管理员通过带外 CLI 配置掩码,以下命令展示了从"精确分钟"到"粗略年份"的全部退化层级:

场景 1:有六分仪和准确经纬度(最高信任)

# 我用六分仪测出当前 UTC+8 时区本地时间为 14:37,误差 ±2 分钟
# 我只接受 14:35 到 14:39 之间的 Hello 包(精确到分钟级)
slimenet clock accept-mask set "*-*-* 14:3[5-9]:*"

效果:攻击者即使完美复制了证书,若重放凌晨或上一小时的包,因分钟字段不匹配直接被丢弃。

场景 2:仅靠日晷判断(刻钟级)

# 日晷影子指向西南,估算约为下午三点前后(14:30 ~ 15:09)
# 跨小时边界 → 用两个模式 OR 表达
slimenet clock accept-mask set "*-*-* 14:3[0-9]:* *-*-* 15:0[0-9]:*"

场景 3:记得今天是几号但忘了月份(日期级)

# 墙上的日历被撕毁,但凭记忆知道今天是 28 号(可能是某个月)
slimenet clock accept-mask set "*-*-28 *:*:*"   # 忽略年份和月份,只看日期为 28 号

场景 4:只知道当前季节(月份级)

# 地面有积雪,观察月相得知约为隆冬一月
slimenet clock accept-mask set "*-01-* *:*:*"   # 仅接受一月的包

场景 5:只知道年份(墙上划痕/年轮)—— 最低信任层级

# 在废墟墙上看到"2026年到此一游"的刻痕
slimenet clock accept-mask set "2026-*-* *:*:*"   # 仅接受时间戳落在 2026 年的包

关键:当掩码只有"年份"时,系统自动将该邻居在时间同步算法中的权重降至最低(见 3.3(二)),因为其物理置信度极低,但仍保留了"拒绝 2025/2027 年重放"的基本能力。

(四)正则表达式(Regex)直通模式

对于标准 Cron 语法无法表达的复杂模式(如"匹配 2024 到 2026 之间的每一年,但排除 2025 年 7 月"),系统支持直接在任意字段中嵌入 POSIX 扩展正则表达式,用 // 包裹:

# 匹配 2024、2026,但跳过 2025(虽然奇葩,但用户可以自定义)
slimenet clock accept-mask set "/202[46]/-*-* *:*:*"

性能警告:正则匹配复杂度较高(O(n)),系统限定每个字段的正则长度不超过 50 字符,且每秒最多执行 100 次匹配(Hello 包速率上限),防止 DDoS 攻击消耗 CPU。

(五)掩码与证书有效期的联合校验逻辑(信任降级链)

时间掩码并非孤立工作,而是与证书中的 Not Before / Not After 构成 "与(AND)"门控:

Hello包通过 = (证书有效期验签通过) AND (时间戳匹配本地TAM)
证书有效期 本地 TAM 结果 说明
2025-01-01 ~ 2027-12-31 匹配 2026 年 通过 证书覆盖此年,且 TAM 确认物理年可信
2025-01-01 ~ 2025-12-31 匹配 2026 年 拒绝 证书在 2026 年已过期,即使是合法私钥签发的也不接受
2026-01-01 ~ 2026-12-31 * * * *:*:*(全通配) 通过 无物理限制,纯靠证书链信任(默认备用模式)

设计铁律:TAM 是"物理筛选器",证书有效期是"密码学筛选器"。两者互相独立,且任一环节不通过即丢弃报文。这确保了即使攻击者盗取了证书,也无法在物理时间错配(如半夜重放正午报文)的情况下得逞。

(六)掩码的自动降级与冲突协商(求生模式)

当多个节点互联时,若彼此的 TAM 互斥(例如 A 只接受下午 2 点的包,B 的时钟故障漂到了下午 4 点),会导致通信中断。为此系统内置 "求生模式(Survival Mode)":

  • 若节点连续 60 秒未收到任何符合 TAM 的 Hello 包,自动触发 逐步放宽掩码 策略:
    1. 首先将分钟字段放宽为 *(忽略分钟)。
    2. 若再过 60 秒仍无包,将小时字段放宽为 *(忽略小时)。
    3. 以此类推,直至退化到 * * * *:*:*(完全信任任何时间)。
  • 放宽操作记录到本地日志,并触发可视告警(LED 闪烁或串口输出),提醒管理员"物理观测可能出错,已自动降级为纯密码学信任"。

(七)工程实现建议

在设备配置文件中,TAM 被存储为纯文本:

# /etc/slimenet/time-accept.conf
TAM="2026-08-* 14:3[5-9]:*"   # 示例:2026年8月,下午14:35-14:39
TZ_OFFSET="+8"                # 本地时区偏移
FALLBACK_MODE="auto-widen"    # 自动放宽

系统启动时,若 RTC 完全丢失(归零至 1970 年),管理员必须首先手动执行 slimenet clock set 设一个粗估值,再配置 TAM。若两者均未配置,系统默认采用 * * * *:*:*(完全信任),确保连通性优先于安全性(灾备场景的"保底原则")。

总结:这套多粒度时间掩码机制,将"我用六分仪测出来,然后告诉楼里的人"这一朴素行为,严谨地转化为六维可编程匹配规则。它不仅让每个节点拥有了根据自身观测能力动态调整信任阈值的能力,更在密码学之上叠加了一层 物理不可伪造性(Physical Unforgeability)——太阳的位置和年轮的深度,是任何黑客都无法篡改的终极信任锚点。

3.5 子网分裂与融合(Slime Fission & Fusion)

系统名称 "Slime" 的由来:如同史莱姆可以自由分裂与融合,网络的连通分量(子网)在物理分割时根本性分离为两个独立个体,在有意重建连通时自愿融合为一个整体。这是网络自愈("缩而不崩")与去中心化自治在生命周期层面的体现。

(一)分裂(Fission):切割即分离

当物理链路被切断、无线节点失联或设备损毁,导致一个连通分量被切成两半时:

  1. 探测:依赖 3.2 的 Hello 周期性保活与老化——连续多次未收到邻居广播即判定链路失效,Dead Interval 过期触发分裂。
  2. 独立化:两侧各自保留下自己的连通分量,不再依赖对侧的任何信息。每个分量内部独立运行 SPF(3.1)、独立维护 LSDB、独立决策转发。
  3. 代表节点:若该层原有的代表节点(BR)落在对侧,本侧自动在剩余节点中选举新的代表,承担与本层上级(或外部)的接口职责。
  4. 分裂修正广播:两侧各向本层广播 分裂修正 LSP:
    • 撤销原先"整个子网"的汇总路由(原汇总不再代表全量可达);
    • 宣告各自分量的存活拓扑与修正后的前缀;
    • 本层上级据此更新路由:原一条汇总路由被拆分/失效,各分量经各自出口独立可达。
  5. 震荡限制:分裂修正广播仅发生在发生分裂的层级,遵循 2.4"故障不跨区",不向上级泛洪内部细节,更不波及全网。

关键语义:分裂是单向、不可协商的——任何一半都无需征求另一半同意,因为不存在中心仲裁者;一旦物理分离,两个分量立即成为逻辑上相互独立的个体,各自继续存活。

(二)融合(Fusion):重连需自愿

当两个独立个体重新建立物理/链路连通(线缆接回、无线信号恢复、两区有意互联)时,融合是双向自愿的,而非单方面吞并:

  1. 重连探测:一侧发出 Hello 广播,对侧响应,重新建立邻居关系(3.2)。
  2. 意愿协商:融合前必须双向确认融合意愿——通过带外确认(4.5)、证书互信(4.8)或管理员显式命令,防止一方被恶意"吞并"或被拖入未知网络。
  3. 摘要交换:双方交换各自的 LSDB 摘要(拓扑版本、前缀列表、信任状态),比对版本与差异。
  4. 冲突仲裁:融合前按 4.6 检查地址/标识冲突(分裂期间两边可能独立分配了相同地址),本组织前缀优先。
  5. 信任复验:分裂期间信任状态可能独立演化(吊销、新签),融合时对对方节点重新执行信任校验;无法通过的节点保持 UNVERIFIED,不参与转发(4.7)。
  6. 合并与修正广播:双方 LSDB 合并为一个连通分量,重新收敛(SPF 重算 + 3.3 时间基准加权收敛),并向本层广播 融合修正 LSP:撤销分裂时的修正,恢复统一的汇总路由。
  7. 代表整合:若分裂期间两侧各自选举了代表节点,融合后按 4.6 的地址所有权/证书签发时间仲裁,合并为单一代表。

关键语义:融合是双向、可协商的——与分裂相反,融合必须双方同时在场且都同意;任何一侧都可以拒绝融合,维持独立个体身份。

3.6 兼容层:隧道虚拟路由与标准入口转发(Compatibility Layer)

对于无法运行路由协议、无法参与信任体系或仅支持 IPv4 的传统设备(打印机、传感器、老旧 PC、IoT),系统提供 兼容层:它们不作为路由节点参与组网,而是经由一个 标准全功能节点 的 隧道虚拟路由 接入。兼容设备按其"可编程能力"分为两类,接入方式不同:

(一)两类兼容设备

类型 代表 能力特征 接入方式
A 类:软件可编程设备 老旧 PC、树莓派、可刷固件的路由器、Linux 主机 能运行 WireGuard 等隧道客户端、能修改软件路由表、可承载轻量代理进程 隧道 + 软件域运行部分 SlimeNet 上层协议,成为入口的虚拟 SlimeNet 节点((二))
B 类:纯硬件哑设备 打印机、IP 摄像头、传感器、带固定固件的设备 不能运行任何自定义软件、不能修改路由表,只能做常规 LAN 行为 L2 桥接 + 入口代管((三))

共同点:两类设备都不参与 SlimeNet 路由协议、不持有证书,被整体视为入口节点的"终端"。

(二)A 类接入:虚拟 SlimeNet 节点(Virtual SlimeNet Node)

A 类设备不只是一个"隧道客户端",而是在软件域内成为挂在入口节点上的一个虚拟 SlimeNet 节点——运行部分 SlimeNet 上层协议:

  • 隧道承载:设备运行 WireGuard / GRE / IPIP / 4to6 客户端,与入口节点建立点对点虚拟链路,作为虚拟节点的"上行口"。
  • 软件域协议子集:设备上的轻量 SlimeNet 代理执行部分上层协议:
    • 保存拓扑表:维护受限 LSDB(虚拟子网内的节点/链路视图 + 入口节点下发的汇总视图);
    • 时间同步:参与 3.3 分布式时间同步与 3.4 TAM 的软件侧(作为虚拟节点的时钟入口)。
  • 软件预路由:隧道内的流量先在设备软件域按本地拓扑表进行软件预路由——在虚拟子网内自行选定最优下一跳/路径,只有需要出域的部分才上交入口节点注入核心网络。预路由由设备 CPU 完成,不依赖任何硬件路由引擎。
  • 虚拟身份:虚拟节点可持有由入口节点背书的轻量身份;入口节点在其 LSP 中将该虚拟节点宣告为自身的虚拟邻居/直连子网(/32、/128 或点对点前缀)。
  • 加密可用:WireGuard 的加解密在设备本地 CPU 完成,因此虚拟节点到入口的末端链路可以加密,不依赖核心网络的 L0 明文档。

本质:A 类设备在逻辑上是一个"认知受限的 SlimeNet 节点"——它有自己的拓扑表与转发决策(软件预路由),只是通过隧道挂载在入口节点上,把出域部分委托给入口。这与 2.4"认知受限但决策自主"的分布式路由哲学一脉相承。

(三)B 类接入:L2 桥接 + 入口代管

纯硬件设备无法改动任何配置,入口节点必须提供完全透明、设备零感知的接入:

  • L2 桥接:入口节点用 VXLAN/网桥在本地构建虚拟二层,将 B 类设备所在的物理网段并入虚拟子网,设备如同插在一台普通交换机上。
  • 入口代管全部职能:DHCP/DHCPv6 分配地址、默认网关指向入口、DNS 代理、NAT64/4to6 翻译——设备只做自己的事,其余全部由入口节点代替完成。
  • 零改动:打印机、摄像头等出厂即插,入口节点为其虚拟一个"它认识的局域网",一切照旧。

(四)标准入口转发(两类通用)

入口节点作为兼容层与核心网络的唯一桥接点,承担全部网络职能:

  1. 隧道端点:终结所有接入隧道(A 类点对点隧道、B 类 L2 桥接),作为兼容子网的默认网关。
  2. 协议翻译:IPv4↔IPv6(NAT64/4to6)、私有协议代理,将兼容设备的流量翻译进核心 IPv6/ULA 域(2.2)。
  3. 地址服务:DHCP/DHCPv6、SLAAC 前缀委派、DNS 代理(补充 2.2 的 /64 SLAAC——老设备未必支持原生 IPv6)。
  4. 信任代表:兼容设备不经 4.5 准入,由入口节点代持信任,兼容流量视为入口节点的流量(对应 4.13 的 L0 全明文档)。

(五)与核心网络的边界

  • 两类兼容设备都不进入核心网络的 LSDB(4.4)、不参与核心 SPF(4.7),其"可达性"只表现为入口节点宣告的一条虚拟子网路由。A 类虚拟节点虽在自己的软件域内维护受限拓扑表并做软件预路由,但该表仅存于其本地,绝不注入核心 LSDB(遵循 2.4 逐级汇总、单向下行)。
  • 按 2.4 逐级汇总原则,该虚拟路由在入口节点处被汇入其直连前缀,对上层仍是一条汇总,不泄露兼容层内部细节。
  • 安全边界:兼容层流量默认按 L0 全明文处理(4.13);A 类设备可借助自身隧道(如 WireGuard)在末端链路上加密,B 类设备受固件所限只能明文,加密与否均不改变核心网络的安全姿态。

价值:兼容层把"能力鸿沟"挡在网络边缘——老设备永远只对接一个能力完整、可信的入口节点,核心网络因此保持统一的路由协议与信任模型,无需为兼容设备降低任何标准。A 类设备"带脑接入"(虚拟 SlimeNet 节点 + 软件预路由),B 类设备"无脑代管"(L2 桥接),各按其能力获得最大可用性。


四、信任与安全架构(Security Architecture)

4.1 威胁模型与设计原则

在 SlimeNet 的设计场景中(如灾后重建、园区自治),安全架构必须遵循三条底层铁律:

原则 说明
无中心根 CA 不存在全局唯一的 Root CA,否则 CA 宕机或被入侵将导致全网瘫痪,违反"去中心化"第一性原理。
信任锚定于物理邻近性 初始信任不依赖远程第三方,而依赖设备首次接入时的物理接触或已有组织背书。
控制面与数据面分离加密 路由协议报文(IS-IS/OSPF)与用户数据承载分离,即使路由被嗅探也无法伪造邻居关系。

核心威胁:恶意节点伪装成合法楼栋路由器(L2/L3 欺骗)、路由毒化攻击、老旧设备被控后横向渗透。

4.2 双轨信任模型:组织 CA + 个人 P2P 证书

系统摒弃单一 PKI 体系,采用 "双轨并行" 的证书模型,分别对应"层级拓扑接入"与"终端间直连"两个维度。

证书类型 颁发者 用途 生命周期
组织节点证书 各区域/楼栋的本地小型 CA(Local CA) 用于边缘节点、边界路由器(BR)之间的 IS-IS/OSPFv3 协议认证,以及汇总路由的签名 较长(1~5 年),随硬件生命周期
个人 P2P 证书 个人 GnuPG 私钥自签名 用于终端设备(电脑/手机)之间的端到端加密通信、Mesh 直连(如蓝牙/WiFi P2P) 灵活(可设短期有效期,如 24 小时),用户自主管理

设计哲学:"组织管节点,个人管终端"。楼栋的路由器不该由个人证书来认证,反之,个人的手机也不应受组织 CA 的回收钳制(在脱离组织网络后依然能 P2P 互信)。

与组织证书的隔离原则:个人证书 绝不 用于路由协议(IS-IS/OSPF)的认证,防止个人设备被控后导致整层网络瘫痪。个人证书仅作用于 "数据面",控制面(路由面)严格绑定组织节点证书。

4.3 层级化本地 CA(Hierarchical Local CA)部署模型

每个 /56 区域(即一个组织/集群) 内,设立一个或多个 分布式本地 CA 服务。该 CA 并非中心化服务器,而是由该区域内的 3~5 个核心边缘节点(或 BR)以 门限签名(Threshold Signatures) 方式共同维护私钥分片,任意少于阈值的节点被攻破不影响 CA 签发能力。

(一)证书结构与 IPv6 地址绑定

采用 GnuPG(RFC 4880) 作为底层证书格式,但扩展 X.509 v3 扩展字段 或 PGP User ID 以绑定 IPv6 ULA 地址:

证书绑定内容:
- 设备唯一标识(设备序列号或硬件 UUID)
- 分配的 IPv6 ULA 地址(如 fd0c:3632:1fd:100:1::1/128)
- 角色标签(Edge_Node / BR / Terminal)
- 所属区域 /56 前缀哈希
- 公钥(Ed25519 / ECDSA P-256)

校验逻辑:当节点通过 L2 广播(LLDP/IS-IS Hello)宣告"我是谁"时,必须附带该证书的指纹签名。邻居节点收到后,首先校验该 IPv6 地址是否与签名证书中的地址一致,防止 IP 地址欺骗。

4.4 拓扑表信任状态(LSDB 信任字段扩展)

原拓扑数据库中,每个节点的链路状态数据库(LSDB)仅存储邻居 ID、链路开销(Metric)、接口 IP 和存活状态。现扩展为 五元组信任记录:

字段 类型 说明
Node_ID IPv6 ULA /128 节点的稳定环回地址(Router ID)
Link_State Up/Down/Stale 链路状态(沿用原 IS-IS/OSPF 机制)
Cert_Fingerprint 32 字节(SHA-256) 该节点当前使用的证书指纹(若为空则代表未验证)
Trust_Level 枚举(见下表) 由本地节点根据自身信任锚(CA 公钥集)独立判定
First_Seen_Timestamp 64 位时间戳 首次收到该节点 Hello 广播的时间,用于防重放攻击

Trust_Level 枚举定义:

等级 标识 判定条件 本地行为
TRUSTED 绿 证书由本地已导入的任一组织 CA 或个人信任锚(GnuPG 公钥)验签通过,且 IPv6 地址与证书绑定一致 纳入 SPF 最优路径计算,可转发数据
TRUSTED_PENDING_TIME 青 证书验签通过,但时间偏差 > ±1 秒,等待时钟收敛至本层基准内 仅允许接收路由 LSP,不参与数据转发;时钟收敛后自动升级为 TRUSTED
UNVERIFIED 黄 能通过 L2 广播发现并建立了 IS-IS/OSPF 邻居关系,但未提供有效证书,或证书验签失败 纳入拓扑显示(用于网管监控),但 不作为任何数据流量的下一跳
BLOCKED 红 曾试图宣告一个已被 TRUSTED 节点占用的 IPv6 地址(IP 冲突攻击);或证书已被吊销列表(CRL)命中 完全忽略其所有 LSP 报文,不写入 LSDB
PENDING_APPROVAL 蓝 证书验签通过,但该节点属于 跨组织(公钥未预置),等待本地管理员手动执行 trust anchor import 确认 暂存证书指纹,仅允许路由协议邻居维持,数据流量默认不通(除非手动覆盖)

核心原则:UNVERIFIED 节点可以存在于邻居表中,但绝不会出现在转发路由表(FIB)的下一跳候选集中。这保证了"默认只通过可信节点通信"的约束在转发面落地。

4.5 两阶段加入机制:IP 层发现 + 信任层验证

"即插即用"被拆分为 两个独立的协议阶段,确保在证书验证完成前,新节点无法污染路由计算:

第一阶段:IP 层(明文发现)—— 仅登记,不转发

新节点物理接入后,照常发送 IS-IS/OSPFv3 的 Hello 报文(携带其 IPv6 链路本地地址和 Router ID)。

  • 本层所有现有节点收到该 Hello 后,立即在 LSDB 中创建一个新条目,Trust_Level 强制标记为 UNVERIFIED,并启动一个 验证计时器(默认 30 秒)。
  • 关键约束:在 Trust_Level 变更为 TRUSTED 之前,该节点会被所有邻居的 SPF 算法 自动排除(如同该链路开销被设为无穷大)。这意味着新节点在验证完成前,无法接收到任何用户数据流量,也无法成为其他节点的中转跳板。

第二阶段:信任层(加密验证)—— 验签通过才激活

新节点在发出 Hello 的同时,必须通过 扩展 LSP 报文(新增 TLV 137,携带证书及其签名)广播其证书。

  • 新节点发出 Hello 后,邻居节点不仅等待其证书,还观察其时间戳连续 3 个 Hello 周期是否稳定(无剧烈抖动)。
  • 只有同时满足"证书验签通过"与"时间偏差 < ±1 秒",Trust_Level 才能从 UNVERIFIED 升级为 TRUSTED。
  • 若证书验签通过但时间偏差过大,该节点被标记为 TRUSTED_PENDING_TIME(次信任状态),仅允许接收路由 LSP,但依然 不参与数据转发,直至其时钟通过加权平均算法收敛至本层基准内。

每个邻居节点收到证书后,执行本地校验链:

  1. 检查证书中的 IPv6 地址是否与 Hello 报文中的 Router ID 严格一致(防地址欺诈)。
  2. 用本地信任存储区(Trust Store)中已导入的所有 CA 公钥和个人 GnuPG 公钥尝试验证证书链。
  3. 若验签通过 → 将该条目的 Trust_Level 升级为 TRUSTED,立即触发本地 SPF 增量重算,该节点正式成为拓扑中的有效转发跳。
  4. 若验签失败或超时(30 秒无响应) → 该条目保持 UNVERIFIED,节点仅作为"拓扑盲点"显示在监控列表中,但 绝不影响现有转发路径。

带外准入补充(即插即用的受信场景):当 CA/信任锚已预置、或网络处于物理可控的受信环境时,两阶段准入可自动衔接——若管理员预置了该硬件的授权信息,CA 节点可直接签发临时证书(24h 有效)下发,新设备实现即插即用;若无预置,则需由本区域已信任的节点进行"带外确认"(如物理按钮按一下,或输入一次性密码)。新节点获得证书后,注入 IS-IS/OSPFv3 认证密钥链,才开始正常 LSP 泛洪、参与 SPF 计算。

关键设计:为防止未授权节点在物理接入后瞬间发起路由攻击,IS-IS/OSPFv3 的 Hello 报文必须启用 RFC 5304(IS-IS HMAC-MD5) 或 RFC 5310(IS-IS Cryptographic Authentication),且密钥由上述 CA 证书协商衍生(而非静态预配)。

4.6 IP 地址防抢占机制(防御"冒名顶替")

核心痛点:恶意节点不能通过宣告"我是楼栋网关 fd0c:3632:1fd:100:1::1"来截留流量。

系统在 LSDB 中引入 "地址租约所有权(Address Ownership)" 强制规则:

场景 本地节点处理逻辑
新节点宣告一个 IPv6 地址(或前缀),该地址在 LSDB 中不存在 正常执行 4.5 的两阶段流程,最终变为 TRUSTED 或 UNVERIFIED。
新节点宣告一个 IPv6 地址,该地址已存在于 LSDB 中,且所有权归属为某个 TRUSTED 节点 无条件拒绝。本地节点不会更新该条目的链路状态,并在系统日志中记录"IP 冲突攻击告警",同时将该新节点的源 MAC 和证书指纹加入本地动态黑名单(30 分钟惩罚期)。
新节点宣告一个 IPv6 地址,该地址已存在于 LSDB 中,但原归属节点已老化超时(Dead Interval 过期)且被标记为 Stale 允许新节点接替该地址,但必须重新走完第二阶段验证(证书验签),且原节点恢复后,通过 比较证书签发时间戳(Not Before) 决定谁拥有更高优先级(通常较晚签发的证书视为新硬件接管)。

底层实现:IS-IS 的 LSP ID(由 System ID + 伪节点 ID + 分片号组成)天然具有唯一性,但为了支持地址冲突检测,每个节点在宣告其直连前缀时,必须附带 Cert_Fingerprint 作为该前缀的"所有者签名"。若邻居收到两份相同前缀却不同指纹的 LSP,直接丢弃后到达的那一份,并触发告警。

4.7 信任驱动的 SPF 路径计算(隔离未验证节点)

SPF(Dijkstra 算法)在原有基于 Metric 计算的基础上,增加 信任过滤前置条件:

  • 节点在将 LSDB 中的邻居链路纳入 SPF 计算图(Graph)之前,必须先检查该邻居的 Trust_Level。
  • 若邻居为 UNVERIFIED 或 BLOCKED,则该链路直接 不加入拓扑图(相当于物理断开)。
  • 若邻居为 PENDING_APPROVAL(跨组织未确认),默认也不加入拓扑图,除非本地管理员在配置中开启了 allow-cross-org-unverified 应急开关(仅用于救灾极端场景)。

最终效果:即使物理上全网互联,未验证节点也只能收到路由协议的 Hello 和 LSP 广播(用于维持邻居发现),但 无法进入任何节点计算出的无环最短路径树(SPT)。数据包永远不会被转发给它们,除非它们成功获得本地信任锚的签名认证。

4.8 跨组织信任交换(Cross-Organization Trust)

当两个组织(区域)的 BR 互联时,涉及跨组织互通。此时不依赖上级根 CA,而是采用 PGP 的 Web of Trust(信任网) 理念:

  1. 公钥交换:两个组织的 BR 管理员通过带外安全信道(如面对面扫描二维码、加密邮件)交换各自本地 CA 的公钥(或根证书)。
  2. 本地信任锚定:区域 A 的管理员在其 BR 上配置 trust anchor import,将区域 B 的公钥标记为 "可信任对等体",并设置信任等级(如仅信任路由宣告,或允许跨区域递归访问)。
  3. 路由签名验证:区域 B 的 BR 向对端区域宣告的 /56 汇总路由,必须附带其本地 CA 的签名。区域 A 的 BR 收到后,用预先导入的公钥验签,验签通过才将该路由纳入本地 LSDB。此时该 BR 节点自动升级为 TRUSTED,同时 区域 B 内部的全部前缀继承该信任等级(信任传递)。
  4. 双向选择:区域 A 可以拒绝信任区域 B,此时两个网络保持物理隔离(光纤插着但不交换路由),仅作为独立岛运行——这实现了 "你可以选择信任的组织" 这一需求。

4.9 独立于组织的个人 P2P 证书(端到端信任)

针对终端用户(如手机、笔记本电脑),即便所在楼栋的组织 CA 离线或不可达,用户之间依然需要安全通信。为此,系统内置 GnuPG 原生证书链 支持:

  • 自签根:每个用户生成自己的 Ed25519 密钥对,自签名形成 个人身份证书(类似 OpenPGP 的身份 UID)。
  • P2P 发现与验证:在 Wi-Fi 直连或蓝牙 Mesh 场景下,双方互换个人证书。若双方从未见过面,则显示 "陌生密钥指纹",由用户手动确认是否信任(类似 Signal 的 Safety Number)。
  • 社交图谱聚合:用户可将自己信任的友人证书签名(Sign)后广播给邻居节点,形成去中心化的信任传递。这种传递不影响路由决策,仅影响终端应用层的端到端加密(如 VoIP 或文件传输)。

4.10 信任状态的持久化与恢复

为防止节点重启后丢失信任状态导致全网震荡,每个节点的 LSDB(含 Trust_Level 字段)定期(每 5 分钟)持久化至本地存储(如 /var/lib/slimenet/lsdb-cache.json)。

  • 节点重启后,先加载持久化的信任记录,再开始接收新 LSP。对于已记录为 TRUSTED 的节点,在收到其新 LSP 时优先信任(无需重新验签,节省 CPU),除非该节点的证书在重启期间已被吊销(需实时检查 CRL Bloom 过滤器)。

4.11 证书吊销与紧急广播(Revocation & Emergency Blacklist)

去中心化环境下,吊销(Revocation)比签发更难。SlimeNet 采用 "本地化 CRL(证书吊销列表)+ 全网 Bloom 过滤器推送" 机制:

场景 处理方式
某节点私钥泄露 该区域 CA 签发吊销指令,签名后在本区域泛洪(LSP 扩展字段)。区域内所有节点收到后,立即踢出该邻居并拒绝其后续 Hello。
整个组织 CA 被攻破 全网发布 "紧急信任撤销" 广播包,其他组织收到后直接丢弃源自该区域前缀的所有路由条目,物理链路视为"不信任链路"。
个人证书丢失 用户用旧私钥签发新的吊销证书,通过其信任的邻居节点扩散;若无旧私钥,则需通过社交渠道(如面对面)更新指纹。

防滥用机制:为防止恶意节点伪造吊销指令,所有吊销指令必须附带原 CA 的实时签名(时间戳精确到秒),节点本地时钟依赖去中心化时间同步(见 3.3),并通过 TAM 时间掩码判定指令时间是否物理可信(见 3.4)。在灾备场景下,允许管理员手动设定粗略时间窗口。

4.12 与现有 IS-IS/OSPFv3 的无缝集成

为了在不推翻 L3 设计的前提下落地安全架构,采用 "双因子认证" 策略:

  1. 接口级认证:在物理接口/VLAN 上启用 OSPFv3 的 IPsec AH(RFC 4552)或 OSPFv3 认证尾部(RFC 7166),或 IS-IS 的 HMAC-SHA256(RFC 5310)。密钥材料由节点证书私钥参与 HD(层次化确定性)派生,确保每条链路的密钥独一无二。
  2. LSP 签名:节点在泛洪自己的链路状态协议数据单元(LSP)时,附加一个 数字签名 TLV。接收节点在将 LSP 放入 LSDB 之前,必须先用该节点证书的公钥验签。这彻底杜绝了路由毒化攻击——即使入侵了物理交换机,也无法伪造合法节点的 LSP。
  3. 性能优化:签名验签(Ed25519)在 ARM Cortex-A53(树莓派 4)上耗时约 12ms,对 SPF 计算延迟(50200ms)影响可忽略,且仅在拓扑变化时触发,非周期性开销。

4.13 三档运行层级(Operating Modes)

系统将安全姿态归纳为三档 可配置的运行层级,对应从"物理可控"到"完全敌意"的信任环境光谱。每档决定各安全机制的默认开关状态,管理员按部署环境选择后即可运行:

层级 适用环境 证书 准入 协议认证/加密 转发面
L0 默认全明文 网络物理可控(私人园区、居家、实验),或含无法自定义的传统设备 不强制 直接融入(即插即用) 关闭 不过滤(视同全 TRUSTED)
L1 默认自动签发证书 CA/信任锚已预置的受信管理域 自动签发临时证书(4.5) 验签通过即 TRUSTED 开启(RFC 4552/7166/5310) 信任过滤开启
L2 默认零信任 公网/敌意环境、跨组织互联、未知网络 必须预置/带外导入 两阶段 + 带外确认(4.5) 强制开启 + LSP 签名(4.12) 严格过滤,UNVERIFIED 不进 FIB(4.7)

各层级的机制开关:

机制 L0 全明文 L1 自动签发 L2 零信任
两阶段准入(4.5) 跳过 自动完成 强制 + 带外确认
SPF 信任过滤(4.7) 关闭 开启 开启(默认拒绝)
接口认证(4.12) 关闭 开启 强制
LSP 数字签名(4.12) 关闭 可选 强制
TAM 时间掩码(3.4) 可选 可选 建议强制
跨组织互信(4.8) 默认互信 trust anchor import 必须显式导入

默认值与切换规则:

  • 系统出厂默认 L1(自动签发),兼顾安全与可用性;L0 与 L2 为显式配置。
  • 降级(L2→L1→L0)可在运行时即时生效,自动放宽准入与认证约束,用于灾区生存优先场景(呼应 3.4 求生模式)。
  • 升级(L0→L1→L2)必须逐步重建信任:先导入信任锚、再开启认证,不可在运行中直接跳档,防止既有明文邻居被瞬间隔离导致全网割裂。

与"即插即用"的关系:1.2 的"即插即用"正对应 L0/L1 两档——L0 是物理可控下的纯即插即用,L1 是 CA 预置下的自动签发即插即用;L2 则完全回到 4.5 的两阶段准入。


五、实现路径

5.1 物理层实现(L1)

  • 有线骨干:单模光纤或多模光纤连接楼栋之间,支持千兆/万兆以太网。
  • 无线备份:5.8GHz/2.4GHz 定向 Wi-Fi 网桥,用于跨马路或无法拉线场景,提供备用物理路径。
  • 供电保障:核心边缘节点建议配置 UPS 或独立应急电源,确保骨干连通性。
  • 长距离点对点/点对面:使用激光、短波、V/U、LoRa 等一切有线/无线手段进行通信。

5.2 链路层与发现层实现(L2)

  • 推荐协议:IEEE 802.1AB(LLDP)或 IS-IS(CLNS 模式),用于邻居自动发现。
  • 最小配置:
    • 启用 LLDP 发送与接收
    • 配置系统 ID(唯一标识)
    • 配置管理地址(若有)
  • 预期产出:每节点获得直连邻居列表("我连了谁")。

在配置边缘节点时,建议增加以下时间同步相关参数:

# 启用Hello内嵌时间广播(默认开启)
set protocols isis interface eth0 timed-broadcast enable

# 最大容许时间偏差(默认5000ms)
set protocols isis timed-broadcast max-skew 5000

# 加权平均中,本节点自权重(值越大,越不信任外部时间)
set protocols isis timed-broadcast self-weight 5

5.3 网络层实现(L3)

核心选择:IS-IS for IPv6(RFC 5308) 或 OSPFv3(RFC 5340)

功能 配置要点
启用 IPv6 转发 sysctl -w net.ipv6.conf.all.forwarding=1(Linux)
配置环回地址 为每台路由器配置一个稳定的 Loopback /128 地址(如 fd0c:3632:1fd:100:1::1/128),作为 Router ID
启用 IS-IS/OSPFv3 在每个需要参与路由的接口(物理口、VLAN 子接口)上启用协议
宣告直连前缀 将本节点的直连子网(用户网段、互联链路)注入路由协议
配置区域划分 同一楼栋/区域内的节点放入同一个区域(Area),不同区域通过边界路由器(BR)互联
配置路由汇总 在边界路由器上配置 summary-address,将区域内部多条 /64 汇总为一条 /60(乃至 /56)通告给上级

5.4 关键优化配置(抗毁增强)

  1. Hello 间隔与 Dead 间隔调优
    • 快速收敛:Hello = 1s,Dead = 3s(有线环境)
    • 慢速收敛:Hello = 10s,Dead = 30s(无线环境,节约带宽)
  2. SPF 延迟计算
    • 配置 SPF 计算延迟 50ms~200ms,抑制拓扑震荡时的频繁重算
  3. 被动接口(Passive Interface)
    • 对仅连接终端设备的用户侧接口,启用"被动"模式(不发送 Hello,仅宣告路由),避免不必要的协议报文广播
  4. 黑洞路由(Null0)保底
    • 在每个边界路由器上配置指向 Null0 的汇总静态路由(如 ipv6 route fd0c:3632:1fd:100::/56 null0),防止路由黑洞导致上层数据包被"丢弃至虚空"。

5.5 分阶段部署路径

阶段 规模 验证目标
阶段 0 单楼栋(2~3 台边缘节点) 验证 ULA 地址分配、IS-IS 邻居建立、双向 ping 通
阶段 1 两栋楼互联(A↔B) 验证跨楼栋路由、静态汇总配置、故障隔离(拔掉一根线看是否自动切换)
阶段 2 三栋楼环形组网(A↔B↔C↔A) 验证环形冗余、OSPF/IS-IS 自动选路、等价多路径(ECMP)
阶段 3 引入边界路由器(BR),划分多个 /56 区域 验证层级汇总、区域间路由、故障不跨区传播
阶段 4 接入外部 ISP 公网前缀(如联通的 /60) 验证 NPTv6 或双栈 NAT64 配置,实现内外互通

六、可行性评估

6.1 技术可行性

维度 评估结论
标准协议支撑 全部基于 IETF 标准化协议(IS-IS、OSPFv3、NDP、SLAAC),开源实现(FRRouting、Bird)成熟稳定
硬件需求 普通 x86/ARM 设备(树莓派 4B、旧电脑、工控机)即可胜任边缘节点,无需专用路由硬件
扩展性 ULA /48 前缀提供 65536 个 /64 子网,足以覆盖中等规模区域组网需求(数百栋楼)
容灾性 环形或网状物理拓扑 + 动态路由协议,单点故障时收敛时间 ≤ 3 秒(有线环境)

6.2 局限性与挑战

局限 应对措施
ULA 地址无法被公网访问 在边界部署 NPTv6 或 NAT64,映射到公网前缀(若可用)
广播协议依赖物理连通性 需确保骨干链路(光纤/无线网桥)的物理冗余,否则分区无法通信
路由协议配置门槛较高 建议使用自动化配置脚本(Ansible/脚本)批量下发,降低人力部署成本
无线 Mesh 环境下协议开销 需优化 Hello 间隔,或改用 BATMAN/OLSR 等专门为无线设计的 Ad-hoc 路由协议
老旧/不可自定义设备 通过兼容层接入:隧道虚拟路由 + 标准入口转发(见 3.6),辅以 DHCPv6、WireGuard、4to6 翻译等手段

七、应用场景

场景 适配性说明
应急通信与灾后重建 不依赖公网基础设施,设备通电即组网,适合地震、洪水等灾区临时通信
园区/厂区私有骨干网 解决多栋建筑间网络互联,避免租赁运营商专线的高昂费用
物联网(IoT)基础设施 为分布式的传感器网络提供稳定、自治的 IPv6 承载层
社区宽带自治网络 多户共享一条光纤接入,内部采用本拓扑组网,对外通过单一边界路由器汇聚出口
军事/野外战术通信 支持移动 Ad-hoc 节点临时加入与离开,符合战术 MANET 需求

八、总结

本系统的设计核心可概括为四个层面:

  1. 架构层面——用层级封装对抗复杂度:每层只产生本层汇总路由并向下广播,将指数级的路由表增长控制为线性。

  2. 机制层面——用分布式智能对抗中心依赖:每节点独立拥有本层拓扑地图,自行决策转发路径,无需中央指挥。

  3. 生命周期层面——用分裂融合对抗物理分割:连通分量被切断时自动裂为独立个体并广播修正(3.5 Fission),重建连通时双方自愿融合为整体(3.5 Fusion),网络"缩而不崩"、聚而复圆。

  4. 安全层面——用"分层锚定、组织互信、个人自治"的三位一体模型对抗恶意接入:

    • 分层锚定:将信任根下放到每个物理区域(/56),摧毁了全局 CA 这个"核爆中心点"。
    • 组织互信:借鉴 PGP 的 Web of Trust,让不同的园区/机构像交换名片一样交换公钥,而非依赖上级 CA 链。
    • 个人自治:将人与人之间的加密通信剥离出路由体系,保留 GnuPG 的灵活性与隐私属性。
    • 转发面强制:信任状态直接决定 FIB 下一跳,未验证节点可被看见但永不被信任。

这套架构确保即使全球互联网公钥基础设施完全崩塌(如 DNSSEC 根区丢失),SlimeNet 内部的节点依然能通过 物理接触 + 本地信任锚 完成安全组网,真正实现 "核战后的可信通信"。


本文档基于标准化网络协议架构设计,所有描述机制均可在 Linux/FRRouting/OpenWrt 等开源平台上实现落地。

Survive After A Nuclear War --Rachel Misaka

About

A Decentralized, High-Resilience Self-Organizing Communication Topology

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors