ネットワークの問題を診断しようとするとき、私がいつも尋ねる質問の一つは、"モジュールのインターフェースに接続されているスイッチポートの状態はどうなっていますか?"ということです。典型的な答えは、「ネットワークの人に聞く必要がある」というものです。Simple Network Management Protocol (SNMP)の魔法と付属のコマンドマクロを使えば、質問する必要はないかもしれません。
すべての管理可能なスイッチ(これにはスイッチとして動作するルータも含まれます)は、SNMP要求に応答します。SNMPプロトコルは、コミュニティ文字列として知られるパスワードで保護されています。通常、読み取り用のパスワードと書き込み用のパスワードがあります。ネットワーク担当者が書き込み用のコミュニティ文字列を渡したくないのは確かに理解できますが、親切にお願いすれば、読み取り用の文字列を渡してくれるかもしれません。結局のところ、読むことに何の害もないはずだし、自分でできるのであれば、彼らに迷惑をかける必要はない。しかし、尋ねる前に、標準のデフォルト文字列である"public"を試してみるのもいいかもしれません。それがうまくいけば、尋ねる必要すらありません。
SNMPのデータはMIB(Management Information Base)によって整理されています。MIB-II MIBにある「Interfaces」テーブルは、あえて言うならばSNMPをサポートしているすべてのデバイスでサポートされています。このテーブルには、エラーカウンタ、バイトカウンタ、パケットカウンタが含まれています。情報量は多くありませんが、モジュールのインターフェースとネットワーク間の接続の基本的な健全性を判断するには十分です。インターフェースMIBはRFC-1213「TCP/IPベースのインターネットのネットワーク管理のための管理情報ベース」で文書化されています。MIB-II" http://www.ietf.org/rfc/rfc1213.txt にコピーがあります。
このマクロでは、問い合わせ先のスイッチ上の個々のポートを識別するための3つの方法を提供します。1つ目はインターフェイス名によるものです。名前を使用して netstat コマンドを使用してインターフェイスの MAC アドレスを決定し、スイッチのフォワーディングテーブルに問い合わせて、どのポートが MAC アドレスに関連付けられているかを決定します。
get_switch_interface_stats 172.16.1.222  #sdlmux.m16.11-3名前の前のIPアドレスは、スイッチのIPアドレスです。
また、MACアドレスをXX-XX-XX-XX-XX-XX-XX-XXという形式で提供することもできます。これは、待機アダプタのスイッチ接続を見るための一つの方法です。
get_switch_interface_stats 172.16.1.222  00-00-a8-44-52-22 -type mac最後にポートインデックスを指定します。スイッチにもよりますが、これは実際のポート番号か、ポート番号に基づいたものになります。次の例では、ポート番号は48ですが、インデックスは1048です。
get_switch_interface_stats.cm 172.16.1.222  1048 -type port 次の出力例では、最初のパスと2回目のパスの間のタイムスタンプが60秒以上離れていることに気づくでしょう。これは、タイムスタンプがクエリが実行される前に出力され、クエリに時間がかかるためです。
なぜ2つのパスがあるのですか?カウンタは通常クリアされないので、1つの値だけではカウンタの変化の速さを知ることができません。マクロは最初の値と2番目の値の両方を表示し、減算を行います。
get_switch_interface_stats.cm 172.16.1.222 1048 -type port 172.16.1.222 1048 -type port public -sleep 60Collecting results pass 1 10-01-20.11:32:21sleeping for 60 secondsCollecting results pass 2 10-01-20.11:33:23Port Index :                1048Port name :                 "X350-48t Port 48"Speed :                     1000Administrative Status :     up(1) up(1)Operation Status :          up(1) up(1)In Octets :                 205663121 - 205568072 = 95049In Unicast Packets :        1336981429 - 1336981157 = 272In non-Unicast Packets :    330419202 - 330418397 = 805In Discards :               0 - 0 = 0In Errors :                 0 - 0 = 0In Unknown Protocols :      0 - 0 = 0Out Octets :                290040991 - 290003159 = 37832Out Unicast Packets :       1570859994 - 1570859741 = 253Out non-Unicast Packets :   4386374 - 4386362 = 12Out Discards :              0 - 0 = 0Out Errors :                0 - 0 = 0Out Q Length :              0 - 0 = 0 | 
理想的な状況では、エラーや廃棄が発生することはありませんので、これらのカウンタがゼロでない場合は原因を調査する必要があります。パケットカウントでボリュームの目安がわかります。発信パケット(スイッチからインターフェイスに向かうパケット)の量が異常に少ない場合は、ネットワークの残りの部分へのスイッチの接続に問題がある可能性があります。ユニキャスト以外の送信パケット数が異常に多い場合は、ネットワーク上の一部のホストがブロードキャストやマルチキャストでネットワークをフラッディングしている可能性があります。受信パケット数が少ない場合は、モジュール上のアプリケーションが期待されたレートで送信していない理由を確認する必要があります。ここで重要なのは、何が異常なのかを知ることであり、そのためにはベースラインを作成する必要があります。
明確な値は、管理ステータスと運用ステータスのみです。運用状態がダウンしている場合は、スイッチとインターフェイス間の接続に問題があることを示しています。管理ステータスがダウンしている場合は、誰かがネットワーク接続を無効にしたことがわかります。
リンクがダウンしている場合、リンクがダウンしていることを知るためにスイッチのポートを問い合わせるにはどうすればいいですか?別のモジュールのMACアドレスかポートインデックスを使ってスイッチに問い合わせることができます。しかし、リンクがしばらくダウンしている場合、MAC アドレスがスイッチのフォワーディングテーブルからパージされている可能性があります。その場合は、ポートインデックス形式のコマンドを使用する必要があります。
SNMP コマンドは >system>maint_library にあります。これらは NET-SNMP コマンドの移植版であり、ドキュメントは http://www.net-snmp.org/ にあります。スイッチに対してこれらのコマンドを実行するために、モジュール上で SNMP サーバ (snmpd) を実行している必要はないことに注意してください。
& get_switch_interface_stats.cm begins here&& get_switch_interface_stats.cm& version 1.0 10-01-20&&&begin_parametersSWITCH switch:string,reqID id:string,reqTYPE option(-type),name,allow(int,mac,port),=intCOMMUNITY community:string=publicSLEEP option(-sleep),number,=60&end_parameters&&&if (process_type) = 'batch' &then &doset_ready -format off&echo no_command_lines no_macro_lines no_input_lines&end& && display input argumentsdisplay_line &SWITCH& &ID& -type &TYPE&  &COMMUNITY& -sleep &SLEEP&&&&set_string INTERFACE_NAME ''&set_string MAC_ADDR ''&set_string IDX ''&if &TYPE& = int &then &set_string  INTERFACE_NAME &ID&&if &TYPE& = mac &then &set_string MAC_ADDR  &ID&&if &TYPE& = port &then &set_string IDX  &ID&&&&set_string TEST (process_dir)>test&set_string INTERFACE (process_dir)>interface&set_string MAC (process_dir)>mac&set_string INDEX (process_dir)>index&set_string R1 (process_dir)>r1&set_string R2 (process_dir)>r2&&& make sure we can get a response from the switchattach_default_output &TEST&snmpget -v 2c -c &COMMUNITY& &SWITCH&  RFC1213-MIB::sysName.0detach_default_output&if (file_info &TEST& blocks_used) = 0 &then  &goto NOSWITCH&&if (length &IDX&) = 0 &then &do &if (length &INTERFACE_NAME&) > 0 &then  &do attach_default_output &INTERFACE& netstat -interface &INTERFACE_NAME& detach_default_output &if (file_info &INTERFACE& blocks_used) = 0  &then &goto NOINTERFACE display &INTERFACE& -match 'MAC Address' -no_header  -output_path &MAC& &set_string MAC_ADDR (substr (contents &MAC& 1)  14) &end &if (length &MAC_ADDR&) < 17 &then  &goto BADMAC&set_string OCT1 (decimal (substr &MAC_ADDR& 1  2)x) &set_string OCT2 (decimal (substr &MAC_ADDR& 4  2)x) &set_string OCT3 (decimal (substr &MAC_ADDR& 7  2)x) &set_string OCT4 (decimal (substr &MAC_ADDR& 10  2)x) &set_string OCT5 (decimal (substr &MAC_ADDR& 13  2)x) &set_string OCT6 (decimal (substr &MAC_ADDR& 16  2)x)&&& query the forwarding table using the MAC adress to get  the switch& port number. The forwarding table is in the BRIDGE-MIB  and is the& dot1dTpFdbPort attach_default_output &INDEX& snmpget -v 2c -c &COMMUNITY& &SWITCH& &+ .1.3.6.1.2.1.17.4.3.1.2.&OCT1&.&OCT2&.&OCT3&.&OCT4&.&OCT5&.&OCT6& detach_default_output &set_string TEMP (reverse (contents &INDEX& 1)) &set_string IDX (index (string &TEMP&) ' ') &set_string IDX (reverse (substr (string &TEMP&) 1  (calc &IDX& - 1)))& if after all that manipulation IDX is "OID" it means that  the& forwarding table did not contain the MAC address &if &IDX& = OID &then &goto NOTFOUND&& dump the entire interface index table and use the port  number from above& to index into the table to get the port index attach_default_output &INDEX& snmpwalk -v 2c -c &COMMUNITY& &SWITCH&  RFC1213-MIB::ifIndex detach_default_output &set_string IDX (substr (contents &INDEX&  &IDX&) 22) &set_string IDX (substr (string &IDX&) 1 &+ (calc (index (string &IDX&) ' ') - 1)) &end& &display_linedisplay_line Collecting results pass 1 (date).(time)&&attach_default_output &R1&snmpget -v 2c -c &COMMUNITY& &SWITCH&  RFC1213-MIB::ifDescr.&IDX&snmpget -v 2c -c &COMMUNITY& &SWITCH&  RFC1213-MIB::ifSpeed.&IDX&snmpget -v 2c -c &COMMUNITY& &SWITCH&  RFC1213-MIB::ifAdminStatus.&IDX&snmpget -v 2c -c &COMMUNITY& &SWITCH&  RFC1213-MIB::ifOperStatus.&IDX&snmpget -v 2c -c &COMMUNITY& &SWITCH&  RFC1213-MIB::ifLastChange.&IDX&snmpget -v 2c -c &COMMUNITY& &SWITCH&  RFC1213-MIB::ifInOctets.&IDX&<snmpget -v 2c -c &COMMUNITY& &SWITCH&  RFC1213-MIB::ifInUcastPkts.&IDX&snmpget -v 2c -c &COMMUNITY& &SWITCH&  RFC1213-MIB::ifInNUcastPkts.&IDX&snmpget -v 2c -c &COMMUNITY& &SWITCH&  RFC1213-MIB::ifInDiscards.&IDX&snmpget -v 2c -c &COMMUNITY& &SWITCH&  RFC1213-MIB::ifInErrors.&IDX&snmpget -v 2c -c &COMMUNITY& &SWITCH&  RFC1213-MIB::ifInUnknownProtos.&IDX&snmpget -v 2c -c &COMMUNITY& &SWITCH&  RFC1213-MIB::ifOutOctets.&IDX&snmpget -v 2c -c &COMMUNITY& &SWITCH&  RFC1213-MIB::ifOutUcastPkts.&IDX&snmpget -v 2c -c &COMMUNITY& &SWITCH&  RFC1213-MIB::ifOutNUcastPkts.&IDX&snmpget -v 2c -c &COMMUNITY& &SWITCH&  RFC1213-MIB::ifOutDiscards.&IDX&snmpget -v 2c -c &COMMUNITY& &SWITCH&  RFC1213-MIB::ifOutErrors.&IDX&snmpget -v 2c -c &COMMUNITY& &SWITCH&  RFC1213-MIB::ifOutQLen.&IDX&snmpget -v 2c -c &COMMUNITY& &SWITCH&  RFC1213-MIB::ifSpecific.&IDX&<detach_default_output &&& if the last 3 characters of the first line are OID it  means that the& switch does not suppor the query - probably the index is  index is wrong.&if (substr (reverse (contents &R1& 1)) 1 3) = DIO  &then &goto NOIDX&&display_line sleeping for &SLEEP& secondssleep -seconds &SLEEP&&&display_line Collecting results pass 2 (date).(time)attach_default_output &R2&snmpget -v 2c -c &COMMUNITY& &SWITCH&  RFC1213-MIB::ifDescr.&IDX&snmpget -v 2c -c &COMMUNITY& &SWITCH&  RFC1213-MIB::ifSpeed.&IDX&snmpget -v 2c -c &COMMUNITY& &SWITCH&  RFC1213-MIB::ifAdminStatus.&IDX&snmpget -v 2c -c &COMMUNITY& &SWITCH&  RFC1213-MIB::ifOperStatus.&IDX&snmpget -v 2c -c &COMMUNITY& &SWITCH&  RFC1213-MIB::ifLastChange.&IDX&snmpget -v 2c -c &COMMUNITY& &SWITCH&  RFC1213-MIB::ifInOctets.&IDX&<snmpget -v 2c -c &COMMUNITY& &SWITCH&  RFC1213-MIB::ifInUcastPkts.&IDX&snmpget -v 2c -c &COMMUNITY& &SWITCH&  RFC1213-MIB::ifInNUcastPkts.&IDX&snmpget -v 2c -c &COMMUNITY& &SWITCH&  RFC1213-MIB::ifInDiscards.&IDX&snmpget -v 2c -c &COMMUNITY& &SWITCH&  RFC1213-MIB::ifInErrors.&IDX&snmpget -v 2c -c &COMMUNITY& &SWITCH&  RFC1213-MIB::ifInUnknownProtos.&IDX&snmpget -v 2c -c &COMMUNITY& &SWITCH&  RFC1213-MIB::ifOutOctets.&IDX&snmpget -v 2c -c &COMMUNITY& &SWITCH&  RFC1213-MIB::ifOutUcastPkts.&IDX&snmpget -v 2c -c &COMMUNITY& &SWITCH&  RFC1213-MIB::ifOutNUcastPkts.&IDX&snmpget -v 2c -c &COMMUNITY& &SWITCH&  RFC1213-MIB::ifOutDiscards.&IDX&snmpget -v 2c -c &COMMUNITY& &SWITCH&  RFC1213-MIB::ifOutErrors.&IDX&snmpget -v 2c -c &COMMUNITY& &SWITCH&  RFC1213-MIB::ifOutQLen.&IDX&snmpget -v 2c -c &COMMUNITY& &SWITCH&  RFC1213-MIB::ifSpecific.&IDX&detach_default_output&&display_linedisplay_linedisplay_line Port Index : '              ' &IDX&&set LIDX (length &IDX&)&set START (calc 33 + &LIDX&)display_line Port name : '               ' (substr (contents  &R1& 1) &START&)&set START (calc 34 + &LIDX&)display_line Speed : '                   ' &+ (calc (substr (contents &R1& 2) &START&) /  1000000)&set START (calc 40 + &LIDX&)display_line Administrative Status : '   ' &+ (substr (contents &R2& 3) &START&) (substr  (contents &R1& 3) &START&)&set START (calc 39 + &LIDX&)display_line Operation Status : '        ' &+ (substr (contents &R2& 4) &START&) (substr  (contents &R1& 4) &START&)&set START (calc 39 + &LIDX&)&set V1 (substr (contents &R1& 6) &START&)&set V2 (substr (contents &R2& 6) &START&)display_line In Octets : '               ' &V2& -  &V1& = (calc &V2& - &V1&)&set START (calc 42 + &LIDX&)&set V1 (substr (contents &R1& 7) &START&)&set V2 (substr (contents &R2& 7) &START&)display_line In Unicast Packets : '       '&V2& -  &V1& = (calc &V2& - &V1&)&set START (calc 43 + &LIDX&)&set V1 (substr (contents &R1& 8) &START&)&set V2 (substr (contents &R2& 8) &START&)display_line In non-Unicast Packets : '  ' &V2& -  &V1& = (calc &V2& - &V1&)&set START (calc 41 + &LIDX&)&set V1 (substr (contents &R1& 9) &START&)&set V2 (substr (contents &R2& 9) &START&)display_line In Discards : '             ' &V2& -  &V1& = (calc &V2& - &V1&)&set START (calc 39 + &LIDX&)&set V1 (substr (contents &R1& 10) &START&)&set V2 (substr (contents &R2& 10) &START&)display_line In Errors : '               ' &V2& -  &V1& = (calc &V2& - &V1&)&set START (calc 46 + &LIDX&)< &set V1 (substr (contents &R1& 11) &START&)&set V2 (substr (contents &R2& 11) &START&)display_line In Unknown Protocols : '    ' &V2& -  &V1& = (calc &V2& - &V1&)&set START (calc 40 + &LIDX&)&set V1 (substr (contents &R1& 12) &START&)&set V2 (substr (contents &R2& 12) &START&)display_line Out Octets : '              ' &V2& -  &V1& = (calc &V2& - &V1&)&set START (calc 43 + &LIDX&)&set V1 (substr (contents &R1& 13) &START&)&set V2 (substr (contents &R2& 13) &START&)display_line Out Unicast Packets : '     ' &V2& -  &V1& = (calc &V2& - &V1&)&set START (calc 44 + &LIDX&)&set V1 (substr (contents &R1& 14) &START&)&set V2 (substr (contents &R2& 14) &START&)display_line Out non-Unicast Packets : ' ' &V2& -  &V1& = (calc &V2& - &V1&)&set START (calc 42 + &LIDX&)&set V1 (substr (contents &R1& 15) &START&)&set V2 (substr (contents &R2& 15) &START&)display_line Out Discards : '            ' &V2& -  &V1& = (calc &V2& - &V1&)&set START (calc 40 + &LIDX&)&set V1 (substr (contents &R1& 16) &START&)&set V2 (substr (contents &R2& 16) &START&)display_line Out Errors : '              ' &V2& -  &V1& = (calc &V2& - &V1&)&set START (calc 36 + &LIDX&)&set V1 (substr (contents &R1& 17) &START&)&set V2 (substr (contents &R2& 17) &START&)display_line Out Q Length : '            ' &V2& -  &V1& = (calc &V2& - &V1&)&return&&label NOSWITCHdisplay_linedisplay_line<span style="font-family: Courier New,monospace;"display_line &SWITCH& is not responding to SNMP queries  using &+ the community string &COMMUNITY&&return&&&label NOINTERFACEdisplay_linedisplay_linedisplay_line &INTERFACE_NAME& is not an STCP interface  on this module&return&&&&label NOTFOUNDdisplay_linedisplay_line&if (length &INTERFACE_NAME&) > 0 &then  &do display_line MAC address &MAC_ADDR& for interface  &INTERFACE_NAME& display_line not found in switch &SWITCH& &end&else &do display_line MAC address &MAC_ADDR& not found in  switch &SWITCH& &end&return&&&label NOIDXdisplay_linedisplay_linedisplay_line No data found for switch port &IDX& in  switch &SWITCH&&&& get_switch_interface_stats.cm ends here | 
