ZabbixのマネヌゞドスむッチのポヌトでMACアドレスのリストを取埗したす

私が働いおいる組織は、耇数の建物に分散されたかなり倚数の管理スむッチを䜿甚しおいたす。 ポヌト䞊のMACアドレスを、telnetたたはsshだけでなく、Zabbix監芖システムのWebむンタヌフェヌスで盎接確認したかったのです。

情報収集ず理論

これを行う方法に関する情報を求めお、Googleに尋ねられ、短い怜玢の埌、目的のアドレスを取埗し、それらが衚瀺されるポヌトを決定するためのアルゎリズムを説明する玠晎らしいドキュメントがCiscoによっお著者ずしお発芋されたした。
3Com 4200Gスむッチからのsnmpwalkの結論を簡単に調べたずころ、私の堎合はvlanを決定する必芁さえなく、ポヌトごずにMACアドレスを決定するための3぀のステップしかありたせんでした。

ドキュメントから理解できるように、必芁なものは次のずおりです。
1䜏所リストを取埗する
$snmpwalk -c public -v 2c hostname .1.3.6.1.2.1.17.4.3.1.1

17.4.3.1.1.0.0.12.7.172.8 = Hex: 00 00 0C 07 AC 08
17.4.3.1.1.0.1.2.27.80.145 = Hex: 00 01 02 1B 50 91
17.4.3.1.1.0.1.3.72.77.90 = Hex: 00 01 03 48 4D 5A
17.4.3.1.1.0.1.3.72.221.191 = Hex: 00 01 03 48 DD BF
...

2コマンドでポヌトのリストを取埗する
$snmpwalk -c public -v 2c hostname .1.3.6.1.2.1.17.4.3.1.2
17.4.3.1.2.0.0.12.7.172.8 = 13
17.4.3.1.2.0.1.2.27.80.128 = 13
17.4.3.1.2.0.1.2.27.80.145 = 13
17.4.3.1.2.0.1.2.163.145.225 = 13
...

単玔なスむッチに問い合わせおいる堎合、この玠晎らしい数この䟋では13はスむッチのポヌトです。

3OID番号間の察応を芋぀けるこずだけが残っおおり、 12.7.172.8で終わるOIDは、このMACがハングするMACずポヌト番号を提䟛するこずがわかりたす。

理論から実践ぞ

このすべおを自動化するために、真珠の簡単なスクリプトをスケッチしたした UPDATE0gescheitのアドバむスでコヌドが曎新されたした; UPDATE1 FreeLSDのアドバむスでコヌドが再び曎新されたした

 / usr / bin / perl
================================================= =====================

遞択したポヌトからの3COMスむッチからのMACアドレスのク゚リ
================================================= =====================


厳栌な䜿甚;
Net :: SNMP qw  snmp_dispatcher oid_lex_sort を䜿甚したす。

私の$ show_vendor = 1 ;
私の$ script = "/usr/share/zabbix/scripts/mac.sh -s" ;
私の$ debug = 0 ;
my $ file_name = "/ tmp / $ ARGV [0] -getmac.tmp" ;
私の$ interval = 90 ; リフレッシュレヌト
私の$ new = 0 ;
私の@リスト;
私の$ write_secs =  stat  $ file_name   [ 9 ] ;
if  $ debug == 1  {
print "file $ file_name updated at" 、スカラヌ localtime  $ write_secs   、 " \ n " ;
} ;
if  $ write_secs + $ interval < time  { ファむルの曎新間隔が$ interval秒前
if  $ debug == 1  { print "新しいMacテヌブルの生成\ n " ; }
$ new = 1 ;
FHを開く、 "> $ file_name "たたはdie "ca n't open '' $ file_name '$" ;
} else {
if  $ debug == 1  { print "叀いmacテヌブルを䜿甚\ n " ; }
FRを開く、 「< $ file_name 」たたはdie 「開けたせん ' $ file_name '$」 ;
while  my $ line = < FR >  {
ムシャムシャ $ラむン  ;
my  $ p 、 $ m  = split / ; / 、 $行 ;
@ list [ $ p ] = "@list [ $ p ] $ m 、" ;
}
}
======================================
私の$セッション ;
私の$゚ラヌ ;
私の$ port = $ ARGV [ 1 ] ;
if  $ new == 1  {
===リモヌトホストぞのセッションのセットアップ===
 $ session 、 $ error  = Net :: SNMP- >セッション
-hostname = > $ ARGV [ 0 ] || 'localhost' 、
-community = > 'public' 、
-version = > '2c' 、
-translate = > [ -octetstring = > 0 ] 、
-port = > 161
 ;
===セッションは䜜成されたしたか ===
if   defined  $ session   {
printf  "ERRORs \ n " 、 $ error  ;
出口 1 ;
}
} ;
==================================

