关于网络拓扑自发现,这项技术已经是个很老的课题,早在08年就有前辈提出了相关算法,我这篇文章就是根据前辈们踩的坑,总结凝炼了利用snmp协议完成网路拓扑自发现的方法,因为snmp都是遵循rfc1213标准建立相应的mib库信息,而使用命令cli的方式采集路由表、Mac、端口转发表的方式会遇到异构产品底层命令适配的问题。关于数据的范式化和数据处理、数据展现都将是挑战。好了,废话不多说,那就简单分析一下拓扑发现的过程。
本功能模块主要是实现网络环境下网络拓扑的自适应和自发现

主要分为三部分:

网络层拓扑发现
链路层拓扑发现
主机层拓扑发现
网络拓扑发现
网络拓扑发现的主要目的是获取和维护网络节点的存在信息和它们之间的连接关系信息,并在此基础上绘制出整个网络拓扑图。网络管理人员在拓扑图的基础上对故障节点进行快速定位。
二层网络拓扑
二层网络拓扑即OSI参考模型中第二层的网络拓扑,称为链路层网络拓扑。网络拓扑发现是网络管理的基本工作,从底层看是交换机之间的连接关系。只有物理拓扑才能准确地定位网络中的故障,精确地测定某个位置的性能和状态。
三层网络拓扑
三层网络拓扑是OSI参考模型中的第三层,它描述的是路由器、子网之间的连接关系。
OID
对象标识(Object identifier-OID)为每一个对象分配一个唯一的表示号。
SNMP
SNMP 是用于在 IP 网络管理网络节点的一种标准协议。SNMP 使网络管理员能够管理网络效能,发现并解决网络问题以及规划网络增长。通过 SNMP 接收随机消息,网络管理系统获知网络出现问题。


基于二/三层网络拓扑发现方法 (网络层和链路层拓扑发现)

第一步:生成3层网络层网络拓扑
本算法采集设备信息,可以通过SNMP采集或者登录设备采集,优先选择SNMP采集(表如何利用snmp协议发现大型复杂环境的网络拓扑(建议开发自动化工具的朋友可以看一下)_第1张图片
列出了用SNMP采集所需信息的OID点)。当设备不支持SNMP采集时,登录设备采集。

路由表中的每个条目都包含ipRouteDest、ipRouteIfIndex、ipRouteNextHop、ipRouteType和ipRouteMask这几项。其中,ipRouteDest表示路由的目的地址,ipRouteMask表示路由目标地址的子网掩码,将ipRouteDest和ipRouteMask按位与可以得到路由目标地址所在的子网;ipRoutelflndex表示路由本地接口的索引值,三层设备将目的地址为ipRouteDest的IP包通过该接口转发;ipRouteType表示了路由的类型,当路由类型值为3(direct)时,说明三层设备直接连接到路由目的地址所在子网,当路由类型值为4 (indirect)时,说明三层设备不直接连接到路由目的地址所在子网,必须再经过其它三层设备,即为路由表中的ipRouteNextHop,此时三层设备通过本地接口ipRoutelflndex与下一跳三层设备直接连接。

以cisco 3750 (10.95.32.10)核心交换机为例:
ipRouteDest OID
1.3.6.1.2.1.4.22 ARP表
如何利用snmp协议发现大型复杂环境的网络拓扑(建议开发自动化工具的朋友可以看一下)_第2张图片
1.3.6.1.2.1.4.20 IP地址表
如何利用snmp协议发现大型复杂环境的网络拓扑(建议开发自动化工具的朋友可以看一下)_第3张图片
如何利用snmp协议发现大型复杂环境的网络拓扑(建议开发自动化工具的朋友可以看一下)_第4张图片
1.3.6.1.2.1.4.24 IP路由表

路由表中的每个条目都包含ipRouteDest、ipRouteIfIndex、ipRouteNextHop、ipRouteType和ipRouteMask这几项。其中,ipRouteDest表示路由的目的地址,ipRouteMask表示路由目标地址的子网掩码,将ipRouteDest和ipRouteMask按位与可以得到路由目标地址所在的子网;ipRoutelflndex表示路由本地接口的索引值,三层设备将目的地址为ipRouteDest的IP包通过该接口转发;ipRouteType表示了路由的类型,当路由类型值为3(direct)时,说明三层设备直接连接到路由目的地址所在子网,当路由类型值为4 (indirect)时,说明三层设备不直接连接到路由目的地址所在子网,必须再经过其它三层设备,即为路由表中的ipRouteNextHop,此时三层设备通过本地接口ipRoutelflndex与下一跳三层设备直接连接。
如何利用snmp协议发现大型复杂环境的网络拓扑(建议开发自动化工具的朋友可以看一下)_第5张图片
第二步:生成2层链路层网络拓扑
通过第一步,计算得到3层网络拓扑,所有接口分成两大类:
点对点网络,两个接口直接互连;
多点对多点网络,三层在同一网段,需要在这一步得到互连关系。
2层网络拓扑的计算,依据设备的MAC地址,路由器检查ARP表,交换机检查MAC地址
基于SNMP协议算法采集设备信息,可以通过SNMP采集或者登录设备采集,优先选择SNMP采集。当设备不支持SNMP采集时,登录设备采集。采集所有设备的接口IP地址、掩码等信息:

举例接口信息采集:

[root@localhost ~]# snmpwalk -v 2c -c 1qaz@WSX@ 100.100.100.1 1.3.6.1.2.1.31.1.1.1
ifName ifDescr ifOperStatus
如何利用snmp协议发现大型复杂环境的网络拓扑(建议开发自动化工具的朋友可以看一下)_第6张图片
在我的实际环境中,用户通过接入交换机接入网络,接入交换机通过汇聚交换机和路由器相连,因此,如果某台交换机的地址转发表中只有一个端口含有其它交换机的mac,那么这台交换机一定是接入交换机,那个端口一定是上行端口。可以通过这个条件将交换机分成接入交换机和汇聚交换机两个组,先判断接入交换机与汇聚交换机的连接情况,在判断汇聚交换机与汇聚交换机的连接情况,可以减少对比次数。

通过SNMP采集或者登录设备采集,可以采集到路由器的ARP表或交换机的MAC地址表。得到以下表格,含义是某个设备的MAC地址,出现在另一个设备的某个接口上,示意如下。
如何利用snmp协议发现大型复杂环境的网络拓扑(建议开发自动化工具的朋友可以看一下)_第7张图片
如何利用snmp协议发现大型复杂环境的网络拓扑(建议开发自动化工具的朋友可以看一下)_第8张图片
从设备2层连接关系表得到直接连接关系表,可以用“去除末端法”。定义:“末端设备”,在设备2层连接关系表中,只有一个接口与表中其他设备相连的设备,称为“末端设备”。
定理2:在设备2层连接关系表中,如果设备甲是“末端设备”,而且设备乙的某个接口,只与设备甲相连,不与其他设备相连,则设备乙与设备甲直接相连。
操作方法流程图:
如何利用snmp协议发现大型复杂环境的网络拓扑(建议开发自动化工具的朋友可以看一下)_第9张图片
得到设备2层直接连接关系表
如何利用snmp协议发现大型复杂环境的网络拓扑(建议开发自动化工具的朋友可以看一下)_第10张图片