#rpsl #routes #irr #routing #bgp #verification #internet

route_verification_irr

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

5个版本

新版本 0.2.2 2024年8月18日
0.2.1 2024年5月16日
0.2.0 2024年3月10日
0.1.1 2023年11月25日
0.1.0 2023年11月6日

#8 in #irr

Download history 114/week @ 2024-05-12 24/week @ 2024-05-19 13/week @ 2024-05-26 8/week @ 2024-06-02 5/week @ 2024-06-09 1/week @ 2024-06-16 8/week @ 2024-06-30

每月293次下载
3个crate中使用(通过route_verification

MIT许可证

170KB
2.5K SLoC

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相关的请求评论(RFC)。请查看这些文件以了解我们使用的RPSL相关术语和RPSLyzer的限制。

  • ./rpsl_lexer/中的RPSL词法分析器使用PyParsing和Python,与PyPy兼容。我们将其作为rpsl-lexer发布到PyPI。[链接](https://pypi.ac.cn/project/rpsl-lexer/)。

    rpsl-lexer将特定的RPSL语法(特别是mp-importmp-export、以及包含<peering><filter>部分的)转换为抽象语法树(AST)。我们主要通过UNIX管道从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-关系数据集以增强验证。
    • route_verification_bgp优化IR以进行查询并验证BGP路由与IR的一致性。它可以选择性地合并AS-关系数据集中的信息(通过伪as-set),并在验证期间根据这些关系应用特殊情况。

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

    我们选择Rust来处理IR、解析器和验证逻辑,因为它的强类型enum化以及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 接受。我们正在制作最终版本,并将在此处链接预印本。

依赖项

~7–11MB
~204K SLoC