Holo:面向大规模自动化网络的路由协议套件

文摘   2024-06-22 00:00   江苏  

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 编译器的夜间版本。

从源代码构建

  1. 安装 Rust 工具链

    如果你的系统中尚未安装 Rust,最佳安装方式是通过 rustup[7](确保选择夜间工具链)。

  2. 克隆 Holo 的 git 仓库

    $ git clone https://github.com/holo-routing/holo.git
    $ git clone https://github.com/holo-routing/holo-cli.git
  3. 安装构建依赖项:

    Holo 需要一些依赖项来构建和嵌入 libyang2 库。你可以使用系统包管理器安装它们。例如,在基于 Debian 的系统上:

    # apt-get install build-essential cmake libpcre2-dev protobuf-compiler
  4. 构建 holodholo-cli

    cd holo/
    $ cargo build --release
    cd ../holo-cli/
    $ cargo build --release
  5. 添加 holo 用户和组:

    # groupadd -r holo
    # useradd --system --shell /sbin/nologin --home-dir /var/run/holo/ -g holo holo
  6. 安装

    target/release 目录中的 holodholo-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-22100.00%100.00%-100.00%100.00%[14]
ietf-bfd-ip-sh@2022-09-22100.00%100.00%-100.00%100.00%[15]
ietf-bfd@2022-09-22100.00%100.00%--100.00%[16]
ietf-bgp-policy@2023-07-05100.00%---100.00%[17]
ietf-bgp@2023-07-0532.38%85.95%--60.40%[18]
ietf-if-extensions@2023-01-26100.00%0.00%--50.00%[19]
ietf-if-vlan-encapsulation@2023-01-2642.86%---42.86%[20]
ietf-interfaces@2018-01-09100.00%0.00%--22.22%[21]
ietf-ip@2018-01-0952.17%0.00%--40.00%[22]
ietf-ipv4-unicast-routing@2018-03-13100.00%100.00%--100.00%[23]
ietf-ipv6-unicast-routing@2018-03-1340.62%100.00%--45.71%[24]
ietf-key-chain@2017-04-18100.00%100.00%--100.00%[25]
ietf-mpls-ldp@2022-03-1486.96%92.31%100.00%100.00%92.38%[26]
ietf-mpls@2020-12-180.00%57.14%--35.29%[27]
ietf-ospf-sr-mpls@2024-01-1825.00%53.95%--52.81%[28]
ietf-ospf@2022-10-1975.00%59.64%100.00%41.94%59.57%[29]
ietf-ospfv3-extended-lsa@2024-01-1650.00%85.28%--84.85%[30]
ietf-rip@2020-02-2027.91%93.33%100.00%-55.41%[31]
ietf-routing-policy@2021-10-11100.00%0.00%--98.11%[32]
ietf-routing@2018-03-13100.00%85.71%--92.31%[33]
ietf-segment-routing-mpls@2021-05-2662.50%0.00%-23.53%32.76%[34]
ietf-segment-routing@2021-05-26100.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
参考资料
[1]

架构: 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


编程悟道
自制软件研发、软件商店,全栈,ARTS 、架构,模型,原生系统,后端(Node、React)以及跨平台技术(Flutter、RN).vue.js react.js next.js express koa hapi uniapp Astro
 最新文章