ELK通過SNMP免編程實(shí)現(xiàn)IP/MAC地址資產(chǎn)監(jiān)控

ELK通過SNMP免編程實(shí)現(xiàn)IP/MAC地址資產(chǎn)監(jiān)控

大體思路

logstash input有SNMP插件,利用logstash定時(shí)從網(wǎng)絡(luò)設(shè)備中獲取IP/MAC地址信息,存入elasticsearch,然后利用kibana實(shí)現(xiàn)基本查詢和可視化。

每個(gè)間隔周期獲取全部IP/MAC地址信息。

流程方法

與ARP表類似的SNMP信息的位置在:ipNetToMediaTable(.1.3.6.1.2.1.4.22)( IP-MIB)

與MAC地址表相似的SNMP信息位置在:dot1dTpFdbTable(.1.3.6.1.2.1.17.4.3)( BRIDGE-MIB)

這兩個(gè)table直接抓就可以獲得全部IP、MAC地址信息了,但是對應(yīng)的port不是直接端口描述,為了日后方便使用就需要準(zhǔn)備好端口IP到端口描述的轉(zhuǎn)換。

dot1dTpFdbTable(.1.3.6.1.2.1.17.4.3):

dot1dTpFdbPort(.1.3.6.1.2.1.17.4.3.1.2):對應(yīng)的是dot1dBasePortTable(.1.3.6.1.2.1.17.1.4)下面的dot1dBasePort(.1.3.6.1.2.1.17.1.4.1.1)

dot1dBasePortTable表中有dot1dBasePortIfIndex(.1.3.6.1.2.1.17.1.4.1.2),對應(yīng)的是ifTable(.1.3.6.1.2.1.2.2)下面的ifIndex(.1.3.6.1.2.1.2.2.1.1),ifTable下有端口描述ifDescr(.1.3.6.1.2.1.2.2.1.2)

ipNetToMediaTable(.1.3.6.1.2.1.4.22):

ipNetToMediaIfIndex(.1.3.6.1.2.1.4.22.1.1)對應(yīng)的是ifTable(.1.3.6.1.2.1.2.2)下面的ifIndex(.1.3.6.1.2.1.2.2.1.1),ifTable下有端口描述ifDescr(.1.3.6.1.2.1.2.2.1.2)

image.png

logstash配置

這是獲取ifindex表的logstash配置:短時(shí)間內(nèi)運(yùn)行一次相當(dāng)于初始化就可以了

input {
snmp {
   hosts => [{host => "udp:192.168.0.249/161" community => "public"},
             {host => "udp:192.168.20.253/161" community => "public"},
             {host => "udp:192.168.12.253/161" community => "public"},
             {host => "udp:192.168.0.241/161" community => "public"}
             ]
   tables => [{"name"=> "iftable" "columns"=> ["1.3.6.1.2.1.2.2.1.1","1.3.6.1.2.1.2.2.1.2"]}]
}
#上面直接取回來的每個(gè)主機(jī)是一條信息,為了方便以后處理利用split分割成多條信息
}
filter {
split { field => "iftable" }
mutate {
rename => { "[iftable][iso.org.dod.internet.mgmt.mib-2.interfaces.ifTable.ifEntry.ifIndex]" => "ifIndex"}
rename => { "[iftable][iso.org.dod.internet.mgmt.mib-2.interfaces.ifTable.ifEntry.ifDescr]" => "ifDescr"}
remove_field => ["iftable"]
add_field => {"cmdbtype" => "iftable"}
}
}

output {
 elasticsearch{
 hosts=> ["192.168.6.44:9200"]
 index=> "nhserear-snmpiftable-%{+YYYY.MM.dd}"
}
}

這是獲得fdbbaseport表的logstash配置:短時(shí)間內(nèi)運(yùn)行一次相當(dāng)于初始化就可以了

