4 SNMP trap

Overview

Recibir traps SNMP es lo opuesto a consultar dispositivos habilitados para SNMP.

En este caso, la información se envía desde un dispositivo habilitado para SNMP a snmptrapd y es recopilada o "capturada" por el server de Zabbix o el proxy de Zabbix desde un archivo.

Normalmente, los traps se envían cuando cambia alguna condición y el agent se conecta al server en el puerto 162 (a diferencia del puerto 161 en el lado del agent, que se usa para consultas). El uso de traps puede detectar algunos problemas breves que ocurren entre intervalos de consulta y que podrían pasar desapercibidos en los datos consultados.

La recepción de traps SNMP en Zabbix está diseñada para funcionar con snmptrapd y uno de los mecanismos para pasar los traps a Zabbix: ya sea un script Bash o Perl, o SNMPTT.

La forma más sencilla de configurar la supervisión de traps después de configurar Zabbix es usar la solución con script Bash, porque Perl y SNMPTT a menudo no están disponibles en las distribuciones modernas y requieren una configuración más compleja. Sin embargo, esta solución usa un script configurado como traphandle. Para un mejor rendimiento en sistemas de producción, use la solución con Perl integrado (ya sea un script con la opción do perl o SNMPTT).

El flujo de trabajo de recepción de un trap:

  1. snmptrapd recibe un trap.
  2. snmptrapd pasa el trap al script receptor (Bash, Perl) o a SNMPTT.
  3. El receptor analiza, da formato y escribe el trap en un archivo.
  4. El SNMP trapper de Zabbix lee y analiza el archivo de traps.
  5. Para cada trap, Zabbix encuentra todos los items de SNMP trapper con interfaces de host que coincidan con la dirección del trap recibido. Tenga en cuenta que durante la coincidencia solo se usa la IP o el DNS seleccionado en la interfaz del host.
  6. Para cada item encontrado, el trap se compara con la regexp en snmptrap[regexp]. El trap se establece como el valor de todos los items coincidentes. Si no se encuentra ningún item coincidente y existe un item snmptrap.fallback, el trap se establece como el valor de ese item.
  7. Si el trap no se estableció como valor de ningún item, Zabbix registra de forma predeterminada el trap no coincidente. (Esto se configura mediante Registrar traps SNMP no coincidentes en Administración > General > Otros.)
Notas sobre la conmutación por error en HA

Durante el cambio de nodo en alta disponibilidad (HA), Zabbix continuará procesando después del último registro dentro de la última marca de tiempo ISO 8601; si no se encuentra el mismo registro, entonces solo se utilizará la marca de tiempo para identificar la última posición.

Configuración de traps SNMP

Este tipo de item requiere la siguiente configuración del frontend:

Paso 1: Crear una interfaz SNMP para el host
  1. En Recopilación de datos > Hosts, cree un host o edite el existente.
  2. En el campo Interfaces, seleccione el tipo de interfaz SNMP.
  3. Introduzca la dirección IP/nombre DNS y el número de puerto.
  4. Seleccione la versión SNMP en la lista desplegable: (SNMPv1, SNMPv2, o SNMPv3) y añada las credenciales de la interfaz según la versión SNMP seleccionada.

La dirección de cada trap recibido se comparará con las direcciones IP y DNS de todas las interfaces SNMP para encontrar los hosts correspondientes.

Paso 2: Configurar el item
  1. Para el host, cree un item o edite el existente.
  2. En el campo Key, use una de las claves de trap SNMP:

    • snmptrap[regexp] - captura todos los traps SNMP que coincidan con la expresión regular especificada en el parámetro regexp; si regexp no se especifica, captura cualquier trap.
      Se admiten macros de usuario y expresiones regulares globales en el parámetro.
      Valor devuelto: trap SNMP.
      Este item solo puede configurarse para interfaces SNMP.
    • snmptrap.fallback - captura todos los traps SNMP que no hayan sido capturados por ninguno de los items snmptrap[] de esa interfaz.
      Valor devuelto: trap SNMP.
      Este item solo puede configurarse para interfaces SNMP.

