Holo:面向大规模自动化网络的路由协议套件
Holo 是一套旨在支持大规模和自动化驱动网络的路由协议。
架构
下图展示了 Holo 软件栈的不同逻辑层:
灰色背景的项目尚未实现。更全面和详细的信息,请访问架构[1]页面。
特点
专注于简洁性和正确性
Holo 的主要目标是创建一个可靠、易于维护和可扩展的代码库。随着路由协议及其扩展的复杂性不断增加,拥有建立在坚实基础之上的路由协议实现至关重要。为此,Holo 的代码库优先考虑简洁性、模块化和全面的文档。由于 Rust 编译器的严格性和广泛的单元测试,预计大多数回归问题将在新功能的开发周期早期被捕获。
准备好了自动化?
Holo 专门为需要使用结构化和建模数据进行可编程配置和监控的大规模、自动化驱动网络而开发。Holo 本地实现了 IETF 的标准 YANG 模块,并支持多种管理接口,包括本地的gRPC[2]和gNMI[3]。此外,Holo 还具有一个独立的CLI[4],它根据 YANG 模块动态渲染命令,并通过 gRPC 与 Holo 守护进程通信。
配置所做的更改被处理为事务,保证所有更改要么全部应用,要么一个也不应用。这一特性是网络自动化的重要促进因素,因为它消除了管理应用程序中的错误恢复需求。Holo 还支持涉及多个网络设备的网络范围事务。额外的网络自动化功能包括确认提交和配置回滚支持。
安全性
由于是用内存安全语言编写的,Holo 免于多种与内存相关的错误和安全漏洞。除了 Rust 提供的安全保证外,Holo 守护进程在启动时运行在 chroot jail 中,并降低权限。对于某些操作,如绑定套接字,Linuxcapabilities[5]被用来在最短的时间内获得最小所需的权限。
集成的协议实现
一些协议,如 OSPF 和 RIP,有不同的版本被广泛部署,通常一个是用于 IPv4,另一个用于 IPv6。Holo 利用 Rust 的泛型来实现与版本无关的协议实现,其中大部分代码由不同的协议版本共享。这种方法减少了这些协议的维护成本,并促进了新功能的发布,这些功能惠及所有协议版本。
并行性
Holo 广泛使用异步操作,并依赖于Tokio[6]运行时来调度任务并在线程池中运行它们。为了实现更好的性能,I/O 请求和 CPU 密集型算法都被卸载到单独的任务中,最大限度地利用所有可用的 CPU 核心。计划在未来支持运行时不可知代码,一旦 Rust 语言团队标准化了必要的抽象。
结构化日志记录
Holo 生成包含结构化数据的日志消息,这些消息可以以 JSON、文本等不同格式呈现。由于日志记录是通过tracing facade 进行的,可以利用不同的tracing订阅者来满足不同的用户需求。例如,日志可以定向到文件、journald、集中的 OpenTelemetry 收集器,或这些选项的任何组合,可能具有不同的日志级别。
可复现的错误
Holo 提供记录和重放功能,可以轻松复现任何用户报告的错误。Holo 守护进程可以设置为将协议实例的完整生命周期记录到文件中。然后可以在另一台机器上回放该文件,重现相同的事件序列。虽然记录会话可能持续数小时或数天,但回放过程应该只需要几秒钟。这得益于 Holo 的模块化架构,其中所有与时间相关的和 I/O 操作都在单独的任务中执行,并抽象为事件消息。
安装
Holo 使用不稳定的 Rust 特性,因此从源代码构建需要 Rust 编译器的夜间版本。
安装
Holo 使用了不稳定的 Rust 特性,因此从源代码构建需要 Rust 编译器的夜间版本。
从源代码构建
安装 Rust 工具链
如果你的系统中尚未安装 Rust,最佳安装方式是通过 rustup[7](确保选择夜间工具链)。
克隆 Holo 的 git 仓库
$ git clone https://github.com/holo-routing/holo.git
$ git clone https://github.com/holo-routing/holo-cli.git安装构建依赖项:
Holo 需要一些依赖项来构建和嵌入 libyang2 库。你可以使用系统包管理器安装它们。例如,在基于 Debian 的系统上:
# apt-get install build-essential cmake libpcre2-dev protobuf-compiler
构建
holod
和holo-cli
$ cd holo/
$ cargo build --release
$ cd ../holo-cli/
$ cargo build --release添加
holo
用户和组:# groupadd -r holo
# useradd --system --shell /sbin/nologin --home-dir /var/run/holo/ -g holo holo安装
将
target/release
目录中的holod
和holo-cli
二进制文件复制到你希望的位置。或者,你可以使用
cargo install
将这些二进制文件安装到$HOME/.cargo/bin
目录中。
配置
holod
配置包括以下内容:
/etc/holod.toml
:静态配置,一旦守护进程启动就不能更改。它主要用于配置启用哪些特性、插件参数等。 这里有一个包含默认值[8]的[示例]。如果此文件不存在,将使用默认值。运行时配置:这是正常的基于 YANG 模型的配置,只能通过北向客户端更改(例如 gRPC[9]、gNMI[10]、CLI[11] 等)。
支持的平台
目前,Holo 仅与 Linux 操作系统兼容。
计划将来支持 WebAssembly。这将使您能够在浏览器内模拟大型网络,使网络实验更加方便,更容易被每个人访问。
开始使用
开始使用 Holo 的最简单方法是使用预构建的 Docker 容器与containerlab[12]软件结合使用。您可以在this link[13]找到各种预配置的网络拓扑。这些拓扑可以通过单个命令部署,允许您在各种网络设置中测试 Holo,包括与其他实现的互操作性测试。
此外,Holo 可以用于任何需要路由栈的地方,例如在软件路由器中,前提是功能集与您的特定需求相符。
IETF YANG 实现覆盖情况
模块 | 配置 | 状态 | RPCs | 通知 | 总计 |
---|---|---|---|---|---|
ietf-bfd-ip-mh@2022-09-22 | 100.00% | 100.00% | - | 100.00% | 100.00%[14] |
ietf-bfd-ip-sh@2022-09-22 | 100.00% | 100.00% | - | 100.00% | 100.00%[15] |
ietf-bfd@2022-09-22 | 100.00% | 100.00% | - | - | 100.00%[16] |
ietf-bgp-policy@2023-07-05 | 100.00% | - | - | - | 100.00%[17] |
ietf-bgp@2023-07-05 | 32.38% | 85.95% | - | - | 60.40%[18] |
ietf-if-extensions@2023-01-26 | 100.00% | 0.00% | - | - | 50.00%[19] |
ietf-if-vlan-encapsulation@2023-01-26 | 42.86% | - | - | - | 42.86%[20] |
ietf-interfaces@2018-01-09 | 100.00% | 0.00% | - | - | 22.22%[21] |
ietf-ip@2018-01-09 | 52.17% | 0.00% | - | - | 40.00%[22] |
ietf-ipv4-unicast-routing@2018-03-13 | 100.00% | 100.00% | - | - | 100.00%[23] |
ietf-ipv6-unicast-routing@2018-03-13 | 40.62% | 100.00% | - | - | 45.71%[24] |
ietf-key-chain@2017-04-18 | 100.00% | 100.00% | - | - | 100.00%[25] |
ietf-mpls-ldp@2022-03-14 | 86.96% | 92.31% | 100.00% | 100.00% | 92.38%[26] |
ietf-mpls@2020-12-18 | 0.00% | 57.14% | - | - | 35.29%[27] |
ietf-ospf-sr-mpls@2024-01-18 | 25.00% | 53.95% | - | - | 52.81%[28] |
ietf-ospf@2022-10-19 | 75.00% | 59.64% | 100.00% | 41.94% | 59.57%[29] |
ietf-ospfv3-extended-lsa@2024-01-16 | 50.00% | 85.28% | - | - | 84.85%[30] |
ietf-rip@2020-02-20 | 27.91% | 93.33% | 100.00% | - | 55.41%[31] |
ietf-routing-policy@2021-10-11 | 100.00% | 0.00% | - | - | 98.11%[32] |
ietf-routing@2018-03-13 | 100.00% | 85.71% | - | - | 92.31%[33] |
ietf-segment-routing-mpls@2021-05-26 | 62.50% | 0.00% | - | 23.53% | 32.76%[34] |
ietf-segment-routing@2021-05-26 | 100.00% | - | - | - | 100.00%[35] |
合规性
Holo 支持以下 IETF RFC 和互联网草案:
BFD
RFC 5880 - Bidirectional Forwarding Detection (BFD) RFC 5881 - Bidirectional Forwarding Detection (BFD) for IPv4 and IPv6 (Single Hop) RFC 5882 - Generic Application of Bidirectional Forwarding Detection (BFD) RFC 5883 - Bidirectional Forwarding Detection (BFD) for Multihop Paths
BGP
RFC 1997 - BGP Communities Attribute RFC 2385 - Protection of BGP Sessions via the TCP MD5 Signature Option RFC 2545 - Use of BGP-4 Multiprotocol Extensions for IPv6 Inter-Domain Routing RFC 2918 - Route Refresh Capability for BGP-4 RFC 4271 - A Border Gateway Protocol 4 (BGP-4) RFC 4360 - BGP Extended Communities Attribute RFC 4486 - Subcodes for BGP Cease Notification Message RFC 4760 - Multiprotocol Extensions for BGP-4 RFC 5082 - The Generalized TTL Security Mechanism (GTSM) RFC 5492 - Capabilities Advertisement with BGP-4 RFC 5668 - 4-Octet AS Specific BGP Extended Community RFC 5701 - IPv6 Address Specific BGP Extended Community Attribute RFC 6286 - Autonomous-System-Wide Unique BGP Identifier for BGP-4 RFC 6608 - Subcodes for BGP Finite State Machine Error RFC 6793 - BGP Support for Four-Octet Autonomous System (AS) Number Space RFC 7606 - Revised Error Handling for BGP UPDATE Messages RFC 7607 - Codification of AS 0 Processing RFC 8092 - BGP Large Communities Attribute RFC 8212 - Default External BGP (EBGP) Route Propagation Behavior without Policies RFC 8642 - Policy Behavior for Well-Known BGP Communities
MPLS LDP
RFC 5036 - LDP Specification RFC 5561 - LDP Capabilities RFC 5918 - Label Distribution Protocol (LDP) 'Typed Wildcard' Forward Equivalence Class (FEC) RFC 5919 - Signaling LDP Label Advertisement Completion RFC 6720 - The Generalized TTL Security Mechanism (GTSM) for the Label Distribution Protocol (LDP)
OSPF
RFC 2328 - OSPF Version 2 RFC 3623 - Graceful OSPF Restart RFC 5187 - OSPFv3 Graceful Restart RFC 5243 - OSPF Database Exchange Summary List Optimization RFC 5250 - The OSPF Opaque LSA Option RFC 5340 - OSPF for IPv6 RFC 5709 - OSPFv2 HMAC-SHA Cryptographic Authentication RFC 5838 - Support of Address Families in OSPFv3 RFC 6987 - OSPF Stub Router Advertisement RFC 7684 - OSPFv2 Prefix/Link Attribute Advertisement RFC 7166 - Supporting Authentication Trailer for OSPFv3 RFC 7770 - Extensions to OSPF for Advertising Optional Router Capabilities RFC 8362 - OSPFv3 Link State Advertisement (LSA) Extensibility RFC 8405 - Shortest Path First (SPF) Back-Off Delay Algorithm for Link-State IGPs RFC 8476 - Signaling Maximum SID Depth (MSD) Using OSPF RFC 8665 - OSPF Extensions for Segment Routing RFC 8666 - OSPFv3 Extensions for Segment Routing
RIP
RFC 2080 - RIPng for IPv6 RFC 2453 - RIP Version 2 RFC 4822 - RIPv2 Cryptographic Authentication
架构: https://github.com/holo-routing/holo/wiki/Architecture
[2]gRPC: https://github.com/holo-routing/holo/wiki/gRPC
[3]gNMI: https://github.com/holo-routing/holo/wiki/gNMI
[4]CLI: https://github.com/holo-routing/holo/wiki/CLI
[5]capabilities: https://man7.org/linux/man-pages/man7/capabilities.7.html
[6]Tokio: https://github.com/tokio-rs/tokio
[7]rustup: https://rustup.rs/
[8]默认值: holo-daemon/holod.toml
[9]gRPC: https://github.com/holo-routing/holo/wiki/gRPC
[10]gNMI: https://github.com/holo-routing/holo/wiki/gNMI
[11]CLI: https://github.com/holo-routing/holo/wiki/CLI
[12]containerlab: https://containerlab.dev/
[13]this link: https://github.com/holo-routing/containerlab-topologies
[14]100.00%: http://westphal.com.br/holo/ietf-bfd-ip-mh.html
[15]100.00%: http://westphal.com.br/holo/ietf-bfd-ip-sh.html
[16]100.00%: http://westphal.com.br/holo/ietf-bfd.html
[17]100.00%: http://westphal.com.br/holo/ietf-bgp-policy.html
[18]60.40%: http://westphal.com.br/holo/ietf-bgp.html
[19]50.00%: http://westphal.com.br/holo/ietf-if-extensions.html
[20]42.86%: http://westphal.com.br/holo/ietf-if-vlan-encapsulation.html
[21]22.22%: http://westphal.com.br/holo/ietf-interfaces.html
[22]40.00%: http://westphal.com.br/holo/ietf-ip.html
[23]100.00%: http://westphal.com.br/holo/ietf-ipv4-unicast-routing.html
[24]45.71%: http://westphal.com.br/holo/ietf-ipv6-unicast-routing.html
[25]100.00%: http://westphal.com.br/holo/ietf-key-chain.html
[26]92.38%: http://westphal.com.br/holo/ietf-mpls-ldp.html
[27]35.29%: http://westphal.com.br/holo/ietf-mpls.html
[28]52.81%: http://westphal.com.br/holo/ietf-ospf-sr-mpls.html
[29]59.57%: http://westphal.com.br/holo/ietf-ospf.html
[30]84.85%: http://westphal.com.br/holo/ietf-ospfv3-extended-lsa.html
[31]55.41%: http://westphal.com.br/holo/ietf-rip.html
[32]98.11%: http://westphal.com.br/holo/ietf-routing-policy.html
[33]92.31%: http://westphal.com.br/holo/ietf-routing.html
[34]32.76%: http://westphal.com.br/holo/ietf-segment-routing-mpls.html
[35]100.00%: http://westphal.com.br/holo/ietf-segment-routing.html