获取广域网 BGP 路由表(Route-Views) & Bgpdump
获取广域网 BGP RIB 表,解包及简单处理.
资料来源:
https://blog.csdn.net/wx6gml18/article/details/107310835
https://github.com/RIPE-NCC/bgpdump
http://dongdaima.com/article/46728/#/更新
1
22021.04.10 初始
2021.08.01 修正拆包速度
导语
最近接手的项目需要用到广域网的 BGP 路由表,又是一番左右横跳 Google
由于不是接收分析,因此只下载到数据即可.
根据 CIDR REPORT,截至 4月10日
- ipv4 875435 条
- ipv6 118186 条
简单 CIDR 能缩减一半数量,这里需要原始数据,就不涉及了.
Put 500,000+ BGP routes in your lab network!!! Download this VM and become your own upstream BGP ISP for testing 这一篇是介绍直接 down bgp 数据,只有 ipv4 可惜项目早就不更新了,并未尝试可用性.
不同组织机构所收集的与 BGP 相关的数据 介绍了一些收集 bgp 数据的组织和项目.
只需要数据可以到 Route-Views 下载.
Route-Views
Route-Views 应该已经运营了非常久了,上古数据都有.
在 University of Oregon Route Views Archive Project 找到你想下数据的 AS.这里直接选择 第一个
- 一般是两个小时生成一次数据
- 有完整 update / rib 数据,自取.
这里选择 rib.20210401.0000.bz2 119M.
bz2 压缩的是 mrt 格式的数据,拆包分析一般要用到 bgpdump
bgpdump
bgpdump 就不介绍高级功能了,只用来拆包了.
拆包的命令 bgpdump -m xxx.bz2 > output.txt
拆包后 output.txt 差不多要 4 GB.而且拆包很慢,能到内存盘完成拆包,尽量内存盘. 是 wsl2 跨win linux 磁盘 io 问题,直接 wsl2 挂载完全没问题,拆包不到 10 分钟.
bgpdump 需要编译,一般这样的工作都扔到 docker 了.
安装
需要 autoconf gcc zlib-devel, bzip2-devel make
执行
1
2
3sh ./bootstrap.sh
make
make install
参考的 Dockerfile (附: ubuntu 下太折腾了,还是 alpine 简单)
1 | FROM alpine:latest |
最后执行的命令,别吐槽了,只是为了不让容器停止…
之后只需要把 .bz2 文件挂载到容器,运行命令即可.
docker-compose.yml
1 | version: '3' |
output.txt
Google 到了这个 AS、BGP 相关数据汇总 似乎是 中国科学院信息工程研究所,第二研究室 处理架构组 😂 ? 不过文件介绍挺详细…
一条解包后数据
1 | TABLE_DUMP2|1617602401|B|212.66.96.126|20912|1.22.196.0/24|20912 3257 9498 45528 45528 45528 45528 45528|IGP|212.66.96.126|0|0|3257:2590 3257:2990 3257:4000 3257:8801 3257:50001 3257:50110 3257:53300 3257:53302 20912:65004|NAG|| |
TABLE_DUMP2: BGP Protocol
1617602401 : timestamp 时间戳
B
- W/A/B : withdrawal/announcement/routing table
- withdrawal相当于前缀不可用.
(忽略)212.66.96.126
- 当前collector的一个邻居,它向这个collecor传播了此条路由
20912: Peer AS号
1.22.196.0/24: 起始IP段,前缀
20912 3257 9498 45528 45528 45528 45528 45528 : ASPath
IGP
- 路由的Origin属性代码
- IGP/EGP
(忽略)212.66.96.126
- next Hop 当前collector所在AS要去往prefix的下一跳,应该就是PeerIP
0: LocalPref本地优先级
0: MED
3257:2590 3257:2990 3257:4000 3257:8801 3257:50001 3257:50110 3257:53300 3257:53302 20912:65004 : Community strings
NAG
- Atomic Aggregator
- NAG没自动聚合,AG自动聚合
处理 output.txt
output.txt 有 4GB 直接打开,破电脑内存爆了…还是最推荐的 with open
这样缓存和 io 都直接交给系统管理.
1 | with open(filename) as file: |
split
是分解数据,正好一条数据全部由 |
隔开.
1 | def split(str: str,flag:str = '|') -> List[str]: |
分析网络数据时候,一定会用到 ipaddress
.官方文档很详细..
一点小坑,需要用到声明前缀的 AS 号,有的 ASPath 最初始 AS 是 {45528}
,没法直接转成 int ,需要正则 '\d+
过滤一下.
因为表里有 ipv4 和 ipv6 数据,可以按照位置或者正则过滤.
- ipv4 + mask
^((25\[0-5\]|2\[0-4\]\\d|\[01\]?\\d\\d?)\\.){3}(25\[0-5\]|2\[0-4\]\\d|\[01\]?\\d\\d?)(\\/(\\d|\[1-2\]\\d|3\[0-2\]))?$
其他
如果不需要原始的 RIB 表,可以到 CIDR REPORT 爬一些数据.
AS-Rating: 很详尽的 AS 数据
my_info: 本机 ip 及一些连接信息.
结语
数据量不算小,都放到内存盘也就2,3分钟,但是后续分析估计得用到 多进程+协程+内存盘 才能把运行时间降低到可接受的水平.