En este momento no se admite la coincidencia de expresiones regulares multilínea.

  1. Establezca Tipo de información en Log para que se analicen las marcas de tiempo. Otros formatos, como Numérico, también son aceptables, pero podrían requerir un controlador de traps personalizado.

Configuración de la monitorización de traps SNMP

Configuración de Zabbix server/proxy

Para leer las traps, se debe configurar Zabbix server o proxy para iniciar el proceso SNMP trapper y apuntar al archivo de traps que está siendo escrito por SNMPTT o por un receptor de traps Bash/Perl. Para ello, edite el archivo de configuración (zabbix\_server.conf o zabbix\_proxy.conf):

StartSNMPTrapper=1
SNMPTrapperFile=[TRAP FILE]

Si se utiliza el parámetro de systemd PrivateTmp, es poco probable que este archivo funcione en /tmp.

Configuración del receptor de traps Bash

Requisitos: solo snmptrapd.

Se puede usar un script receptor de traps Bash para pasar traps a Zabbix server desde snmptrapd usando el archivo trapper. Para configurarlo, agregue la opción traphandle al archivo de configuración de snmptrapd (snmptrapd.conf); consulte el ejemplo.

Es posible que sea necesario reiniciar snmptrapd para que aplique los cambios en su configuración.

Configurando el receptor de traps de Perl

Requisitos: Perl, Net-SNMP compilado con --enable-embedded-perl (habilitado de forma predeterminada desde Net-SNMP 5.4)

Se puede usar un receptor de traps de Perl (busque misc/snmptrap/zabbix\_trap\_receiver.pl) para pasar traps a Zabbix server directamente desde snmptrapd. Para configurarlo:

  • Añada el script de Perl al archivo de configuración de snmptrapd (snmptrapd.conf), por ejemplo:
perl do "[FULL PATH TO PERL RECEIVER SCRIPT]";
  • Configure el receptor, por ejemplo:
$SNMPTrapperFile = '[TRAP FILE]';
$DateTimeFormat = '[DATE TIME FORMAT]';

Es posible que sea necesario reiniciar snmptrapd para que aplique los cambios en su configuración.

Si el nombre del script no está entre comillas, snmptrapd se negará a iniciarse con mensajes similares a estos:

Regexp modifiers "/l" and "/a" are mutually exclusive at (eval 2) line 1, at end of line
Regexp modifier "/l" may not appear twice at (eval 2) line 1, at end of line
Configuración de SNMPTT

En primer lugar, snmptrapd debe configurarse para usar SNMPTT.

Para obtener el mejor rendimiento, SNMPTT debe configurarse como un daemon usando snmptthandler-embedded para pasarle los traps. Consulte las instrucciones para configurar SNMPTT.

Cuando SNMPTT esté configurado para recibir los traps, configure snmptt.ini:

  1. Habilite el uso del módulo Perl del paquete NET-SNMP:
net_snmp_perl_enable = 1
  1. Registre los traps en el archivo de traps que será leído por Zabbix:
log_enable = 1
log_file = [TRAP FILE]
  1. Establezca el formato de fecha y hora:
date_time_format = %Y-%m-%dT%H:%M:%S%z

El paquete net-snmp-perl se eliminó en RHEL 8.0-8.2; se volvió a agregar en RHEL 8.3. Para obtener más información, consulte los problemas conocidos.

Ahora formatee los traps para que Zabbix los reconozca (edite snmptt.conf):

  1. Cada instrucción FORMAT debe comenzar con ZBXTRAP [address], donde [address] se comparará con las direcciones IP y DNS de las interfaces SNMP en Zabbix. Por ejemplo:
EVENT coldStart .1.3.6.1.6.3.1.1.5.1 "Status Events" Normal
FORMAT ZBXTRAP $aA Device reinitialized (coldStart)
  1. Consulte más información sobre el formato de traps SNMP a continuación.

No use traps desconocidos: Zabbix no podrá reconocerlos. Los traps desconocidos se pueden gestionar definiendo un evento general en snmptt.conf:

EVENT general .* "General event" Normal
Formato de trap SNMP

Todos los receptores de traps Perl personalizados y la configuración de traps de SNMPTT deben formatear el trap de la siguiente manera:

[timestamp] [the trap, part 1] ZBXTRAP [address] [the trap, part 2]

donde

  • [timestamp] - la marca de tiempo en formato %Y-%m-%dT%H:%M:%S%z.
  • ZBXTRAP - encabezado que indica que un nuevo trap comienza en esta línea.
  • [address] - dirección IP utilizada para encontrar el host de este trap.

Tenga en cuenta que ZBXTRAP y [address] se eliminarán del mensaje durante el procesamiento. Si el trap tiene otro formato, Zabbix podría analizar los traps de forma inesperada.

Ejemplo de trap:

2024-01-11T15:28:47+0200 .1.3.6.1.6.3.1.1.5.3 Normal "Status Events" localhost - ZBXTRAP 192.168.1.1 Link down on interface 2. Admin state: 1. Operational state: 2

Esto dará como resultado el siguiente trap para la interfaz SNMP con IP=192.168.1.1:

2024-01-11T15:28:47+0200 .1.3.6.1.6.3.1.1.5.3 Normal "Status Events"
localhost - Link down on interface 2. Admin state: 1. Operational state: 2

Requisitos del sistema

Se recomienda instalar archivos MIB para garantizar que los valores de las métricas se muestren en el formato correcto. Sin los archivos MIB, pueden producirse problemas de formato, como mostrar valores en HEX en lugar de UTF-8 o viceversa.

Soporte para archivos grandes

Zabbix tiene soporte para archivos grandes en los archivos de SNMP trapper. El tamaño máximo de archivo que Zabbix puede leer es 2\^63 (8 EiB). Tenga en cuenta que el sistema de archivos puede imponer un límite inferior al tamaño del archivo.

Rotación de logs

Zabbix no proporciona ningún sistema de rotación de logs; eso debe ser gestionado por el usuario. La rotación de logs primero debe renombrar el archivo antiguo y solo después eliminarlo, para que no se pierdan traps:

  1. Zabbix abre el archivo de traps en la última ubicación conocida y pasa al paso 3.
  2. Zabbix comprueba si el archivo actualmente abierto ha sido rotado comparando el número de inode con el número de inode del archivo de traps definido. Si no hay ningún archivo abierto, Zabbix restablece la última ubicación y pasa al paso 1.
  3. Zabbix lee los datos del archivo actualmente abierto y establece la nueva ubicación.
  4. Los nuevos datos se analizan. Si este era el archivo rotado, el archivo se cierra y vuelve al paso 2.
  5. Si no había nuevos datos, Zabbix espera 1 segundo y vuelve al paso 2.
Sistema de archivos

Debido a la implementación del archivo trap, Zabbix necesita que el sistema de archivos admita inodos para diferenciar archivos (la información se obtiene mediante una llamada stat()).

Ejemplos de configuración usando diferentes versiones del protocolo SNMP

Este ejemplo usa snmptrapd y un script receptor Bash para pasar traps a Zabbix server.

Configuración:

  1. Configure Zabbix para iniciar el SNMP trapper y establezca el archivo de traps. Añada lo siguiente a zabbix_server.conf:
StartSNMPTrapper=1
SNMPTrapperFile=/var/lib/zabbix/snmptraps/snmptraps.log
  1. Descargue el script Bash en /usr/sbin/zabbix_trap_handler.sh:
curl -o /usr/sbin/zabbix_trap_handler.sh https://raw.githubusercontent.com/zabbix/zabbix-docker/trunk/templates/scripts/snmptraps/zabbix_trap_handler.sh

Si es necesario, ajuste la variable ZABBIX_TRAPS_FILE en el script. Para usar el valor predeterminado, cree primero el directorio padre:

mkdir -p /var/lib/zabbix/snmptraps
  1. Añada lo siguiente a snmtrapd.conf (consulte el ejemplo de trabajo)
traphandle default /bin/bash /usr/sbin/zabbix_trap_handler.sh

Es posible que sea necesario reiniciar snmptrapd para que aplique los cambios en su configuración.

  1. Cree un item SNMP TEST (tenga en cuenta los requisitos de configuración iniciales):

    Type: SNMP trap
    Type of information: Log
    Host interface: SNMP 127.0.0.1
    Key: snmptrap["linkUp"]
    Log time format: yyyyMMdd.hhmmss

