#rpsl #routes #bgp #routing #irr #parser #specification-language

route_verification_bgp

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

7 个版本 (破坏性)

新版本 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 日

#17#specification-language

Download history 75/week @ 2024-05-10 53/week @ 2024-05-17 16/week @ 2024-05-24 10/week @ 2024-05-31 5/week @ 2024-06-07 5/week @ 2024-06-14 8/week @ 2024-07-05 127/week @ 2024-08-16

每月 127 次下载
3 个包中使用 (通过 route_verification

MIT 许可证

270KB
5K SLoC

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

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

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

用法

作为用户,您需要安装所需的工具、设置环境,并直接使用 Rust 包 route_verification。请参阅 ./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)。我们主要从Rust库(route_verification_lex)通过UNIX管道调用这个库。

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

  • 位于./route_verification/的RPSL解析器、验证逻辑和REPL脚本是Rust crates(Rust包)和脚本的系列。所有主要库crates都重新导出到route_verification crate中。

    所有重新导出的crates在其路径名称前都添加了route_verification_。在这些crates中

    • 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是生成目录中所有BGP表转储的统计信息的主体脚本,包括AS、AS对和路由级别。

    我们选择Rust来编写IR、解析器和验证逻辑,因为它具有强类型枚举(enum)和针对CPU密集型任务的良好性能。

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

  • ./ARTIFACTS.md./ALIASES.md解释了如何运行脚本以及常见变量名的含义。这些文档仍然是工作进展中;请参见#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接受。我们正在制作最终版本,并将在此处链接预印本。

依赖项

~10–18MB
~242K SLoC