Monitoreo de redes Agentes SNMP Ing. Diego Córdoba www.linuxinstitute.com.ar Pagina 1 de 7
Las variables SNMP Las variables almacenadas en la MIB se identifican y definen según una serie de reglas llamadas Structure Of Management Information, o SMI. Aquí se indica cómo deben definirse y referenciarse las variables de la MIB, y establece la estructura jerárquica en la que se encuentran. Se indica que cada variable se identifica por un nombre definido de dos maneras: en forma alfanumérica, o en forma numérica (una serie de números separados por punto). Los objetos en la MIB siempre comienzan con una rama jerárquica común, que es: iso.org.dod.internet.mgmt.mib.<grupo_de_variables>.<variable> O en formato numérico: 1.3.6.1.2.1.<grupo_de_variables>.<variable> Grupos de variables de la MIB Los principales grupos de variables, también conocidos como categorías, son los siguientes. Grupo System Contiene variables que dan información acerca del hardware y el firmware del dispositivo. Ejemplos de variables del grupo System son: sysdescr: Descripción del sistema operativo. syscontact: mail de contacto del administrador. sysname: Nombre del dispositivo syslocation: Localización física. Esta categoría es opcional y el fabricante puede optar por no incorporarla a la MIB que instala en su dispositivo. Grupo Interface En esta categoría se almacenan variables relacionadas con las primeras dos capas del modelo ISO/OSI, es decir, información de capa física y capa de enlace de datos. Ejemplos de variables de Interface son: ifnumber: Numero de interfaces iftable: tabla descriptora de interfaces ifmtu: MTU de la interfaz. If PhisAddress: Dirección MAC ifinoctets: Cantidad de bytes ingresados ifoutoctets: Cantidad de bytes salientes Ing. Diego Córdoba www.linuxinstitute.com.ar Pagina 2 de 7
Esta categoría es obligatoria en cualquier dispositivo que cumpla el estándar de protocolo snmp. Grupo Address Translation Contiene información de definiciones de tablas constituidas por la unión de dos protocolos. Por ejemplo, la variable attable almacena la información de la tabla de ARP del dispositivo. Esta categoría es opcional en la última versión del protocolo snmp, la versión 3. Grupo IP Aquí se encuentra descripta la mayor parte de la información de capa 3 del modelo OSI/ISO, la capa de red. ipforwarding: Si actua como router o no ipdefaultttl: TTL por omision ipinhdrerrors: Cantidad de paqquetes con error. ipinunknownprotos: paquetes c/ protocolo desconocido ipreasmok: cantidad de paquetes reeensamblados. ipaddrtable: Tabla de ruteo. Esta categoría es obligatoria en la implementación de un agente snmp. Grupo ICMP Describe variables utilizadas por el protocolo ICMP (Internet Control Message Protocol) Ejemplos son: icmpinmsgs: Cantidad de mensajes ICMP recibidos icmpindestunreachs : cantidad de mensajes de destino inalcanzable recibidos icmpouttimeexcds: cantidad de mensajes de tiempo excedido emitidos icmpoutsrcquench : cantidad de mensajes de congestión de la fuente enviados. Esta categoría es obligatoria. Grupo TCP Variables relativas al protocolo TCP de capa 4 del modelo OSI, capa de transporte. tcprtomin: Valor mínimo del Timer de Retransmisión tcpmaxconn: Cantidad máxima de conexiones posibles. tcpactiveopens y tcppasiveopens tcpconntable: Informacion especifica de las conexiones. tcpconnlocalport y tcpconnremport Ing. Diego Córdoba www.linuxinstitute.com.ar Pagina 3 de 7
tcpconnlocaladdress y tcpconnremport Esta categoría es obligatoria en todos los sistemas que implementen TCP. Grupo UDP Variables relativas al protocolo TCP de capa 4 del modelo OSI, capa de transporte. udpindatagrams y udpoutdatagrams : contadores de datagramas entrantes y salientes. udpinerrors.: contador de errores udp. udpnoports: Paquetes con destino a un port inactivo udptable: Tabla de recvfromn en progreso. udpconnlocaladdress udplocalport Esta categoría es obligatoria en todos los sistemas que implementen UDP Grupo EGP Variables del protocolo de intercambio de información de ruteo EGP (Exterior Gateway Protocol). egpinmsgs y egpoutmsgs, egpinerrors. Esta categoría es obligatoria en todos los sistemas que implementen EGP. Grupo SNMP Variables propias de SNMP. snmpinbadvalues y snmpinreadonlys snmpinbadcommunitynames: contador de consultas con nombres erroneos de communities. snmpintotalreqvars y snmptotalsetvars, snmpoutgetrequest y snmpoutsetrequest : contadores de variables requeridas y seteadas de entrada snmpouttraps : cantidad de traps enviados. SnmpOutNoSuchNames: contador de nombres erroneos de variables en consultas. Esta categoría es obligatoria en Sistemas que implementan aplicaciones snmp. El agente SNMP Casi todos los dispositivos de red de la actualidad, sean routers, switches, etc, que tengan medianamente soporte de configuraciones avanzadas, ya traen incorporado un agente snmp con su MIB, sus variables, y sus datos esperando ser leídos. Ing. Diego Córdoba www.linuxinstitute.com.ar Pagina 4 de 7
En el caso de computadoras de escritorio y servidores, vienen diversas implementaciones de agentes SNMP para distintas arquitecturas de software: Linux, Windows, etc. Para instalar un agente snmp en Debian GNU/Linux vamos a ejecutar el siguiente comando como usuario root: aptitude install snmpd Esto instalará snmpd, un demonio de snmp para Linux, y quedará escuchando en el puerto 161 de la dirección de localhost 127.0.0.1. Para configurarlo vamos a editar el archivo /etc/snmp/snmpd.conf Vamos a cambiar la linea en la que establecemos la dirección ip en la que va a escuchar el agente snmp por la siguiente: agentaddress udp:0.0.0.0:161 De esta forma el agente no solo escuchará en la dirección de localhost, sino también en cualquier dirección de red del equipo, y podremos consultarlo desde una consola remota. En la sección de control de acceso establecemos los communities con los cuales van a conectarse los clientes que quieran leer variables. Un community es una especie de pass phrase que va a ser utilizada por la utilidad de consulta como medio de acceso. Le permitimos a localhost acceder a cualquier variable de la MIB, solo para que podamos hacer pruebas. rocommunity public localhost Para poder consultar al agente desde otro equipo de la red, debemos habilitar un community para una ip individual, o para un segmento de red completo: rocommunity secreto 10.0.0.0/24 Para realizar consultas al agente snmp se pueden utilizar las utilidades snmp. En Debian: aptitude install snmp Para realizar un query o consulta pidiendo un grupo particular de variables vamos a usar snmpwalk de la siguiente manera: snmwalk -v1 -c public localhost system Con este comando estaremos trayendo el grupo de variables system, con sus respectivos tipos de datos y valores particulares. El parámetro -v1 indica que vamos a realizar la consulta usando snmp v1. En su lugar podríamos haber utilizado las versiones 2c o 3 respectivamente. La versión v1 de snmp especifica las unidades de datos de protocolo (PDU: Protocol Data Unit) )del nucleo de snmp, a saber, el PDU de la capa física, el PDU de la capa de enlace, el PDU de la capa de red, el PDU Ing. Diego Córdoba www.linuxinstitute.com.ar Pagina 5 de 7
de la capa de transporte, y el resto de los datos, referenciados por el siguiente PDU. El problema de la versión snmp v1 era la seguridad, pues la única política de acceso era el community secreto. Luego, la versión 2c, si bien mantenía las mismas políticas de seguridad que la versión 1, ya incorporaba contadores de 64 bits, lo que nos daba mayor rango de valores. La versión 3 ya agregó políticas de seguridad y autenticación especiales, ofreciendo autenticación para diferentes usuarios, o encriptación de los paquetes de datos. Con el modificador -c especificamos el community necesario para tener acceso a las diferentes variables de la MIB. Luego a snmpwalk le pasamos el nombre o dirección ip del host que está corriendo el agente snmp, y por último podemos restringir las respuestas a un grupo en particular de variables, como ser system. La salida del comando va a ser algo similar a lo siguiente: root@alumno:~# snmpwalk -v1 -c public localhost system SNMPv2-MIB::sysDescr.0 = STRING: Linux alumno 2.6.32-5-686 #1 SMP Tue Mar 8 21:36:00 UTC 2011 i686 SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10 DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (2855494) 7:55:54.94 SNMPv2-MIB::sysContact.0 = STRING: Me <me@example.org> SNMPv2-MIB::sysName.0 = STRING: alumno SNMPv2-MIB::sysLocation.0 = STRING: Sitting on the Dock of the Bay SNMPv2-MIB::sysServices.0 = INTEGER: 72 SNMPv2-MIB::sysORLastChange.0 = Timeticks: (0) 0:00:00.00 SNMPv2-MIB::sysORID.1 = OID: SNMP-FRAMEWORK-MIB::snmpFrameworkMIBCompliance SNMPv2-MIB::sysORID.2 = OID: SNMP-MPD-MIB::snmpMPDCompliance SNMPv2-MIB::sysORID.3 = OID: SNMP-USER-BASED-SM-MIB::usmMIBCompliance SNMPv2-MIB::sysORID.4 = OID: SNMPv2-MIB::snmpMIB SNMPv2-MIB::sysORID.5 = OID: TCP-MIB::tcpMIB SNMPv2-MIB::sysORID.6 = OID: IP-MIB::ip SNMPv2-MIB::sysORID.7 = OID: UDP-MIB::udpMIB SNMPv2-MIB::sysORID.8 = OID: SNMP-VIEW-BASED-ACM-MIB::vacmBasicGroup SNMPv2-MIB::sysORDescr.1 = STRING: The SNMP Management Architecture MIB. SNMPv2-MIB::sysORDescr.2 = STRING: The MIB for Message Processing and Dispatching. SNMPv2-MIB::sysORDescr.3 = STRING: The management information definitions for the SNMP User-based Security Model. SNMPv2-MIB::sysORDescr.4 = STRING: The MIB module for SNMPv2 entities SNMPv2-MIB::sysORDescr.5 = STRING: The MIB module for managing TCP implementations SNMPv2-MIB::sysORDescr.6 = STRING: The MIB module for managing IP and ICMP implementations SNMPv2-MIB::sysORDescr.7 = STRING: The MIB module for managing UDP implementations SNMPv2-MIB::sysORDescr.8 = STRING: View-based Access Control Model for SNMP. SNMPv2-MIB::sysORUpTime.1 = Timeticks: (0) 0:00:00.00 Ing. Diego Córdoba www.linuxinstitute.com.ar Pagina 6 de 7
SNMPv2-MIB::sysORUpTime.2 = Timeticks: (0) 0:00:00.00 SNMPv2-MIB::sysORUpTime.3 = Timeticks: (0) 0:00:00.00 SNMPv2-MIB::sysORUpTime.4 = Timeticks: (0) 0:00:00.00 SNMPv2-MIB::sysORUpTime.5 = Timeticks: (0) 0:00:00.00 SNMPv2-MIB::sysORUpTime.6 = Timeticks: (0) 0:00:00.00 SNMPv2-MIB::sysORUpTime.7 = Timeticks: (0) 0:00:00.00 SNMPv2-MIB::sysORUpTime.8 = Timeticks: (0) 0:00:00.00 Si nosotros quisiéramos obtener el valor particular de una determinada variable, podríamos usar el comando snmpget de la siguiente manera: snmpget -v1 -c public localhost sysname.0 cuya salida sería algo similar a lo siguiente: root@alumno:~# snmpget -v1 -c public localhost sysname.0 SNMPv2-MIB::sysName.0 = STRING: alumno Así como hemos leído todas las variables del grupo System, y luego obtenido el valor en concreto de la variable sysname.0, podríamos hacerlo para consultar cualquier variable del sistema que corre el agente. Hay que tener en cuenta que los principales grupos de la MIB son estándar, mientras que cada fabricante puede agregar sus propios grupos a sus MIB's para dar información más detallada de ciertos servicios adicionales que pueda brindar su dispositivo. Ing. Diego Córdoba www.linuxinstitute.com.ar Pagina 7 de 7