===情報を取埗するためにク゚リされるOID ====
私の$ TpFdbAddress = '1.3.6.1.2.1.17.4.3.1.1' ;
私の$ TpFdbPort = '1.3.6.1.2.1.17.4.3.1.2' ;
=============================================
私の$結果 ;
私の@ tmp;
私の$ x ;
if  $ new == 1  {
if  defined  $ result = $ session- > get_table  $ TpFdbAddress    {
foreach  oid_lex_sort  keys   { $ result }    {
$ x = unpack  'H *' 、 $ result- > { $ _ }  ;
$ x =〜s /  ..    \ Z   / \ 1  / g;
push  @ tmp、 $ x  ;
}
} else {
if  $ debug == 1  {
printf  "ERRORs \ n \ n " 、 $ session- > error    ;
}
}
===========================================
===返されたMACポヌトを出力===
$ result ;
if  defined  $ result = $ session- > get_table  -baseoid = > $ TpFdbPort    {
私の$ i = 0 ;
私の$ out = "" ;
私の$ res = 0 ;
私の$ tmp_port ;
私の$ tmp_mac_list = "" ;
foreach  oid_lex_sort  keys   { $ result }    {
if  $ result- > { $ _ } == $ port  {
$ res = 1 ;
if  $ show_vendor == 1  {
$ out = ` $ script $ tmp [ $ i ] ` ;
printf  "ss" 、 $ tmp [ $ i ] 、 $ out  ;
} else {
printf  "s" 、 $ tmp [ $ i ]  ;
} ;
print "、" ;
} ;
if  $ show_vendor == 1  {
$ out = ` $ script $ tmp [ $ i ] ` ;
printf FH  "s;ss \ n " 、 $ result- > { $ _ } 、 $ tmp [ $ i ] 、 $ out  ;
} else {
printf FH  "s;s \ n " 、 $ result- > { $ _ } 、 $ tmp [ $ i ]  ;
} ;
$ i ++;
}
if  $ res == 0  {
「null」を印刷したす 。
} ;
} else {
if  $ debug == 1  {
printf  "ERRORs \ n \ n " 、 $ session- > error    ;
} else {
「null」を印刷したす 。
} ;
}
} else {
if  @ list [ $ port ]  {
print "@list [ $ port ]" ;
} else {
「null」を印刷したす 。
} ;
}
print " \ n " ;
=============================================
===セッションを閉じおプログラムを終了したす===
if  $ new == 1  {
$セッション - >閉じる;
FHを閉じたす。
} else {
FRを閉じたす。
}
exit 0 ;



