本發明涉及一種拓撲發現方法及裝置,屬于網絡技術領域,具體是涉及一種基于zabbix的snmp網絡拓撲發現方法及裝置。
背景技術:
交換機、路由器、服務器是網絡中的主要設備。
交換機設備中包含了二層交換機,三層交換機,四層交換機等。一般在整個網絡拓撲中其數量可以占到所有網絡設備的一半以上,是比較重要的網絡設備,其上所能獲取到底數據信息也是比較詳細(包含端口號信息),而這一部分的信息也是較難分析獲取的,其復雜程度也是最高的,目前已獲取到約40%的關系線,且基本上是單端口情況,有待進一步的深化開發。
路由器的拓撲圖的主要的連接關系均來自此部分的自動發現,正確率可達到89%以上。
服務器是網絡拓撲圖中的末端設備,其數量一般在整個監控系統中基本跟所有的網絡設備的數量相差不多,而目前網絡設備(交換機/路由)中能直接獲取到服務器的網卡地址并建立連線的情況并不理想,連線率暫時達到40%。所以,獲取服務器端的路由信息及arp表數據,對于完善整個網絡拓撲也是尤為重要。
服務器使用zabbix本身的客戶端來獲取其本地的默認網關地址及其本地所保留的arp表數據信息,默認網關地址可以完善下一跳路由表的內容,而其arp表數據的內容則可以輔助交換機部分,在數據鏈路層對于端口下聯設備的判定。
現有的網絡拓撲發現方法復雜,準確率低,效率低下,并且相應的設備結構實現較難,成本高。
現有的網絡拓撲發現方法多數只是停留在概念上,沒有經過大量的實踐總結,往往比較片面,不同網絡設備提供廠商對于生成樹協議的支持有所差異,如思科的三層交換機跟華為的發現方式上就存在較大的差異,而在沒有區分網絡設備在鏈路層上的端口發現也會準確率低,效率低下,并且相應的設備結構實現較難,成本高。
技術實現要素:
本發明主要是解決現有技術所存在的上述的技術問題;提供了一種基于zabbix的snmp網絡拓撲發現方法及裝置。
本發明通過以下方案解決上述問題:
一種基于zabbix的snmp網絡拓撲發現方法,所述方法基于的snmp網絡包括:zabbix服務器,通過snmp協議與zabbix服務器相連的交換機與路由器,與交換機、路由器相連的zabbix代理,其中,所述交換機與路由器包括mib庫;
所述snmp網絡結構配置方法包括:步驟s1.1,配置網絡設備snmp授權;步驟s1.2,采集設備mib庫數據以讀取各設備的控制及狀態信息;步驟s1.3,檢查mib庫中是否還有未采集項,若是則轉到步驟s1.2并重新發起數據采集,否則轉到步驟s1.4;步驟s1.4,分析處理oid項以獲取網絡結構信息;步驟s1.5,根據獲取到的網絡結構信息生成關系線;
其中,鏈路層交換機端口發現流程具體包括:
步驟s2.1,獲取并分析用于存儲mac地址跟轉發表索引對應關系的dot1dtpfdbaddress項;步驟s2.2,判斷本地arp表是否存在對應的mac地址信息項,若是則繼續執行步驟s2.4,若否,則執行步驟2.3;步驟2.3,查詢全局arp信息表,在判斷全局arp信息表中存在對應項時執行步驟2.4,在判斷全局arp信息表中不存在對應項時結束發現流程;步驟s2.4,分析dot1dtpfdbport項,判斷是否存在mac地址,若是執行步驟s2.5,否則結束發現流程;步驟s2.5,判斷是否存在單一mac地址,若是,則執行步驟s2.7,若否,則繼續判斷全局arp信息表中是否存在對應項,當判斷為是時執行步驟2.6,當判斷為否時結束發現流程;步驟s2.6,去除已經連接到其他設備的arp,然后執行步驟s2.7;步驟s2.7,分析用于存儲轉發表跟設備端口索引的dot1dtpfdbportindex項,獲取ip端口名稱,結束發現流程。
本發明具有如下優點:1、適應多種網絡設備廠商的網絡拓撲協議;2、使用服務器端的數據逆向補充arp數據及網關信息的缺失;3、采取全局數據獲取后再分析數據的方式,彌補采集數據中數據包意外丟失的采集缺陷。
附圖說明
附圖1是交換機組網原理示意圖;附圖2是本發明的網絡結構示意圖;附圖3是本發明的組網流程圖;附圖4是交換設備拓撲發現流程圖;附圖5是路同設備發現流程圖。
具體實施方式
下面通過實施例,并結合附圖,對本發明的技術方案作進一步具體的說明。
實施例:
一、實現原理
1、交換機
交換機設備中包含了二層交換機,三層交換機,四層交換機等。一般在整個網絡拓撲中其數量可以占到所有網絡設備數量的一半以上,是比較重要的網絡設備,其上所能獲取到的數據信息也是比較詳細(包含端口號信息),而這一部分的信息其獲取分析處理難度較大,其復雜程度也是最高的,目前已獲取到約40%的關系線,且基本上是單端口情況,有待進一步的深化開發。
下文所列出的操作指令均在zabbix監控服務器上的shell直接執行即可,使用的工具是zabbix自帶的net-snmp開源控件。
指令參數說明:
snmpwalk-v2c-cmmbosspublic10.247.89.291.3.6.1.2.1.17.4.3.1.1-cc
注:
-v設置snmp協議版本號
-c設置團體名(即設備本身設置的授權團體名)
-cc設置表示輸出的內容不用按順序來顯示
對于通用網絡設備,操作如下:
(1)ifdescr(端口-端口名稱)
端口號:snmpwalk-v2c-cmmbosspublic10.247.89.29ifdescr
inloopback0:設備管理接口(telnet)
vlan-interface1:三層接口就是interfacevlan接口(配置后可開啟路由功能)
aux端口為異步端口,主要用于遠程配置,也可用于拔號連接,還可通過收發器與modem進行連接
輸出格式如下:
if-mib::ifdescr.16=string:inloopback0
if-mib::ifdescr.31=string:vlan-interface1
if-mib::ifdescr.4227614=string:aux1/0/0
if-mib::ifdescr.4227626=string:ethernet1/0/1
(2)dot1dtpfdbaddress(1.3.6.1.2.1.17.4.3.1.1)
snmpwalk-v1-cmmbosspublic10.247.89.29.1.3.6.1.2.1.17.4.3.1.1
輸出格式如下:
snmpwalk-v2c-cmmbosspublic10.247.89.291.3.6.1.2.1.17.4.3.1.1-cc
注:跟在dot1dtpfdbaddress后面的是mac地址的十進制表示,查到mac地址所在行后,再查找
dot1dtpfdbport(oid:1.3.6.1.2.1.17.4.3.1.2)
(3)dot1dtpfdbport(1.3.6.1.2.1.17.4.3.1.2)
snmpwalk-v2c-cmmbosspublic10.247.89.291.3.6.1.2.1.17.4.3.1.2-cc
輸出格式如下:
snmpv2-smi::mib-2.17.4.3.1.2.0.37.171.59.227.45=integer:11
注:這里是dot1dtpfdbport加上由上所得到的mac地址的十進制查找到橋接端口,再根據這個端口查到其端口索引,查找dot1dbaseportifindex(oid:1.3.6.1.2.1.17.4.1.2)
(4)dot1dbaseportifindex(1.3.6.1.2.1.17.4.1.2)
snmpwalk-v2c-cmmbosspublic10.247.89.291.3.6.1.2.1.17.1.4.1.2-cc
輸出格式如下:snmpv2-smi::mib-2.17.1.4.1.2.1=integer:4227626
(5)ipnettomediaphysaddress(ip-mib::ipnettomediaphysaddress)
snmpwalk-v2c-cmmbosspublic10.247.79.54ip-mib::ipnettomediaphysaddress
輸出格式如下:
ip-mib::ipnettomediaphysaddress.31.10.247.89.1=string:50:65:f3:44:6e:92
思科3層設備操作說明如下:
(1)cdpcacheaddress(1.3.6.1.4.1.9.9.23.1.2.1.1.4)
snmpwalk-v2c-cmmpublic10.247.122.651.3.6.1.4.1.9.9.23.1.2.1.1.4
輸出格式如下:
snmpv2-smi::enterprises.9.9.23.1.2.1.1.4.17.44=hex-string:0af77a52
注:其中0af77a52為十進制的10.247.122.82
這里0af77a52是ip地址的16進制表示,轉成十進制是10.247.122.82。這個ip地址的表示類型可以根據cdpcacheaddresstype確定。cdpcacheaddress后面的17是指ifindex。
查找10.247.122.66上面的橋接表。先要得到該設備上的vlan列表,查找vtpvlanifindex(oid:1.3.6.1.4.1.9.9.46.1.3.1.1.18),例如:
oid部分最后一位是指vlan號,oid值是指ifindex。可以從中得到該設備上的所有vlan號。此關系主要用于發現其下接的網絡設備。
(2)vtpvlanifindex(1.3.6.1.4.1.9.9.46.1.3.1.1.18)
snmpwalk-v2c-cmmpublic10.247.122.661.3.6.1.4.1.9.9.46.1.3.1.1.18
輸出格式如下:
snmpv2-smi::enterprises.9.9.46.1.3.1.1.18.1.1=integer:153
注:oid部分最后一位是指vlan號,oid值是指ifindex??梢詮闹械玫皆撛O備上的所有vlan號。
dot1dtpfdbaddress,dot1dtpfdbport,dot1dbaseportifindex
這三個參數的獲取都要遍歷vtpvlanifindex得到的vlan號逐個去獲取,才能得到全部的vlan地址轉發表數據
snmpwalk-cmmpublic@909-v2c10.247.122.651.3.6.1.2.1.17.4.3.1.2.0.31.201.27.16.0-on
注:@909中,909為vlan號
2、路由器/防火墻/3層交換機(具有路由功能)
目前,拓撲圖的主要的連接關系均來自此部分的自動發現,正確率可達到89%以上。以下詮釋的是具有路由功能設備中,其路由表數據信息的分析,同時解讀關系項之間的關聯性。
路由表中的每個條目都包含:
iproutedest(路由的目的地址)
iprouteifindex(路由本地接口的索引值)
iproutenexthop(路由下一跳目的地址)
iproutetype(路由的類型)
iproutemask(路由目標地址的子網掩碼)
下一跳路由發現原理:
1)iproutedest和iproutemask按位與可以得到路由目標地址所在的子網;
2)三層設備將目的地址為iproutedest的ip包通過該接口轉發;
3)iproutetype表示了路由的類型,當路由類型值為3(direct)時,說明三層設備直接連接到路由目的地址所在子網,當路由類型值為4(indirect)時,說明三層設備不直接連接到路由目的地址所在子網,必須再經過其它三層設備,即為路由表中的iproutenexthop,此時三層設備通過本地接口iproutelflndex與下一跳三層設備直接連接。
實現邏輯首先判斷是否為簡單的ip子網運算:
if($ipsubnetmask[$iproutedest[‘ip’]]=='255.255.255'){
if($ipsubnetmask[$iproutedest[‘ip’]]=='255.255.255.255'){
表示直接相連
$from_ip=本網絡設備ip;
$to_ip=$iproutedest[‘ip’];
}else{
表示直接相連的子網
1)iproutedest和iproutemask按位與
2)計算網絡號對應的整數(此地址為此網段的起始地址,但是是表示網段,所以不能分給主機使用)
3)計算網段結束ip地址(此地址此網段的結束ip地址,但是是廣播地址,所以不能分給主機使用)
4)能夠使用的ip地址是由網絡號加1,廣播地址減1
5)子網內的每一個ip都是跟本網絡設備有直連關系}}
3、服務器
服務器是網絡拓撲圖中的末端設備,其數量一般在整個監控系統中基本跟所有的網絡設備的數量相差不多,而目前網絡設備(交換機/路由)中能直接獲取到服務器的網卡地址并建立連線的情況并不理想,連線率暫時達到40%。所以,獲取服務器端的路由信息及arp表數據,對于完善整個網絡拓撲也是尤為重要。
實現原理:使用zabbix本身的客戶端來獲取其本地的默認網關地址及其本地所保留的arp表數據信息,默認網關地址可以完善下一跳路由表的內容,而其arp表數據的內容則可以輔助交換機部分,在數據鏈路層對于端口下聯設備的判定。
操作指令:
linux主機:/usr/local/zabbix/bin/zabbix_get-s'.$host['ip'].'-p'.$host['port'].'-k"system.run[route,]"/usr/local/zabbix/bin/zabbix_get-s'.$host['ip'].'-p'.$host['port'].'-k"system.run[arp-a,]"
windows主機:
/usr/local/zabbix/bin/zabbix_get-s'.$host['ip'].'-p'.$host['port'].'-k"system.run[ipconfig,]"
/usr/local/zabbix/bin/zabbix_get-s'.$host['ip'].'-p'.$host['port'].'-k"system.run[arp-a,]"
注:上述指令中,$host['ip']為主機的ip,$host['port']為主機開放的訪問端口。
二、網絡結構及流程
如圖1所示,為本實施所基于的網絡,包括:abbix服務器,通過snmp協議與zabbix服務器相連的交換機與路由器,與交換機、路由器相連的zabbix代理,其中,所述交換機與路由器包括mib庫。
三、各部分具體流程
1交換機部分
交換機在數據鏈路層工作,主要依靠mac地址來決定數據的流轉端口,由于dot1dtpfdbport每個端口存在的mac地址不一定是唯一,當為唯一時,即可判斷該端口下的mac所指向的ip(設備)為直接連接的設備,若不唯一,則需要等候其他設備關系確定結束后再行計算判斷(其中當設備為思科3層交換機時,多mac地址上的mac有可能是從隔壁鄰居路由學習而來),其發現過程如圖1所示。
此外當地址為唯一時,其實還存在其他問題,例如交換機開啟了的nat(地址轉換)功能,在目前的已實現的算法中還不能正確的區分,會導致開啟了該功能設備在網絡拓撲發現中被隱藏了。
為此,本實施例中,對原有已發現的端口下聯設備進行對聯端口的查找,進一步確認端口的對接關系,該方法可以盡最大的可能去確認設備之間的關系,其中存在單個mac時下端設備的對接端口情況,同時可以確定當多mac的端口情況,可以判別跟其對接的真正設備,排除其他干擾設備。
其流程如圖4所示,具體包括:
步驟s2.1,獲取并分析用于存儲mac地址跟轉發表表索引對應關系的dot1dtpfdbaddress項;步驟s2.2,判斷本地arp表是否存在對應的mac地址信息項,若是則繼續執行步驟s2.4,若否,則執行步驟2.3;步驟2.3,查詢全局arp信息表,在判斷全局arp信息表中存在對應項時執行步驟2.4,在判斷全局arp信息表中不存在對應項時結束發現流程;步驟s2.4,分析dot1dtpfdbport項,判斷是否存在mac地址,若是執行步驟s2.5,否則結束發現流程;步驟s2.5,判斷是否存在單一mac地址,若是,則執行步驟s2.7,若否,則繼續判斷全局arp信息表中是否存在對應項,當判斷為是時執行步驟2.6,當判斷為否時結束發現流程;步驟s2.6,去除已經連接到其他設備的arp,然后執行步驟s2.7;步驟s2.7,分析用于存儲轉發表跟設備端口索引的dot1dtpfdbportindex項,獲取ip端口名稱,結束發現流程;具體實現時,可以通過以下類的實例來實現。
2、路由部分
路由設備工作在網絡層,目前又其上面所取到的下一跳信息是本拓撲圖自動發現的主要關系信息來源,雖然此方面的關系發現較全,但在具體實踐過程中(茂名移動,韶關移動),發現了由路由部分取到的數據,有可能存在多余關系線的情況,而經過追查分析發現此部分的關系線主要是由子網關系判斷獲得。
在子網關系獲取處理時,對存在于網絡設備本地的arp表中的ip地址進行一個比對,如果子網關系中即將要連線的ip在設備本身的arp表中存在即采納此關系,不存在則不采納此關系。這樣可以去除由于使用同一網絡號而造成直連關系的干擾,但也存在當本地arp項的老化機制(2-10分鐘)會去除沒有活動的ip項,會導致正確的關系被排除,具體影響程度情況視具體開發情況。
流程如圖5所示。具體包括:
步驟s3.1,獲取并分析用于存儲網絡設備目的ip地址的iproutedest項;步驟s3.2,查詢網絡的子網掩碼ipsubnetmask;步驟s3.3,當子網掩碼ipsubnetmask為“255.255.255.255”時,判斷設備為直連設備,結束發現流程;否則執行步驟s3.4;步驟s3.4,判斷子網掩碼ipsubnetmask前三個網段是否為“255”,若否,則結束發現流程,若是,則執行步驟s3.5;步驟s3.5,根據ip和mask獲取網絡號,根據網絡號獲取全部直連子網的ip;步驟s3.6,判斷ip是否存在于本地arp表內,若是則判斷當前設備為直連設備。
具體實現時,可以通過以下類的實例實現。
3、數據采集部分
數據來源均使用snmp協議來采集mib庫中的信息,而mib庫信息會因不同的廠商會存在部分信息的自定義,或沒實現,并且前者的可能性較大,在根據mib-iirfc1213(通用標準)獲取對應oid參數屬性時出現采集不到數據的情況。
構建自身的設備獲取oid樹資料庫,將獲取過的設備型號及其采取的方式保存下來(思科設備則需要借助cdp協議),供日后同類型設備使用,可完善數據采集的缺陷。
本文中所描述的具體實施例僅僅是對本發明精神作舉例說明。本發明所屬技術領域的技術人員可以對所描述的具體實施例做各種各樣的修改或補充或采用類似的方式替代,但并不會偏離本發明的精神或者超越所附權利要求書所定義的范圍。