#bgp #parser #protocols #border #gateway #stream #formatted

bgp-rs

解析边界网关协议 (BGP) 格式化流的库

7 个版本 (破坏性更新)

0.6.0 2020年6月27日
0.5.0 2019年5月22日
0.4.1 2019年2月23日
0.3.0 2019年2月12日
0.1.0 2019年2月2日

#1055 in 网络编程

Download history 21/week @ 2023-12-04 25/week @ 2023-12-11 8/week @ 2024-01-01 45/week @ 2024-01-08 38/week @ 2024-01-15 31/week @ 2024-01-22 28/week @ 2024-01-29 32/week @ 2024-02-05 25/week @ 2024-02-12 28/week @ 2024-02-19 52/week @ 2024-02-26 29/week @ 2024-03-04 38/week @ 2024-03-11 67/week @ 2024-03-18

每月 186 次下载
用于 4 个 Crates (3 直接)

GPL-3.0 许可证

120KB
2.5K SLoC

Rust 中的边界网关协议 (bgp-rs)

Build Status codecov

一个用于解析边界网关协议 (BGP) 格式化流的库。可以通过这种方式读取 UPDATE、OPEN、KEEPALIVE 和 NOTIFICATION 等消息。

示例 & 文档

读取包含 BGP4MP 消息的 MRT 文件

use std::fs::File;
use std::io::Cursor;
use std::io::Read;
use std::io::BufReader;
use mrt_rs::Record;
use mrt_rs::bgp4mp::BGP4MP;
use libflate::gzip::Decoder;
use bgp_rs::{Identifier, PathAttribute};

fn main() {
   // Download an update message.
   let file = File::open("res/updates.20190101.0000.gz").unwrap();

   // Decode the GZIP stream.
   let decoder = Decoder::new(BufReader::new(file)).unwrap();

   // Create a new MRTReader with a Cursor such that we can keep track of the position.
   let mut reader = mrt_rs::Reader { stream: decoder };

   // Keep reading MRT (Header, Record) tuples till the end of the file has been reached.
   while let Ok(Some((_, record))) = reader.read() {

       // Extract BGP4MP::MESSAGE_AS4 entries.
       if let Record::BGP4MP(BGP4MP::MESSAGE_AS4(x)) = record {

           // Read each BGP (Header, Message)
           let cursor = Cursor::new(x.message);
           let mut reader = bgp_rs::Reader::new(cursor);
           let (_, message) = reader.read().unwrap();

           // If this is an UPDATE message that contains announcements, extract its origin.
           if let bgp_rs::Message::Update(x) = message {
               if x.is_announcement() {
                   if let PathAttribute::AS_PATH(path) = x.get(Identifier::AS_PATH).unwrap()
                   {
                       // Test the path.origin() method.
                       let origin = path.origin();

                       // Do other stuff ...
                   }
               }
           }
       }
   }

读取包含 TABLE_DUMP_V2 消息的 MRT 文件

有关示例和文档,请参阅此处

支持的路径属性

IANA 有一个官方的 BGP 路径属性数字分配列表。下表显示了每个路径属性的状态

编号 属性 规范 状态
1 ORIGIN RFC4271 已实现
2 AS_PATH RFC4271 已实现
3 NEXT_HOP RFC4271 已实现
4 MULTI_EXIT_DISC RFC4271 已实现
5 LOCAL_PREF RFC4271 已实现
6 ATOMIC_AGGREGATE RFC4271 已实现
7 AGGREGATOR RFC4271 已实现
8 COMMUNITY RFC1997 已实现
9 ORIGINATOR_ID RFC4456 已实现
10 CLUSTER_LIST RFC4456 已实现
11 DPA (已弃用) RFC6938 已实现
12 ADVERTISER (已弃用) RFC1863 RFC4223 RFC6938 尚未实现
13 RCID_PATH / CLUSTER_ID (已弃用) RFC1863 RFC4223 RFC6938 尚未实现
14 MP_REACH_NLRI RFC4760 已实现
15 MP_UNREACH_NLRI RFC4760 已实现
16 EXTENDED_COMMUNITIES RFC4360 已实现
17 AS4_PATH RFC6793 已实现
18 AS4_AGGREGATOR RFC6793 已实现
19 SAFI 特定属性 (已弃用) draft-wijnands-mt-discovery-00 尚未实现
20 CONNECTOR RFC6037 已实现
21 AS_PATHLIMIT draft-ietf-idr-as-pathlimit 已实现
22 PMSI_TUNNEL RFC6514 已实现
23 隧道封装 RFC5512 已实现
24 流量工程 RFC5543 尚未实现
25 IPv6 地址特定扩展社区 RFC5701 已实现
26 AIGP RFC7311 已实现
27 PE 区别标签 RFC6514 尚未实现
28 BGPS熵标签能力 (已弃用) RFC6790 RFC7447 尚未实现
29 BGP-LS RFC7752 尚未实现
32 LARGE_COMMUNITY RFC8092 已实现
33 BGPSEC_PATH RFC8205 尚未实现
34 BGP社区容器 (临时) draft-ietf-idr-wide-bgp-communities 尚未实现
35 仅限内部客户使用 (临时) draft-ietf-idr-bgp-open-policy 尚未实现
40 BGP前缀-SID RFC-ietf-idr-bgp-prefix-sid-27 尚未实现
128 ATTR_SET RFC6368 已实现

最低支持的Rust版本

本crate最低支持的rustc版本是1.34.2

Crate特性

默认特性集包括上述属性的BGP消息的编码和解码

启用Flowspec NLRI

要启用Flowspec NLRI(SAFI 133)解析(RFC5575),指定flowspec特性

[dependencies]
...
bgp-rs = { version = "*", features = ["flowspec"]}
...

注意:这将添加bitflags依赖

依赖

~145KB