Ir al contenido principal
Cuando intento diagnosticar problemas de la red, una de las preguntas que siempre me hago es "¿Cuál es el estado del puerto del conmutador que está conectado a la interfaz del módulo?" La respuesta típica es "Necesito preguntarle a la gente de la red". Ahora usando la magia del Protocolo Simple de Administración de Redes (SNMP) y la macro de comando adjunta puede que no sea necesario preguntar.

 

Todos los conmutadores manejables (y esto incluye los routers que también actúan como conmutadores) responden a las solicitudes de SNMP. El protocolo SNMP está protegido por una contraseña, conocida como la cadena de la comunidad. Normalmente hay una contraseña para leer y otra para escribir. Ciertamente puedo entender que la gente de su red no quiera darle la cadena comunitaria de escritura, pero si se lo pide amablemente, puede que le den la cadena de lectura. Después de todo, no debería haber ningún daño en la lectura y si puedes hacerlo tú mismo, no tienes que molestarles. Sin embargo, antes de preguntar, tal vez quieras probar la cadena estándar por defecto que es "pública". Si funciona, no es necesario ni siquiera preguntar.

 

Los datos del SNMP están organizados por MIB (Management Information Base). La tabla "Interfaces" está en la MIB-II MIB que es apoyada por, me atrevo a decir, todos los dispositivos que soportan SNMP. La tabla incluye contadores de errores, bytes y paquetes. No es mucha información pero es suficiente para determinar la salud básica de la conexión entre la interfaz de su módulo y la red. Las interfaces MIB están documentadas en el RFC-1213 "Base de información de gestión para la gestión de redes de internet basadas en TCP/IP": MIB-II" Puede encontrar una copia en http://www.ietf.org/rfc/rfc1213.txt.

 

La macro te da tres formas de identificar el puerto individual del conmutador de consulta. La primera es por el nombre de la interfaz. Utilizando el nombre, utiliza el comando netstat para determinar la dirección MAC de la interfaz y consulta la tabla de reenvío del switch para determinar qué puerto está asociado con la dirección MAC.

 

get_switch_interface_stats 172.16.1.222 #sdlmux.m16.11-3
La dirección IP que precede al nombre es la dirección IP del interruptor.
También puede proporcionar la dirección MAC en la forma XX-XX-XX-XX-XX-XX-XX. Esta es una forma de ver la conexión del interruptor del adaptador de reserva.

 

get_switch_interface_stats 172.16.1.222 00-00-a8-44-52-22 -type mac
Finalmente puedes proporcionar el índice de puertos. Dependiendo del conmutador, puede ser el número de puerto real o algo basado en el número de puerto. En el siguiente ejemplo el número de puerto es 48 pero el índice es 1048.

 

get_switch_interface_stats.cm 172.16.1.222 1048 -type port
En la siguiente salida de ejemplo notará que las marcas de tiempo entre el primer y el segundo paso están ligeramente separadas por más de 60 segundos. Esto se debe a que la marca de tiempo se imprime antes de que se hagan las consultas y las consultas toman tiempo.

 

¿Por qué hay dos pases? Los contadores normalmente no se borran, por lo que un solo valor no da idea de lo rápido que cambian los contadores. La macro muestra tanto el primer como el segundo valor y hace la substracción por ti.

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

 

En circunstancias ideales nunca hay errores o descartes, por lo que si estos contadores no son cero la causa debe ser investigada. El recuento de paquetes da una idea del volumen. Si hay un volumen inusualmente bajo de paquetes salientes (paquetes que van del conmutador a la interfaz) usted sabe que puede haber un problema con la conexión del conmutador al resto de la red. Un recuento inusualmente alto de paquetes salientes no unicast puede indicar que algún host de la red está inundando la red con emisiones o multicastos. Si el recuento de paquetes entrantes es bajo, hay que preguntarse por qué las aplicaciones del módulo no están transmitiendo a la velocidad esperada. La clave aquí es saber qué es inusual y eso requiere crear una línea de base.

 

Los únicos valores inequívocos son el estado administrativo y operacional. Si el estado operacional se muestra hacia abajo, sabes que hay un problema con la conexión entre el interruptor y la interfaz. Si el estado administrativo se muestra hacia abajo usted sabe que alguien deshabilitó su conexión de red.

 

Si el enlace está caído, ¿cómo puedes consultar el puerto del conmutador para saber que el enlace está caído? Puedes consultar el switch usando la dirección mac o el índice de puertos de otro módulo. Sin embargo, si el enlace ha estado caído durante algún tiempo es posible que la dirección MAC haya sido purgada de la tabla de reenvío del conmutador. Si ese es el caso, tendrás que usar el formulario de índice de puertos del comando.

 

Los comandos SNMP se encuentran en el >sistema>biblioteca_de_mantenimiento. Son un puerto de los comandos NET-SNMP y la documentación se puede encontrar en http://www.net-snmp.org/. Tenga en cuenta que no es necesario estar ejecutando el servidor SNMP (snmpd) en el módulo para ejecutar estos comandos contra el conmutador.

 

& 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 BADMAC
display_line
display_line
display_line MAC address &MAC_ADDR& is not in the format of XX:XX:XX:XX:XX:XX
display_line each octet must be 2 characters
&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