コヌドは非垞に掗緎されおいたせん。OIDが既に受信されおいるファむルがない堎合は、MACアドレスを持぀OIDを取埗し、アレむに曞き蟌みたす。 次に、同じシヌケンスでポヌト付きのOIDを取埗したす。これにより、配列内のn番目の倀ず、受信したOIDのn番目の倀ずポヌト番号ずの察応が埗られたす。 次に、受信したデヌタをファむルにドロップしたす。
ファむルがスクリプトの開始時に既に存圚し、$ interval私の堎合は90秒よりも叀いものではない堎合、そのファむルからデヌタを取埗したす。 これにより、スむッチごずに2぀のSNMP芁求のみを䜿甚できたした。
スクリプトは入力に2぀のパラメヌタヌを取りたす。最初のパラメヌタヌはデバむスアドレスですこれはzabbixの仕様です。倖郚スクリプトの堎合、ホストのアドレスは垞に最初のパラメヌタヌです。私たちにずっお重芁なポヌト番号は2番目のパラメヌタヌです。 このポヌトにアドレスがない堎合、スクリプトはテキスト「null」を含む文字列を返したす。 新しいバヌゞョンでは、mac-addressでデバむスの補造元を確認できたす。 この機胜を有効にするには、倀が1の$ show_vendor倉数がありたす。スクリプトは、スクリプト倉数で指定された別のスクリプトからメヌカヌに関する情報を取埗しようずしたす。 このスクリプトには、デバむスのMACアドレスが枡されたす。 私自身のために、かなりシンプルなshスクリプトを実装したした。その党䜓のポむントは、1行実行するこずです。

awk --assign IGNORECASE = 1 '/ hex / && /' $ mac '/ {forx = 3; x <= NF; x ++{printf "s"、$ x}}' $ filename


倉数$ filenameの䞋に隠れおいる神秘的なファむルはreferenceによっお取埗され、ieeeによっお慎重に遞択された必芁なすべおのデヌタが含たれおいたす。

この1行を少し倉曎し、「曎新」モヌドも远加しお、メヌカヌのリストの最新バヌゞョンを収瞮させたした。 結果は次のずおりです。

/ bin / sh
mac-addressからベンダヌを取埗
if [ -z "$ 1" ] ; それから
echo "匕数が指定されおいたせん。終了したす$ 0 [-option] macを䜿甚したす"
echo "[-option]には-uデヌタベヌスを曎新しお終了たたは-sサむレントモヌド、ベンダヌのみ衚瀺を指定できたす。"
1 番出口
fi
スクリプトを実行するずきにZabbixが$ PATHを蚭定しないこずを忘れないでください
ファむル名 = / usr / share / zabbix / scripts / oui.txt
tmpfile = / tmp / oui.txt
link = http // standard.ieee.org / development / regauth / oui / oui.txt
sed = / bin / sed
awk = / bin / awk

ケヌス $ 1 in
-s 
サむレント = 1
mac = 2ドル
if [ -z "$ 2" ] ; それから
echo "macが指定されおいたせん、終了したす"
1 番出口
fi
;;
-u 
wget $ link -O $ tmpfile
if [ $ -gt 0 ] ; それから
echo "ダりンロヌド゚ラヌ、終了"
1 番出口
他に
echo "OKをダりンロヌド"
echo " $ tmpfileを$ filenameに移動..."
mv -f $ tmpfile $ filename
if [ $ -gt 0 ] ; それから
echo "゚ラヌ"
他に
echo "成功"
fi
出口 0
fi
;;
* 
mac = $ 1
;;
゚サック
もし [  -f $ filename ] ; それから
if [ -z $ silent ] ; それから
echo "macリストファむルはありたせん、ダりンロヌドしたすか[y / n]"
他に
1 番出口
fi
ながら 
する
INPUT_STRINGを読む
ケヌス $ INPUT_STRING
y 
echo " $リンクからダりンロヌドしようずしおいたす"
wget $ link -O $ filename
if [ $ -gt 0 ] ; それから
echo "ダりンロヌド゚ラヌ、終了"
1 番出口
他に
echo "OKをダりンロヌド"
fi
ç Žã‚‹
;;
n 
echo "exiting"
出口 0
;;
* 
echo "間違った入力、[y / n]を䜿甚"
;;
゚サック
やった
fi
if [ $ { mac } -lt 8 ] ; それから
mac = ` echo " $ mac " | $ sed 's / ^ \.. \\.. \\.. \/ \ 1- \ 2- \ 3 /' '
他に
mac = ` echo " $ mac " | $ sed -e 's //-/ g' '
fi
mac = $ {mac08}
if [ -z $ silent ] ; それから
echo " $ macを怜玢しおいたす..."
fi
result = ` $ awk --assign IGNORECASE = 1 '/ hex / && /' $ mac '/ {forx = 3; x <= NF; x ++{printf"s "、$ x}}' $ファむル名 `
if [ -z " $ result " ] ; それから
結果 = 「情報なし」
fi
echo -n $結果


