#routes #rpsl #bgp #verification #routing #irr #parser

route_verification_shared_struct

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

4个版本

新增 0.2.1 2024年8月18日
0.2.0 2024年5月16日
0.1.1 2024年3月10日
0.1.0 2023年11月6日

#13 in #irr

Download history 11/week @ 2024-04-22 6/week @ 2024-04-29 7/week @ 2024-05-06 166/week @ 2024-05-13 38/week @ 2024-05-20 45/week @ 2024-05-27 19/week @ 2024-06-03 22/week @ 2024-06-10 15/week @ 2024-06-17 16/week @ 2024-06-24 7/week @ 2024-07-01 2/week @ 2024-07-08 19/week @ 2024-07-15 3/week @ 2024-07-22 14/week @ 2024-07-29 15/week @ 2024-08-05

每月51次下载
9 个crate中(直接使用3个)使用

MIT 许可证

11KB
92

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

RPSLyzer提供库和示例,用于从互联网路由注册处(IRRs)解析路由策略规范语言(RPSL),并验证从BGP表转储中获取的域间路由。解析的重点在于与路由策略相关的RPSL对象和属性,集中在aut-num对象上。对于验证,我们只需遍历每个BGP路由中的AS路径,并使用路由的上下文来解释每个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。我们将其作为rpsl-lexer发布到PyPI。

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

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

  • 位于 ./route_verification/ 的 RPSL 解析器、验证逻辑和读取-评估-打印循环(REPL)脚本示例是一系列 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-relationship 数据集 以增强验证。
    • route_verification_bgp 优化 IR 以供查询,并验证 BGP 路由是否与 IR 一致。它可以选择性地合并来自 AS-relationship 数据集的信息(通过伪 as-set),并在验证期间根据这些关系应用特殊情况。

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

    我们选择 Rust 来实现 IR、解析器和验证逻辑,因为 Rust 的枚举类型具有强类型且在 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接受。我们正在制作最终版本,并将在此处链接预印本。

依赖关系

~0.4–1MB
~22K SLoC