
Holo 是一套路由协议套件,旨在支持高规模和自动化驱动的网络。
如需了解路由协议的定义,请参阅此 Wikipedia 页面。
特性
专注于简洁性和正确性
Holo 的主要目标是创建一个可靠、易于维护且可扩展的代码库。随着路由协议及其扩展的复杂度不断增加,基于稳健的基础实现路由协议至关重要。为此,Holo 的代码库优先考虑简洁性、模块化和完善的文档。得益于 Rust 编译器的严格性和广泛的单元测试,大多数回归问题有望在新功能的开发周期早期被捕获。更多详情请参阅 架构 页面。
面向自动化
Holo 专为需要基于结构和模型化数据进行可编程配置和监控的高规模、自动化驱动网络而设计。Holo 原生实现了 IETF 的标准 YANG 模块,并支持多种管理接口,包括原生 gRPC 和 gNMI。此外,Holo 配备了一个独立的 CLI,该 CLI 根据 YANG 模块动态渲染命令,并通过 gRPC 与 Holo 守护进程通信。
所有配置变更均作为事务处理,确保要么全部应用,要么全部撤销。这一特性极大地简化了网络自动化,因为它消除了管理应用程序中进行错误恢复的需求。Holo 还支持涉及多个网络设备的全网事务。其他网络自动化功能包括确认提交和配置回滚支持。
安全性
由于采用内存安全语言编写,Holo 对各种内存相关漏洞和安全漏洞具有天然免疫力。除了 Rust 提供的安全保障外,Holo 守护进程在启动时还会放弃权限。对于某些操作(如绑定套接字),会使用 Linux 能力 在最短时间内获取所需的最小权限。
Holo 还针对路由协议栈中最常见的攻击向量——通过恶意数据包输入发起的拒绝服务(DoS)攻击——提供了稳健的保护。传入的数据包在隔离的、受监督的异步任务中进行解码,使得协议实现能够在恐慌时优雅地恢复,例如忽略畸形数据包或仅关闭受影响的 TCP 流,而不会影响整个守护进程的稳定性。此外,得益于 Holo 的模块化设计和内置的覆盖引导模糊测试支持,大多数解析错误有望在开发过程中被检测和处理。
集成的协议实现
某些协议(如 OSPF 和 RIP)存在广泛部署的不同版本,通常一个用于 IPv4,另一个用于 IPv6。Holo 利用 Rust 的泛型实现协议版本无关的实现,其中大部分代码被不同协议版本共享。这种方法降低了这些协议的维护成本,并便于提供惠及所有协议版本的新特性。
并行性
Holo 广泛使用异步操作,并依赖 Tokio 运行时来调度任务并在线程池上运行。为获得更好的性能,I/O 请求和 CPU 密集型算法都被卸载到单独的任务中,从而最大化所有可用 CPU 核心的利用率。计划在未来支持运行时无关的代码,一旦 Rust 语言团队标准化了必要的抽象。
结构化日志
Holo 生成包含结构化数据的日志消息,这些消息可以以多种格式呈现,如 JSON、文本等。由于日志记录通过 tracing 门面进行,因此可以使用不同的 tracing 订阅者来满足不同用户的需求。例如,日志可以定向到文件、journald、集中式 OpenTelemetry 收集器,或这些选项的任意组合,并可能具有不同的日志级别。
可复现的 Bug
Holo 提供录制与回放功能,能够轻松复现用户报告的任何 Bug。可以将 Holo 守护进程设置为将协议实例的完整生命周期记录到文件中。该文件随后可在另一台机器上回放,重现相同的事件序列。录制会话可能持续数小时或数天,但回放过程只需几秒钟。这得益于 Holo 的模块化架构,其中所有与时间相关和 I/O 操作都在单独的任务中执行,并抽象为事件消息。
安装
有关安装的详细说明,请参阅 INSTALL.md 文件。
支持平台
目前,Holo 仅兼容 Linux 操作系统。未来计划支持 WebAssembly。
快速开始
开始使用 Holo 的最简单方法是使用预构建的 Docker 容器并结合 containerlab 软件。您可以在 此链接 找到各种预配置的网络拓扑。这些拓扑可通过一条命令部署,使您能够在各种网络设置中测试 Holo,包括与其他实现进行互操作性测试。
此外,只要功能集符合您的特定需求,Holo 也可用于任何需要路由协议栈的场景,例如软件路由器。
合规性
Holo 支持以下互联网标准:
BFD
- RFC 5880 - 双向转发检测(BFD)
- RFC 5881 - IPv4 和 IPv6 双向转发检测(BFD)(单跳)
- RFC 5882 - 双向转发检测(BFD)的通用应用
- RFC 5883 - 多跳路径的双向转发检测(BFD)
BGP
- RFC 1997 - BGP 团体属性
- RFC 2385 - 通过 TCP MD5 签名选项保护 BGP 会话
- RFC 2545 - 使用 BGP-4 多协议扩展进行 IPv6 域间路由
- RFC 2918 - BGP-4 路由刷新能力
- RFC 4271 - 边界网关协议 4(BGP-4)
- RFC 4360 - BGP 扩展团体属性
- RFC 4486 - BGP 停止通知消息的子码
- RFC 4760 - BGP-4 的多协议扩展
- RFC 5082 - 通用 TTL 安全机制(GTSM)
- RFC 5492 - BGP-4 能力通告
- RFC 5668 - 4 字节 AS 特定 BGP 扩展团体
- RFC 5701 - IPv6 地址特定 BGP 扩展团体属性
- RFC 6286 - BGP-4 的自洽系统范围唯一 BGP 标识符
- RFC 6608 - BGP 有限状态机错误的子码
- RFC 6793 - BGP 对四字节自治系统(AS)编号空间的支持
- RFC 7606 - BGP UPDATE 消息的修订错误处理
- RFC 7607 - AS 0 处理的编码化
- RFC 8092 - BGP 大型团体属性
- RFC 8212 - 无策略时的默认外部 BGP(EBGP)路由传播行为
- RFC 8642 - 知名 BGP 团体的策略行为
- RFC 9774 - BGP 中 AS_SET 和 AS_CONFED_SET 的弃用
IS-IS
- ISO/IEC 10589 - 信息技术 — 系统间电信和信息交换 — 用于与提供无连接模式网络服务(ISO 8473)结合使用的系统间域内路由信息交换协议
- RFC 1195 - 在 TCP/IP 和双协议栈环境中使用 OSI IS-IS 进行路由
- RFC 3719 - 使用中间系统到中间系统(IS-IS)的互操作网络建议
- RFC 3787 - 使用中间系统到中间系统(IS-IS)的互操作 IP 网络建议
- RFC 5120 - M-ISIS:中间系统到中间系统(IS-IS)中的多拓扑(MT)路由
- RFC 5301 - IS-IS 动态主机名交换机制
- RFC 5303 - IS-IS 点到点邻接的三次握手
- RFC 5304 - IS-IS 加密认证
- RFC 5305 - IS-IS 流量工程扩展
- RFC 5308 - 使用 IS-IS 路由 IPv6
- RFC 5310 - IS-IS 通用加密认证
- RFC 6232 - IS-IS 的清除发起者标识 TLV
- RFC 6233 - IS-IS 清除的注册表扩展
- RFC 7308 - MPLS 流量工程(MPLS-TE)中的扩展管理组
- RFC 7602 - IS-IS 扩展序列号 TLV
- RFC 7794 - 用于扩展 IPv4 和 IPv6 可达性的 IS-IS 前缀属性
- RFC 7917 - IS-IS 中通告节点管理标签
- RFC 7981 - 用于通告路由器信息的 IS-IS 扩展
- RFC 7987 - IS-IS 最小剩余生存时间
- RFC 8401 - 通过 IS-IS 支持位索引显式复制(BIER)
- RFC 8405 - 链路状态 IGP 的最短路径优先(SPF)退避延迟算法
- RFC 8491 - 使用 IS-IS 信令最大 SID 深度(MSD)
- RFC 8570 - IS-IS 流量工程(TE)度量扩展
- RFC 8667 - IS-IS 段路由扩展
- RFC 8918 - IS-IS 中无效 TLV 的处理
- RFC 9479 - IS-IS 应用特定链路属性
- draft-ietf-bier-lsr-non-mpls-extensions-03 - BIER 非 MPLS 封装的 LSR 扩展
- draft-ietf-lsr-distoptflood-12 - IS-IS 分布式泛洪减少
- draft-westphal-lsr-isis-database-checksumming-00 - IS-IS 数据库指纹识别
MPLS LDP
- RFC 5036 - LDP 规范
- RFC 5561 - LDP 能力
- RFC 5918 - 标签分发协议(LDP)“类型通配符”转发等价类(FEC)
- RFC 5919 - 信令 LDP 标签通告完成
- RFC 6720 - 标签分发协议(LDP)的通用 TTL 安全机制(GTSM)
组播
OSPF
- RFC 2328 - OSPF 版本 2
- RFC 3623 - OSPF 优雅重启
- RFC 5187 - OSPFv3 优雅重启
- RFC 5243 - OSPF 数据库交换摘要列表优化
- RFC 5250 - OSPF 不透明 LSA 选项
- RFC 5340 - IPv6 的 OSPF
- RFC 5613 - OSPF 链路本地信令
- RFC 5642 - OSPF 动态主机名交换机制
- RFC 5709 - OSPFv2 HMAC-SHA 加密认证
- RFC 5838 - OSPFv3 中的地址族支持
- RFC 6987 - OSPF 末梢路由器通告
- RFC 7166 - 支持 OSPFv3 认证尾部
- RFC 7684 - OSPFv2 前缀/链路属性通告
- RFC 7770 - 用于通告可选路由器能力的 OSPF 扩展
- RFC 7777 - OSPF 中通告节点管理标签
- RFC 8362 - OSPFv3 链路状态通告(LSA)可扩展性
- RFC 8405 - 链路状态 IGP 的最短路径优先(SPF)退避延迟算法
- RFC 8476 - 使用 OSPF 信令最大 SID 深度(MSD)
- RFC 8665 - OSPF 段路由扩展
- RFC 8666 - OSPFv3 段路由扩展
- RFC 9983 - OSPFv2 任播属性通告
- draft-ietf-bier-ospfv3-extensions-07 - OSPFv3 BIER 扩展
- draft-ietf-bier-lsr-non-mpls-extensions-03 - BIER 非 MPLS 封装的 LSR 扩展
RIP
- RFC 2080 - IPv6 的 RIPng
- RFC 2453 - RIP 版本 2
- RFC 4822 - RIPv2 加密认证
VRRP
- RFC 3768 - 虚拟路由器冗余协议(VRRP)
- RFC 5798 - 虚拟路由器冗余协议(VRRP)版本 3(用于 IPv4 和 IPv6)
一致性测试
使用 Ixia IxANVL RFC 一致性测试仪进行的一致性测试结果可在 此处 获取。
IETF YANG 实现覆盖率