Quando cerco di diagnosticare i problemi di rete una delle domande che mi pongo sempre è: "Qual è lo stato della porta dello switch che è collegata all'interfaccia del modulo? La risposta tipica è "Devo chiedere alla gente della rete". Ora, usando la magia del Simple Network Management Protocol (SNMP) e la macro di comando allegata, potrebbe non essere necessario chiedere.
Tutti gli switch gestibili (e questo include i router che fungono anche da switch) rispondono alle richieste SNMP. Il protocollo SNMP è protetto da una password, nota come community string. In genere c'è una password per la lettura e un'altra per la scrittura. Posso certamente capire che le persone della vostra rete non vogliano darvi la stringa della comunità di scrittura, ma se lo chiedete gentilmente possono darvi la stringa di lettura. Dopotutto, non dovrebbe esserci alcun danno nella lettura e se potete farlo da soli, non dovete disturbarli. Tuttavia, prima di chiedere, potreste voler provare la stringa standard di default che è "pubblica". Se funziona, non c'è nemmeno bisogno di chiedere.
I dati SNMP sono organizzati per MIB (Management Information Base). La tabella "Interfacce" è nel MIB-II MIB che è supportata da, oserei dire, tutti i dispositivi che supportano SNMP. La tabella include contatori di errori, byte e pacchetti. Non è una grande quantità di informazioni, ma è sufficiente per determinare lo stato di salute di base della connessione tra l'interfaccia del modulo e la rete. Le interfacce MIB sono documentate in RFC-1213 "Management Information Base for Network Management of TCP/IP-based internets: MIB-II" Ne trovate una copia su http://www.ietf.org/rfc/rfc1213.txt.
La macro offre tre modi per identificare la singola porta dell'interruttore da interrogare. Il primo è per nome dell'interfaccia. Utilizzando il nome si usa il comando netstat per determinare l'indirizzo MAC dell'interfaccia e interroga la tabella di inoltro dello switch per determinare quale porta è associata all'indirizzo MAC.
get_switch_interface_stats 172.16.1.222 #sdlmux.m16.11-3
L'indirizzo IP che precede il nome è l'indirizzo IP dello switch.
L'indirizzo MAC può essere fornito anche nella forma XX-XX-XX-XX-XX-XX-XX-XX-XX. Questo è un modo di vedere il collegamento dell'interruttore dell'adattatore di standby.
get_switch_interface_stats 172.16.1.222 00-00-a8-44-52-22 -type mac
Infine è possibile fornire solo l'indice del porto. A seconda dello switch, questo può essere il numero di porta effettivo o qualcosa basato sul numero di porta. Nell'esempio seguente il numero di porta è 48 ma l'indice è 1048.
get_switch_interface_stats.cm 172.16.1.222 1048 -type port
Nell'output di esempio seguente si noterà che i timestamp tra il primo e il secondo passaggio sono distanti tra loro poco più di 60 secondi. Questo perché il timestamp viene stampato prima che le interrogazioni vengano effettuate e le interrogazioni richiedono tempo.
Perché ci sono due pass? Normalmente i contatori non vengono cancellati, quindi un singolo valore non dà alcuna idea della velocità di cambio dei contatori. La macro visualizza sia il primo che il secondo valore e fa la sottrazione per voi.
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 |
In circostanze ideali non ci sono mai errori o scarti, quindi se questi contatori non sono a zero la causa dovrebbe essere indagata. I conteggi dei pacchetti danno un'idea del volume. Se c'è un volume insolitamente basso di pacchetti in uscita (pacchetti che vanno dallo switch all'interfaccia) si sa che potrebbe esserci un problema con la connessione dello switch al resto della rete. Un numero di pacchetti in uscita non unicast insolitamente alto può indicare che qualche host sulla rete sta inondando la rete con trasmissioni o multicast. Se il conteggio dei pacchetti in entrata è basso, bisogna chiedersi perché l'applicazione o le applicazioni del modulo non trasmettono alla velocità prevista. La chiave in questo caso è sapere cosa è insolito e questo richiede la creazione di una linea di base.
Gli unici valori univoci sono lo stato amministrativo e operativo. Se lo stato operativo viene visualizzato in basso si sa che c'è un problema di collegamento tra l'interruttore e l'interfaccia. Se lo stato amministrativo viene visualizzato, si sa che qualcuno ha disattivato la connessione di rete.
Se il collegamento è fuori servizio, come si può interrogare la porta dello switch per sapere che il collegamento è fuori servizio? Potete interrogare lo switch utilizzando l'indirizzo mac o l'indice della porta da un altro modulo. Tuttavia, se il collegamento è stato interrotto per un certo periodo di tempo, è possibile che l'indirizzo MAC sia stato eliminato dalla tabella di inoltro dello switch. In tal caso è necessario utilizzare il modulo port index del comando.
I comandi SNMP si trovano nella >sistema>maint_libreria_maint. Sono una porta dei comandi NET-SNMP e la documentazione può essere trovata su http://www.net-snmp.org/. Si noti che non è necessario eseguire il server SNMP (snmpd) sul modulo per eseguire questi comandi contro lo switch.
& 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 |