Tenga en cuenta que se usa el formato de fecha y hora ISO 8601.

  1. A continuación configuraremos snmptrapd para la versión del protocolo SNMP elegida y enviaremos traps de prueba usando la utilidad snmptrap.
SNMPv1, SNMPv2

Los protocolos SNMPv1 y SNMPv2 dependen de la autenticación mediante "community string". En el ejemplo siguiente usaremos "secret" como community string. Debe establecerse con el mismo valor en los emisores de traps SNMP.

Tenga en cuenta que, aunque sigue usándose ampliamente en entornos de producción, SNMPv2 no ofrece cifrado ni autenticación real del emisor. Los datos se envían en texto plano y, por lo tanto, estas versiones del protocolo solo deben usarse en entornos seguros, como una red privada, y nunca deben usarse en redes públicas o de terceros.

La versión 1 de SNMP ya no se usa realmente hoy en día, ya que no admite contadores de 64 bits y se considera un protocolo heredado.

Para habilitar la aceptación de traps SNMPv1 o SNMPv2, debe añadir la siguiente línea a snmptrapd.conf. Sustituya secret por la community string SNMP configurada en los emisores de traps SNMP:

authCommunity log,execute,net secret

A continuación, podemos enviar un trap de prueba usando snmptrap. Usaremos el OID común "link up" en este ejemplo:

snmptrap -v 2c -c secret localhost '' linkUp.0
SNMPv3

SNMPv3 soluciona los problemas de seguridad de SNMPv1/v2 y proporciona autenticación y cifrado. Puede usar los métodos de autenticación MD5 o varios SHA y DES/varios AES como cifrado.

Para habilitar la aceptación de SNMPv3, añada las siguientes líneas a snmptrapd.conf:

createUser -e 0x8000000001020304 traptest SHA mypassword AES
authuser log,execute traptest

Tenga en cuenta la palabra clave "execute", que permite ejecutar scripts para este modelo de seguridad de usuario.

snmptrap -v 3 -n "" -a SHA -A mypassword -x AES -X mypassword -l authPriv -u traptest -e 0x8000000001020304 localhost 0 linkUp.0

Si desea usar métodos de cifrado fuertes como AES192 o AES256, utilice net-snmp a partir de la versión 5.8. Es posible que tenga que recompilarlo con la opción configure: --enable-blumenthal-aes. Las versiones anteriores de net-snmp no admiten AES192/AES256. Consulte también: Strong Authentication or Encryption.

Verificación

En ambos ejemplos verá líneas similares en su /var/lib/zabbix/snmptraps/snmptraps.log:

2024-01-30T10:04:23+0200 ZBXTRAP 127.0.0.1
UDP: [127.0.0.1]:56585->[127.0.0.1]:162
DISMAN-EVENT-MIB::sysUpTimeInstance = 2538834
SNMPv2-MIB::snmpTrapOID.0 = IF-MIB::linkUp.0

El valor del item en Zabbix será:

2024-01-30 10:04:23 2024-01-30 10:04:21 

2024-01-30T10:04:21+0200 UDP: [127.0.0.1]:56585->[127.0.0.1]:162
DISMAN-EVENT-MIB::sysUpTimeInstance = 2538834
SNMPv2-MIB::snmpTrapOID.0 = IF-MIB::linkUp.0

Ejemplo con Perl:

2024-01-30T11:42:54+0200 ZBXTRAP 127.0.0.1
PDU INFO:
  receivedfrom                   UDP: [127.0.0.1]:58649->[127.0.0.1]:162
  notificationtype               TRAP
  version                        1
  community                      public
  errorstatus                    0
  transactionid                  1
  requestid                      2101882550
  messageid                      0
  errorindex                     0
VARBINDS:
  DISMAN-EVENT-MIB::sysUpTimeInstance type=67 value=Timeticks: (457671) 1:16:16.71
  SNMPv2-MIB::snmpTrapOID.0      type=6  value=OID: IF-MIB::linkUp.0

Véase también