当前位置: 首页 > news >正文

如何利用snmp协议发现大型复杂环境的网络拓扑(建议开发自动化工具的朋友可以看一下)...

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

主要分为三部分:

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


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

第一步:生成3层网络层网络拓扑
本算法采集设备信息,可以通过SNMP采集或者登录设备采集,优先选择SNMP采集(表如何利用snmp协议发现大型复杂环境的网络拓扑(建议开发自动化工具的朋友可以看一下)
列出了用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协议发现大型复杂环境的网络拓扑(建议开发自动化工具的朋友可以看一下)
1.3.6.1.2.1.4.20 IP地址表
如何利用snmp协议发现大型复杂环境的网络拓扑(建议开发自动化工具的朋友可以看一下)
如何利用snmp协议发现大型复杂环境的网络拓扑(建议开发自动化工具的朋友可以看一下)
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协议发现大型复杂环境的网络拓扑(建议开发自动化工具的朋友可以看一下)
第二步:生成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协议发现大型复杂环境的网络拓扑(建议开发自动化工具的朋友可以看一下)
在我的实际环境中,用户通过接入交换机接入网络,接入交换机通过汇聚交换机和路由器相连,因此,如果某台交换机的地址转发表中只有一个端口含有其它交换机的mac,那么这台交换机一定是接入交换机,那个端口一定是上行端口。可以通过这个条件将交换机分成接入交换机和汇聚交换机两个组,先判断接入交换机与汇聚交换机的连接情况,在判断汇聚交换机与汇聚交换机的连接情况,可以减少对比次数。

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

转载于:https://blog.51cto.com/13769225/2121431

相关文章:

  • jenkins指定具体项目具体分支进行构建部署
  • 教你一步步composer安装Magento2.3
  • 真正能支撑高并发以及高可用的复杂系统中的缓存架构有哪些东西?
  • 配置嵌入式Servlet容器
  • Spring Boot学习记4
  • 小R的烦恼 BZOJ3280
  • 捋一捋PHP第三方微信登录
  • JDK动态代理源码解析
  • 比传统事务快10倍?一张图读懂阿里云全局事务服务GTS
  • 关于lncRNA数据收集
  • 在Java中使用tabula提取PDF中的表格数据
  • Kafka入门经典教程
  • 使用 Buildah 创建小体积的容器
  • Linux-office办公的另外之选
  • Service Mesh服务网格:8种方式简化微服务部署
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • Effective Java 笔记(一)
  • ES6--对象的扩展
  • es的写入过程
  • export和import的用法总结
  • MaxCompute访问TableStore(OTS) 数据
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • Python 使用 Tornado 框架实现 WebHook 自动部署 Git 项目
  • spring security oauth2 password授权模式
  • ⭐ Unity 开发bug —— 打包后shader失效或者bug (我这里用Shader做两张图片的合并发现了问题)
  • 道格拉斯-普克 抽稀算法 附javascript实现
  • 分类模型——Logistics Regression
  • 回流、重绘及其优化
  • 悄悄地说一个bug
  • 小程序开发中的那些坑
  • 原创:新手布局福音!微信小程序使用flex的一些基础样式属性(一)
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • ​Java并发新构件之Exchanger
  • ​ubuntu下安装kvm虚拟机
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • # 20155222 2016-2017-2 《Java程序设计》第5周学习总结
  • #我与Java虚拟机的故事#连载04:一本让自己没面子的书
  • (13):Silverlight 2 数据与通信之WebRequest
  • (16)Reactor的测试——响应式Spring的道法术器
  • (C++)栈的链式存储结构(出栈、入栈、判空、遍历、销毁)(数据结构与算法)
  • (pojstep1.1.2)2654(直叙式模拟)
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (补)B+树一些思想
  • (二)windows配置JDK环境
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (论文阅读26/100)Weakly-supervised learning with convolutional neural networks
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • .form文件_SSM框架文件上传篇
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .Net的C#语言取月份数值对应的MonthName值
  • .Net语言中的StringBuilder:入门到精通
  • @Autowired和@Resource装配