#rpsl #routing #routes #bgp #specification-language #verification #policy

bin+lib route_verification

解析 IRR 中的 RPSL 以验证观察到的 BGP 路由

8 个版本 (破坏性更新)

新增 0.7.0 2024 年 8 月 18 日
0.6.0 2024 年 5 月 16 日
0.5.0 2024 年 4 月 19 日
0.4.0 2024 年 3 月 27 日
0.1.0 2023 年 11 月 6 日

#613 in 网络编程

Download history 7/week @ 2024-04-22 123/week @ 2024-05-13 17/week @ 2024-05-20 15/week @ 2024-05-27 5/week @ 2024-06-10

每月 435 次下载
用于 2 crates

MIT 许可证

425KB
8K SLoC

RPSLyzer:解析 RPSL 策略并验证 BGP 路由

RPSLyzer 提供库和示例,用于从互联网路由注册库 (IRRs) 中解析路由策略规范语言 (RPSL) 并验证来自边界网关协议 (BGP) 表转储的域间路由。解析的重点在于与路由策略相关的 RPSL 对象和属性,集中于 aut-num 对象。对于验证,我们简单地遍历每个 BGP 路由中的 AS-path,并使用路由的上下文来解释每个 AS 的 aut-num 对象中的策略。

解析 RPSL 后,我们以与 JSON 兼容的嵌套 Rust 数据结构公开中间表示 (IR)。您可以通过序列化的 JSON 从其他语言访问此 IR。

用法

作为用户,您需要安装所需的工具、设置环境并直接使用 route_verification Rust 包。请参阅 ./ARTIFACTS.md 了解我们的数据收集、解析、验证和分析工作流程。注意:./ARTIFACTS.md 是一个正在进行的工作 (WIP);请参阅 #164

仓库结构

  • 我们在 ./rfcs/ 中注释与 RPSL 相关的请求评论 (RFCs)。请查阅这些文档了解我们使用的 RPSL 相关术语和 RPSLyzer 的限制。

  • 位于 ./rpsl_lexer/ 的 RPSL 词法分析器使用 PyParsing 和 Python,且与 PyPy 兼容。我们将其发布在 PyPI 上,项目名为 rpsl-lexer

    rpsl-lexer 将特定的 RPSL 语法(如 mp-importmp-export,以及包含 <peering><filter> 的部分)转换为抽象语法树(AST)。我们主要通过 UNIX 管道从 Rust 库(route_verification_lex)调用这个库。

    我们选择使用 PyParsing 进行词法分析,以利用解析表达式语法(PEG)在递归定义表达式中的强大功能。

  • 位于 ./route_verification/ 的 RPSL 解析器、验证逻辑和交互式命令行脚本示例是一系列 Rust 包(Rust 包)和脚本。所有主要的库包都已在 route_verification 中重新导出。

    所有重新导出的包都在其路径名前添加了 route_verification_

    • route_verification_ir 定义了中间表示(IR)和相关过程。
    • route_verification_lex 将 RPSL 源代码转换为 AST。它需要设置 rpsl-lexer 以进行词法分析(参见上文)。
    • route_verification_parse 将 RPSL 源代码转换为 IR。它利用 route_verification_lex 进行词法分析,然后将 AST 转换为 IR。
    • route_verification_irr 从 IRR 中解析 RPSL 源代码并将它们合并到一个单一的 IR 中。
    • route_verification_as_rel 解析来自应用互联网数据分析中心(CAIDA)的 AS-关系数据集 以增强验证。
    • route_verification_bgp 优化 IR 以进行查询,并验证 BGP 路由与 IR。它可以选择合并来自 AS-关系数据集(通过伪 as-set)的信息,并在验证过程中根据这些关系应用特殊情况。

    此外,route_verification 提供了一个命令行界面(CLI),用于解析 IRR 和测试运行验证。REPL 脚本位于 ./route_verification/src/evcxr_examples.rs 模块中。route_verification_rib_stats 是一个主脚本,用于生成目录中所有 BGP 表转储的统计信息,包括 AS、AS 对和路由级别。

    我们选择 Rust 来编写 IR、解析器和验证逻辑,因为它在 CPU 密集型任务中的类型安全枚举和令人满意的表现。

  • 我们用于分析和可视化结果(位于 ./scripts/)的脚本可以作为这些任务的示例。其中大多数是用 Python 编写的,并利用了常见的 Python 数据分析库,尽管其中一个 CPU 密集型脚本是用 Rust 编写的。

  • ./ARTIFACTS.md./ALIASES.md 解释了如何运行脚本以及常见变量名的含义。这些仍然是 WIP;请参阅 #164

除了代码和简短文档外,该仓库的问题还包含关于此项目的详细讨论和开发记录。如果您遇到问题,我们建议使用GitHub的搜索来查找相关信息。

构建工具

我们在所有地方都使用用户友好、可重复和自动化的构建工具。所有Rust包都使用Cargo,Python库和脚本使用Rye。有关更多信息,请参阅./ARTIFACTS.md

Rust调试

  • 启用日志记录

    export RUST_LOG=route_verification=trace
    
  • 在错误信息中启用堆栈跟踪

    export RUST_BACKTRACE=1
    

测试

请参阅GitHub Actions中的最新测试,位置在.github/workflows/

维护状态

维护模式。我们目前没有积极开发此项目。只考虑错误修复贡献。请根据需要进行分叉和修改。

论文

这是对应于论文《RPSLyzer:互联网路由注册表中策略的特性和验证》的代码和问题仓库。该论文已被ACM IMC'24接受。我们正在制作最终版本,并将在此处链接预印本。

依赖项

~13-22MB
~371K SLoC