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 网络编程
每月 186 次下载
用于 4 个 Crates (3 直接)
120KB
2.5K SLoC
Rust 中的边界网关协议 (bgp-rs)
一个用于解析边界网关协议 (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