4、监控数据源:BGP Update消息捕获、RIB表分析、NetFlow/sFlow数据采集
做BGP安全监控,第一步不是写规则,也不是调告警。
第一步是搞清楚——数据从哪来?
我见过不少团队,上来就搞机器学习、搞AI检测,结果连BGP Update报文都没抓全。说白了,地基没打好,楼盖得再高也是危房。
这一节,咱们就聊聊监控数据源的三个核心抓手:BGP Update消息捕获、RIB表分析、NetFlow/sFlow数据采集。这三样东西,就像监控系统的三根支柱,缺一根都站不稳。
4.1 BGP Update消息捕获——最直接的“心跳”
BGP Update消息是什么?说白了,就是路由器之间在喊话:
- “我有一条新路由,前缀是203.0.113.0/24,下一跳是10.0.0.1。”
- “我撤回一条路由,192.0.2.0/24我不再可达。”
每一次Update,都意味着网络拓扑发生了变化。攻击者想搞事情,也必然通过Update消息来注入恶意路由。
捕获方式,我一般推荐两种:
- 直接抓包:在边界路由器上做端口镜像,把BGP会话的流量(TCP 179端口)复制一份出来。工具用tcpdump或者Wireshark都行。但要注意,BGP会话可能很多,流量不小,别把监控网卡打爆了。
- 使用BGP监测工具:比如BGPStream、ExaBGP、OpenBMP。这些工具专门为BGP监控设计,能解析Update消息,提取出前缀、AS_PATH、Community等关键属性。
我个人习惯用BGPStream。它支持从多个数据源同时采集,而且能直接输出JSON格式,方便后续丢进ELK或者Splunk里做分析。
举个例子,用tcpdump抓BGP Update:
# 在边界路由器上执行
tcpdump -i eth0 -s 0 -w bgp_updates.pcap "tcp port 179"
抓下来的pcap文件,可以用Wireshark打开,过滤bgp.update,就能看到每一条Update的详细信息。
避坑指南:我曾经在客户现场遇到过一个问题——抓包文件太大,磁盘写满了。后来我加了个轮转策略,每个文件500MB,保留最近7天。命令改成:tcpdump -i eth0 -s 0 -W 7 -C 500 -w bgp_%Y%m%d.pcap "tcp port 179"。嗯,稳了。
4.2 RIB表分析——看清“全貌”
BGP Update消息是“动态”的,它告诉你发生了什么变化。但光看变化还不够,你还需要知道“当前状态”是什么样的。
这就是RIB(Routing Information Base)表的作用。
RIB表,说白了就是路由器内存里的那张大表。里面记录了所有BGP路由的详细信息:前缀、下一跳、AS_PATH、Local Preference、MED、Community……
为什么要分析RIB表?
- 攻击者可能不是通过Update注入恶意路由,而是通过篡改现有路由的属性。比如,把某个前缀的AS_PATH改短,让它变成最优路径。
- 有些攻击是“慢速”的,一天只改几条路由。光看Update消息可能发现不了,但对比前后两天的RIB表,差异就出来了。
获取RIB表的方法:
- 通过路由器命令行:
show bgp ipv4 unicast或者show bgp ipv6 unicast。但这种方式适合临时查看,不适合持续监控。 - 使用BGP监测工具:OpenBMP支持定期从路由器拉取RIB表快照。BGPStream也有RIB解析功能。
- 从Route Server或Route Collector获取:比如RouteViews、RIPE RIS。这些项目公开了全球BGP路由表,你可以定期下载并分析。
我建议的做法:每天凌晨2点,从路由器拉一次完整的RIB表,存到数据库里。然后写个脚本,对比今天的表和昨天的表,找出新增、删除、变化的路由。这个脚本,我管它叫“BGP差异分析器”。
RIB表分析的核心指标,我列了个表:
| 指标 | 说明 | 异常信号 |
|---|---|---|
| 前缀数量 | RIB表中IPv4/IPv6前缀的总数 | 突然暴增或骤降 |
| AS_PATH长度 | 每条路由的AS_PATH包含的AS数量 | 某条路由的AS_PATH突然变短(可能是路径劫持) |
| 下一跳变化 | 路由的下一跳IP是否改变 | 大量路由的下一跳指向同一个IP(可能是黑洞路由) |
| Community属性 | 路由携带的Community值 | 出现未知或异常的Community |
4.3 NetFlow/sFlow数据采集——看清“流量”
BGP Update和RIB表告诉你“路由怎么走”,但NetFlow/sFlow告诉你“流量怎么流”。
你想想看,如果攻击者成功劫持了某条路由,流量就会绕道。这个“绕道”的行为,在NetFlow数据里会留下痕迹。
NetFlow vs sFlow,有什么区别?
- NetFlow:Cisco的协议,基于“流”的概念。一个流就是一组具有相同五元组(源IP、目的IP、源端口、目的端口、协议)的报文。NetFlow会缓存流信息,然后定期导出。
- sFlow:基于“采样”的协议。它不缓存流,而是随机采样报文,然后立即发送采样结果。sFlow的优点是资源消耗小,适合高速网络。
我个人的选择:
- 如果网络规模不大(几百台设备以内),用NetFlow v9或IPFIX。数据更完整,分析更精确。
- 如果网络规模很大(几千台设备,或者核心链路带宽超过100Gbps),用sFlow。采样率可以设成1:1000甚至1:10000,够用就行。
我曾经踩过一个坑:在客户的核心路由器上开启了NetFlow,采样率设成了1:1(全量采集)。结果路由器CPU直接飙到90%,差点把业务打挂了。后来我改成1:1000,CPU降到20%,数据也够用。嗯,采样率不是越高越好,够用就行。
NetFlow/sFlow数据怎么用?我一般关注这几个维度:
- 流量突变:某个前缀的流量突然暴增或骤降。暴增可能是DDoS攻击,骤降可能是路由被劫持导致流量绕道。
- 异常路径:流量经过的AS路径和BGP路由表里的AS_PATH不一致。这说明流量可能走了“非预期”的路径。
- 新出现的流量:某个IP段之前几乎没有流量,突然出现大量流量。这可能是攻击者在探测或者扫描。
4.4 三种数据源的协同关系
这三种数据源,不是孤立的。它们之间是互补关系:
- BGP Update:告诉你“路由变了”。但变了之后,流量有没有受影响?不知道。
- RIB表:告诉你“路由当前是什么样”。但流量是不是真的按这个路由在走?不一定。
- NetFlow/sFlow:告诉你“流量实际怎么走”。但流量为什么这么走?需要结合BGP数据来分析。
所以,一个成熟的BGP攻击监控方案,一定是三者结合。用BGP Update和RIB表做“路由层面的检测”,用NetFlow/sFlow做“流量层面的验证”。
下面这张图,是我自己画的一个数据流关系图,你看一眼就明白了:
你看,BGP Update捕获到一条新路由,会更新RIB表。RIB表的变化,会触发NetFlow/sFlow去验证流量是否真的走了新路径。如果流量路径和路由表不一致,那就说明有问题了——可能是路由被劫持,也可能是流量被篡改。
注意:这三种数据源的采集频率要协调好。BGP Update是实时的,RIB表可以每天拉一次,NetFlow/sFlow的采样周期建议设为1-5分钟。如果频率太高,数据量太大,存储和计算都扛不住。如果频率太低,又可能漏掉攻击。
好了,数据源这块就聊到这儿。记住一句话:数据是监控的血液,没有数据,一切分析都是空谈。把这三个数据源搞扎实了,后面的告警规则、自动化响应才有意义。
公众号:蓝海资料掘金营,微信deep3321