获取广域网 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
    2021.04.10 初始

导语

最近接手的项目需要用到广域网的 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.而且拆包很慢,能到内存盘完成拆包,尽量内存盘.

bgpdump 需要编译,一般这样的工作都扔到 docker 了.

安装

  • 需要 autoconf gcc zlib-devel, bzip2-devel make

  • 执行

    1
    2
    3
    sh ./bootstrap.sh
    make
    make install

参考的 Dockerfile (附: ubuntu 下太折腾了,还是 alpine 简单)

1
2
3
4
5
6
7
8
9
10
11
12
FROM alpine:latest

RUN apk upgrade --no-cache \
&& apk add --no-cache autoconf gcc libc-dev zlib-dev bzip2-dev make git

RUN git clone https://github.com/RIPE-NCC/bgpdump.git \
RUN cd bgpdump \
&& sh ./bootstrap.sh \
&& make \
&& make install

CMD [ "top" ]

最后执行的命令,别吐槽了,只是为了不让容器停止…

之后只需要把 .bz2 文件挂载到容器,运行命令即可.

docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
version: '3'

services:

bgpdump:
build: ./Docker
image: bgpdump:latest
container_name: bgpdump
restart: always
volumes:
- ./bgpdata:/bgpdata

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
2
3
with open(filename) as file:
for line in file:
yield split(line)

split 是分解数据,正好一条数据全部由 | 隔开.

1
2
def split(str: str,flag:str = '|') -> List[str]:
return str.split(flag)

分析网络数据时候,一定会用到 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分钟,但是后续分析估计得用到 多进程+协程+内存盘 才能把运行时间降低到可接受的水平.