input {
snmp {
   hosts => [{host => "udp:192.168.0.249/161" community => "public"},
             {host => "udp:192.168.20.253/161" community => "public"},
             {host => "udp:192.168.12.253/161" community => "public"},
             {host => "udp:192.168.0.241/161" community => "public"}
             ]
   tables => [{"name"=> "fdbtable" "columns"=> ["1.3.6.1.2.1.17.1.4.1.1","1.3.6.1.2.1.17.1.4.1.2"]}]
}
}
filter {
split { field => "fdbtable" }
mutate {
rename => { "[fdbtable][iso.org.dod.internet.mgmt.mib-2.dot1dBridge.dot1dBase.dot1dBasePortTable.dot1dBasePortEntry.dot1dBasePort]" => "fdbport"}
rename => { "[fdbtable][iso.org.dod.internet.mgmt.mib-2.dot1dBridge.dot1dBase.dot1dBasePortTable.dot1dBasePortEntry.dot1dBasePortIfIndex]" => "ifIndex"}
remove_field => ["fdbtable"]
add_field => {"cmdbtype" => "fdbtable"}
}
elasticsearch {
hosts =>["192.168.6.44:9200"]
index => "nhserear-snmpiftable-2021.01.20"
query =>"ifIndex:%{[ifIndex]} AND host:%{[host]}"
fields => { "ifDescr" => "ifDescr" }
}
}

output {
 elasticsearch{
 hosts=> ["192.168.6.44:9200"]
 index=> "nhserear-snmpfdbtable-%{+YYYY.MM.dd}"
}
}

注意filter elasticsearch這個(gè)插件中有幾個(gè)缺省配置:

sort:

查詢結(jié)果排序的方式,缺省是"@timestamp:desc",按時(shí)間戳 倒序。

result_size:

查詢結(jié)果返回的個(gè)數(shù),缺省值是1.

這兩個(gè)參數(shù)組合后的結(jié)果就是,每次elasticsearch查詢的是最新的一個(gè)結(jié)果。

下面是正常運(yùn)行時(shí)logstash的配置:

input {
 snmp {
   interval => 60
   hosts => [{host => "udp:192.168.0.249/161" community => "public"},
             {host => "udp:192.168.20.253/161" community => "public"},
             {host => "udp:192.168.12.253/161" community => "public"},
             {host => "udp:192.168.0.241/161" community => "public"}
             ]
   tables => [{"name"=> "mac-address" "columns"=> ["1.3.6.1.2.1.17.4.3.1.1","1.3.6.1.2.1.17.4.3.1.2"] },
              {"name"=> "arp-address" "columns"=>["1.3.6.1.2.1.4.22.1.1","1.3.6.1.2.1.4.22.1.2","1.3.6.1.2.1.4.22.1.3"]}]
     }
}
filter {
clone {
clones => [event]
add_field => { "clone" => "true" }
}

if [clone] { mutate {remove_field => ["mac-address"] }}
else { mutate { remove_field => ["arp-address"]}}

if [mac-address] {
split { field => "mac-address" }
mutate {
rename => { "[mac-address][iso.org.dod.internet.mgmt.mib-2.dot1dBridge.dot1dTp.dot1dTpFdbTable.dot1dTpFdbEntry.dot1dTpFdbAddress]" => "MACaddress"}
rename => { "[mac-address][iso.org.dod.internet.mgmt.mib-2.dot1dBridge.dot1dTp.dot1dTpFdbTable.dot1dTpFdbEntry.dot1dTpFdbPort]" => "FDBPort"}
remove_field => ["mac-address"]
add_field => {"cmdbtype" => "MACtable"}
}
elasticsearch {
hosts =>["192.168.6.44:9200"]
index => "nhserear-snmpfdbtable-2021.01.20"
query =>"fdbport:%{[FDBPort]} AND host:%{[host]}"
fields => { "ifDescr" => "ifDescr" }
}

}
if [arp-address] {
split { field => "arp-address" }
mutate {
rename => { "[arp-address][iso.org.dod.internet.mgmt.mib-2.ip.ipNetToMediaTable.ipNetToMediaEntry.ipNetToMediaIfIndex]" => "ifIndex"}
rename => { "[arp-address][iso.org.dod.internet.mgmt.mib-2.ip.ipNetToMediaTable.ipNetToMediaEntry.ipNetToMediaNetAddress]" => "IPaddress"}
rename => { "[arp-address][iso.org.dod.internet.mgmt.mib-2.ip.ipNetToMediaTable.ipNetToMediaEntry.ipNetToMediaPhysAddress]" => "MACaddress"}
remove_field => ["arp-address"]
add_field => {"cmdbtype" => "ARPtable"}
}
elasticsearch {
hosts =>["192.168.6.44:9200"]
index => "nhserear-snmpiftable-2021.01.20"
query =>"ifIndex:%{[ifIndex]} AND host:%{[host]}"
fields => { "ifDescr" => "ifDescr" }
}

}
}

