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地址信息了,但是對(duì)應(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):對(duì)應(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)召嘶,對(duì)應(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)對(duì)應(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)
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}"
}
}
簡(jiǎn)單做了一個(gè)可視化效果:
*注:還是有些功能在免代碼情況無法實(shí)現(xiàn),后續(xù)可能通過定制前端實(shí)現(xiàn)
存在的問題
目前發(fā)現(xiàn)至少是華為華三的二層交換機(jī)和三層交換機(jī)非竿,已經(jīng)和傳統(tǒng)我們對(duì)交換機(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地址對(duì)應(yīng)的具體物理端口號(hào),ipNetToMediaTable只能告訴你該IP颂龙、MAC對(duì)應(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地址表是為了二層交換而建立的揪漩,三層路由接口并無直接二層交換的能力。