4 SNMP trap

Panoramica

La ricezione dei trap SNMP è l'opposto dell'interrogazione di dispositivi abilitati SNMP.

In questo caso, le informazioni vengono inviate da un dispositivo abilitato SNMP a snmptrapd e vengono raccolte o "trappate" da Zabbix server o Zabbix proxy da un file.

Di solito, i trap vengono inviati in seguito a una modifica di stato e l'agent si connette al server sulla porta 162 (a differenza della porta 161 sul lato dell'agent utilizzata per le query). L'uso dei trap può rilevare alcuni problemi brevi che si verificano tra un intervallo di query e l'altro e che potrebbero essere persi dai dati interrogati.

La ricezione dei trap SNMP in Zabbix è progettata per funzionare con snmptrapd e con uno dei meccanismi per inoltrare i trap a Zabbix - uno script Bash o Perl oppure SNMPTT.

Il modo più semplice per configurare il monitoraggio dei trap dopo aver configurato Zabbix è usare la soluzione con script Bash, perché Perl e SNMPTT spesso mancano nelle distribuzioni moderne e richiedono una configurazione più complessa. Tuttavia, questa soluzione usa uno script configurato come traphandle. Per prestazioni migliori sui sistemi di produzione, usa la soluzione con Perl incorporato (uno script con l'opzione do perl oppure SNMPTT).

Il flusso di lavoro della ricezione di un trap:

  1. snmptrapd riceve un trap.
  2. snmptrapd passa il trap allo script ricevitore (Bash, Perl) o a SNMPTT.
  3. Il ricevitore analizza, formatta e scrive il trap in un file.
  4. Lo SNMP trapper di Zabbix legge e analizza il file dei trap.
  5. Per ogni trap Zabbix trova tutti gli item SNMP trapper con interfacce host corrispondenti all'indirizzo del trap ricevuto. Nota che durante la corrispondenza viene usato solo l'IP o il DNS selezionato nell'interfaccia host.
  6. Per ogni item trovato, il trap viene confrontato con la regexp in snmptrap[regexp]. Il trap viene impostato come valore di tutti gli item corrispondenti. Se non viene trovato alcun item corrispondente e c'è un item snmptrap.fallback, il trap viene impostato come suo valore.
  7. Se il trap non è stato impostato come valore di alcun item, Zabbix per impostazione predefinita registra il trap non corrispondente. (Questa opzione è configurata da Log unmatched SNMP traps in Administration > General > Other.)
Note sul failover HA

Durante il passaggio del nodo ad alta disponibilità (HA), Zabbix continuerà l'elaborazione a partire dall'ultimo record entro l'ultimo timestamp ISO 8601; se lo stesso record non viene trovato, allora verrà utilizzato solo il timestamp per identificare l'ultima posizione.

Configurazione dei trap SNMP

Questo tipo di item richiede la seguente configurazione del frontend:

Passo 1: Creare un'interfaccia SNMP per l'host
  1. In Data collection > Hosts, crea un host oppure modifica quello esistente.
  2. Nel campo Interfaces, seleziona il tipo di interfaccia SNMP.
  3. Inserisci l'indirizzo IP/nome DNS e il numero di porta.
  4. Seleziona la versione SNMP dal menu a discesa: (SNMPv1, SNMPv2, oppure SNMPv3) e aggiungi le credenziali dell'interfaccia in base alla versione SNMP selezionata.

L'indirizzo di ogni trap ricevuto verrà confrontato con gli indirizzi IP e DNS di tutte le interfacce SNMP per trovare gli host corrispondenti.

Passo 2: Configurare l'item
  1. Per l'host, crea un item oppure modifica quello esistente.
  2. Nel campo Key, usa una delle chiavi per trap SNMP:

    • snmptrap[regexp] - intercetta tutte le trap SNMP che corrispondono all'espressione regolare specificata nel parametro regexp; se regexp non è specificato, intercetta qualsiasi trap.
      Nel parametro sono supportate le macro utente e le espressioni regolari globali.
      Valore restituito: trap SNMP.
      Questo item può essere impostato solo per interfacce SNMP.
    • snmptrap.fallback - intercetta tutte le trap SNMP che non sono state intercettate da nessuno degli item snmptrap[] per quella interfaccia.
      Valore restituito: trap SNMP.
      Questo item può essere impostato solo per interfacce SNMP.

La corrispondenza di espressioni regolari multilinea non è supportata al momento.

  1. Imposta Type of information su Log affinché i timestamp vengano analizzati. Sono accettabili anche altri formati, come Numeric, ma potrebbero richiedere un gestore trap personalizzato.

Configurazione del monitoraggio delle trap SNMP

Configurazione di Zabbix server/proxy

Per leggere i trap, Zabbix server o proxy deve essere configurato per avviare il processo SNMP trapper e puntare al file dei trap che viene scritto da SNMPTT o da un ricevitore di trap Bash/Perl. Per farlo, modifica il file di configurazione (zabbix\_server.conf o zabbix\_proxy.conf):

StartSNMPTrapper=1
SNMPTrapperFile=[TRAP FILE]

Se viene usato il parametro systemd PrivateTmp, è improbabile che questo file funzioni in /tmp.

Configurazione del ricevitore trap Bash

Requisiti: solo snmptrapd.

Uno script ricevitore trap Bash script può essere usato per passare i trap a Zabbix server da snmptrapd usando il file trapper. Per configurarlo, aggiungi l'opzione traphandle al file di configurazione di snmptrapd (snmptrapd.conf), vedi esempio.

Potrebbe essere necessario riavviare snmptrapd per applicare le modifiche alla sua configurazione.

Configurazione del ricevitore trap Perl

Requisiti: Perl, Net-SNMP compilato con --enable-embedded-perl (impostato per default da Net-SNMP 5.4)

Un ricevitore trap Perl (cerca misc/snmptrap/zabbix\_trap\_receiver.pl) può essere usato per passare i trap a Zabbix server direttamente da snmptrapd. Per configurarlo:

  • Aggiungi lo script Perl al file di configurazione di snmptrapd (snmptrapd.conf), ad esempio:
perl do "[FULL PATH TO PERL RECEIVER SCRIPT]";
  • configura il ricevitore, ad esempio:
$SNMPTrapperFile = '[TRAP FILE]';
$DateTimeFormat = '[DATE TIME FORMAT]';

Potrebbe essere necessario riavviare snmptrapd per applicare le modifiche alla sua configurazione.

Se il nome dello script non è racchiuso tra virgolette, snmptrapd rifiuterà di avviarsi con messaggi simili ai seguenti:

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
Configurazione di SNMPTT

Per prima cosa, snmptrapd deve essere configurato per usare SNMPTT.

Per ottenere le migliori prestazioni, SNMPTT dovrebbe essere configurato come daemon usando snmptthandler-embedded per inoltrargli i trap. Vedere le istruzioni per configurare SNMPTT.

Quando SNMPTT è configurato per ricevere i trap, configurare snmptt.ini:

  1. Abilitare l'uso del modulo Perl del pacchetto NET-SNMP:
net_snmp_perl_enable = 1
  1. Registrare i trap nel file dei trap che verrà letto da Zabbix:
log_enable = 1
log_file = [TRAP FILE]
  1. Impostare il formato data-ora:
date_time_format = %Y-%m-%dT%H:%M:%S%z

Il pacchetto net-snmp-perl è stato rimosso in RHEL 8.0-8.2; è stato reintrodotto in RHEL 8.3. Per ulteriori informazioni, vedere i problemi noti.

Ora formattare i trap in modo che Zabbix li riconosca (modificare snmptt.conf):

  1. Ogni istruzione FORMAT deve iniziare con ZBXTRAP [address], dove [address] verrà confrontato con gli indirizzi IP e DNS delle interfacce SNMP su Zabbix. Ad esempio:
EVENT coldStart .1.3.6.1.6.3.1.1.5.1 "Status Events" Normal
FORMAT ZBXTRAP $aA Device reinitialized (coldStart)
  1. Vedere ulteriori informazioni sul formato dei trap SNMP di seguito.

Non usare trap sconosciuti - Zabbix non sarà in grado di riconoscerli. I trap sconosciuti possono essere gestiti definendo un evento generale in snmptt.conf:

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

Tutti i ricevitori trap Perl personalizzati e la configurazione trap SNMPTT devono formattare il trap nel modo seguente:

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

dove

  • [timestamp] - il timestamp nel formato %Y-%m-%dT%H:%M:%S%z.
  • ZBXTRAP - intestazione che indica che in questa riga inizia un nuovo trap.
  • [address] - indirizzo IP usato per trovare l'host per questo trap.

Nota che ZBXTRAP e [address] verranno rimossi dal messaggio durante l'elaborazione. Se il trap è formattato in modo diverso, Zabbix potrebbe analizzare i trap in modo imprevisto.

Esempio di 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

Questo produrrà il seguente trap per l'interfaccia 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

Requisiti di sistema

Si consiglia di installare i file MIB per garantire che i valori degli item siano visualizzati nel formato corretto. Senza i file MIB, potrebbero verificarsi problemi di formattazione, come la visualizzazione dei valori in HEX invece che in UTF-8 o viceversa.

Supporto per file di grandi dimensioni

Zabbix supporta file di grandi dimensioni per i file SNMP trapper. La dimensione massima del file che Zabbix può leggere è 2\^63 (8 EiB). Si noti che il filesystem può imporre un limite inferiore alla dimensione del file.

Rotazione dei log

Zabbix non fornisce alcun sistema di rotazione dei log: questa operazione deve essere gestita dall'utente. La rotazione dei log dovrebbe prima rinominare il vecchio file e solo successivamente eliminarlo, in modo che non si perdano trap:

  1. Zabbix apre il file trap nell'ultima posizione nota e passa al punto 3.
  2. Zabbix verifica se il file attualmente aperto è stato ruotato confrontando il numero inode con il numero inode del file trap definito. Se non esiste alcun file aperto, Zabbix reimposta l'ultima posizione e torna al punto 1.
  3. Zabbix legge i dati dal file attualmente aperto e imposta la nuova posizione.
  4. I nuovi dati vengono analizzati. Se si trattava del file ruotato, il file viene chiuso e si torna al punto 2.
  5. Se non ci sono nuovi dati, Zabbix attende 1 secondo e torna al punto 2.
File system

A causa dell'implementazione del file trap, Zabbix necessita che il file system supporti gli inode per distinguere i file (le informazioni vengono acquisite tramite una chiamata stat()).

Esempi di configurazione usando diverse versioni del protocollo SNMP

Questo esempio usa snmptrapd e uno script Bash ricevitore per inoltrare i trap a server Zabbix.

Configurazione:

  1. Configura Zabbix per avviare SNMP trapper e impostare il file dei trap. Aggiungi a zabbix_server.conf:
StartSNMPTrapper=1
SNMPTrapperFile=/var/lib/zabbix/snmptraps/snmptraps.log
  1. Scarica lo script Bash in /usr/sbin/zabbix_trap_handler.sh:
curl -o /usr/sbin/zabbix_trap_handler.sh https://raw.githubusercontent.com/zabbix/zabbix-docker/7.4/templates/scripts/snmptraps/zabbix_trap_handler.sh

Se necessario, modifica la variabile ZABBIX_TRAPS_FILE nello script. Per usare il valore predefinito, crea prima la directory padre:

mkdir -p /var/lib/zabbix/snmptraps
  1. Aggiungi quanto segue a snmtrapd.conf (fai riferimento all'esempio funzionante)
traphandle default /bin/bash /usr/sbin/zabbix_trap_handler.sh

Potrebbe essere necessario riavviare snmptrapd per applicare le modifiche alla configurazione.

  1. Crea un item SNMP TEST (tieni presente i requisiti iniziali di configurazione):

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

Nota che viene usato il formato data e ora ISO 8601.

  1. Successivamente configureremo snmptrapd per la versione del protocollo SNMP scelta e invieremo trap di test usando l'utility snmptrap.
SNMPv1, SNMPv2

I protocolli SNMPv1 e SNMPv2 si basano sull'autenticazione tramite "community string". Nell'esempio seguente useremo "secret" come community string. Deve essere impostata con lo stesso valore sui mittenti dei trap SNMP.

Tieni presente che, pur essendo ancora ampiamente usato negli ambienti di produzione, SNMPv2 non offre alcuna crittografia né una reale autenticazione del mittente. I dati vengono inviati in testo semplice e quindi queste versioni del protocollo dovrebbero essere usate solo in ambienti sicuri, come una rete privata, e non dovrebbero mai essere usate su reti pubbliche o di terze parti.

SNMP versione 1 non è più realmente usato oggi, poiché non supporta i contatori a 64 bit ed è considerato un protocollo legacy.

Per abilitare l'accettazione dei trap SNMPv1 o SNMPv2, devi aggiungere la seguente riga a snmptrapd.conf. Sostituisci secret con la community string SNMP configurata sui mittenti dei trap SNMP:

authCommunity log,execute,net secret

Successivamente possiamo inviare un trap di test usando snmptrap. In questo esempio useremo il comune OID "link up":

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

SNMPv3 risolve i problemi di sicurezza di SNMPv1/v2 e fornisce autenticazione e crittografia. Puoi usare i metodi di autenticazione MD5 o più SHA e DES/più AES come cifratura.

Per abilitare l'accettazione di SNMPv3 aggiungi le seguenti righe a snmptrapd.conf:

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

Nota la parola chiave "execute" che consente di eseguire script per questo modello di sicurezza utente.

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

Se desideri usare metodi di crittografia avanzati come AES192 o AES256, usa net-snmp a partire dalla versione 5.8. Potrebbe essere necessario ricompilarlo con l'opzione configure: --enable-blumenthal-aes. Le versioni precedenti di net-snmp non supportano AES192/AES256. Vedi anche: Strong Authentication or Encryption.

Verifica

In entrambi gli esempi vedrai righe simili nel file /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

Il valore dell'item in Zabbix sarà:

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

Esempio 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

Vedi anche