output {
 elasticsearch{
 hosts=> ["192.168.6.44:9200"]
 index=> "nhserear-snmp-%{+YYYY.MM.dd}"
}
}


簡單做了一個(gè)可視化效果:

image.png

*注:還是有些功能在免代碼情況無法實(shí)現(xiàn),后續(xù)可能通過定制前端實(shí)現(xiàn)

存在的問題

目前發(fā)現(xiàn)至少是華為華三的二層交換機(jī)和三層交換機(jī),已經(jīng)和傳統(tǒng)我們對交換機(jī)MAC地址、ARP表的理解不太一樣了,傳統(tǒng)上我認(rèn)為只要有二層以太幀流入交換機(jī),數(shù)據(jù)幀頭部的源MAC地址就會(huì)自動(dòng)被二層交換機(jī)學(xué)習(xí)到,這樣以來,以后再有發(fā)往該MAC地址的數(shù)據(jù)幀交換機(jī)就知道往哪里交換了,這是以前交換機(jī)原理里面的知識(shí)。如果按照上面的說明,二層交換機(jī)三層交換機(jī)中MAC地址表應(yīng)該是全的,也就是所有流經(jīng)該設(shè)備的源MAC地址都會(huì)被記入MAC地址表,但最近發(fā)現(xiàn)華為、華三的交換機(jī)上如果存在ARP表項(xiàng)的MAC地址,就不會(huì)在出現(xiàn)在MAC地址表中了,不知道這是不是現(xiàn)在交換設(shè)備的新功能。

通過SNMP獲取的ipNetToMediaTable(.1.3.6.1.2.1.4.22)和通過命令行直接在交換機(jī)上看到的ARP表是有區(qū)別的,三層交換機(jī)ARP表中能夠顯示IP、MAC地址對應(yīng)的具體物理端口號(hào),ipNetToMediaTable只能告訴你該IP、MAC對應(yīng)的三層接口的IFINDEX,也就說是三層接口號(hào)。

上面兩個(gè)小問題最后導(dǎo)致一個(gè)問題是,在交換機(jī)上通過ARP表可以很容易查找到IP、MAC所在的具體物理端口,而通過SNMP方法,如果查IP,可以告訴你在那個(gè)三層接口上,例如vlan interface,查MAC地址,如果這個(gè)MAC有ARP記錄,則MAC地址表中就不會(huì)記錄,還是只能定位到三層接口,這個(gè)MAC地址沒有ARP記錄,只有這種情況才可能通過MAC地址表獲得具體物理接口位置。

查了很多資料,包括H3C私有的MIB庫,目前沒有找到能夠通過SNMP準(zhǔn)確獲取ARP表的方法。

后來發(fā)現(xiàn)并不是交換機(jī)MAC地址、arp表發(fā)生了變化,而是做實(shí)驗(yàn)的這套設(shè)備,三層交換機(jī)并不是再VLAN接口上配置的IP地址,實(shí)現(xiàn)VLAN間路由,而是把物理接口直接改為路由接口(已經(jīng)不是交換接口,部分三層交換機(jī)支持物理路由接口),路由接口直連二層交換機(jī),在這種情況下,三層交換機(jī)上是看不到MAC地址表,因?yàn)镸AC地址表是為了二層交換而建立的,三層路由接口并無直接二層交換的能力。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容