ネットワークの問題を診断しようとするとき、私がいつも尋ねる質問の一つは、"モジュールのインターフェースに接続されているスイッチポートの状態はどうなっていますか?"ということです。典型的な答えは、「ネットワークの人に聞く必要がある」というものです。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 60
Collecting results pass 1 10-01-20.11:32:21 sleeping for 60 seconds Collecting results pass 2 10-01-20.11:33:23
Port Index : 1048 Port name : "X350-48t Port 48" Speed : 1000 Administrative Status : up(1) up(1) Operation Status : up(1) up(1) In Octets : 205663121 - 205568072 = 95049 In Unicast Packets : 1336981429 - 1336981157 = 272 In non-Unicast Packets : 330419202 - 330418397 = 805 In Discards : 0 - 0 = 0 In Errors : 0 - 0 = 0 In Unknown Protocols : 0 - 0 = 0 Out Octets : 290040991 - 290003159 = 37832 Out Unicast Packets : 1570859994 - 1570859741 = 253 Out non-Unicast Packets : 4386374 - 4386362 = 12 Out Discards : 0 - 0 = 0 Out Errors : 0 - 0 = 0 Out 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_parameters SWITCH switch:string,req ID id:string,req TYPE option(-type),name,allow(int,mac,port),=int COMMUNITY community:string=public SLEEP option(-sleep),number,=60 &end_parameters & & &if (process_type) = 'batch' &then &do set_ready -format off &echo no_command_lines no_macro_lines no_input_lines &end & & & display input arguments display_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 switch attach_default_output &TEST& snmpget -v 2c -c &COMMUNITY& &SWITCH& RFC1213-MIB::sysName.0 detach_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_line display_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& seconds sleep -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_line display_line display_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 NOSWITCH display_line display_line <span style="font-family: Courier New,monospace;"display_line &SWITCH& is not responding to SNMP queries using &+ the community string &COMMUNITY& &return & & &label NOINTERFACE display_line display_line display_line &INTERFACE_NAME& is not an STCP interface on this module &return & & & &label NOTFOUND display_line display_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 NOIDX display_line display_line display_line No data found for switch port &IDX& in switch &SWITCH& & & & get_switch_interface_stats.cm ends here |