メヌカヌにパフォヌマンスをテストするスクリプトを実行したす。

$./mac.sh "000000"
no mac list file, dowload it? [y/n]
y
Trying to download from standards.ieee.org/develop/regauth/oui/oui.txt
--2011-10-06 14:20:16-- standards.ieee.org/develop/regauth/oui/oui.txt
proxy.organization.ltd... 192.168.0.1
proxy.organization.ltd|192.168.0.1|:3128... .
Proxy , ... 200 OK
: 2493060 (2,4M) [text/plain]
Saving to: «oui.txt»

100%[==========================================================================================================================================================================>] 2 493 060 784K/s 3,1s

2011-10-06 14:20:26 (784 KB/s) - «oui.txt» saved [2493060/2493060]

Download ok!
Searching for 00-00-00...
XEROX CORPORATION

すべおが機胜する堎合は、次に進みたす。

次に、zabbixa configでスクリプトの実行時間を蚭定し、必芁な倀に増やしたす。 遞択したタむムアりト倀が十分でない堎合、macアドレスを反映するデヌタ芁玠が「スクリプト実行タむムアりト」などの゚ラヌ説明ずずもに「サポヌトされおいない」カテゎリに1぀ず぀移動するため、すぐにこれを理解できたす。
構成を線集したす。
#vim /etc/zabbix/zabbix-server.conf

私たちはそこにそのような行を探しおいたす
### Option: Timeout
# Specifies how long we wait for agent, SNMP device or external check (in seconds).
# Range: 1-30


コメントを倖し、目的の倀に倉曎したす
Timeout=5

そこを芋お
### Option: ExternalScripts
# Location of external scripts
ExternalScripts=/usr/share/zabbix/scripts/


必芁に応じお、スクリプトぞの正しいパスに倉曎したす。
このパスに沿っお、真珠の䞊にスクリプトを配眮したす。 私はそれを巧劙に呌び出したした-get_mac.pl

次に、Zabbixで、スむッチのテンプレヌトに必芁なデヌタ型を蚭定したす。



そしお、すべおのポヌトに。

その埌、zabbixでスむッチのポヌトのアドレス情報を盎接受信できたす。
私にはこのように芋えたす曎新されたスクリヌンショットをメヌカヌの名前で投皿するこずはできたせん。habrastorageはフラッシュなしでは機胜せず、Google Chromeのフラッシュでも機胜しないためです。


ポヌト16を芋おいるずきに心配しないでください-これはアップリンクです。

この手法はテストされおおり、3Comブランドの9぀のスむッチ4200G、4210、2916、2924で1か月間正垞に動䜜しおいたす。Zabbixバヌゞョン1.8.5、最近1.8.7に曎新されたした。 シスコのドキュメントに埓っおこれらすべおを䜜成したこずを考えるず、シスコスむッチに問題はないはずです。

PS私はスクリプトを完成させお凊理できるず信じおいたすが、私はperlが埗意ではないので、この高貎な仕事に助けを求めおhabrasocietyに頌み、Zabbixのような玠晎らしいプロゞェクトを䟡倀ある高品質の゜リュヌションずしお入れたす。 たた、スむッチ3Com 4200G、4210、2924のテンプレヌトを改良されたスクリプトず䞀緒に配眮する予定です。
gescheitによっお曎新されたUPD0スクリプトコヌド
FreeLSDのアドバむスに基づいお曎新されたUPD1の蚘事ずコヌド

Source: https://habr.com/ru/post/J128439/


All Articles