3 trappole SNMP

Panoramica

La ricezione delle trap SNMP è l'opposto dell'interrogazione dei dispositivi con SNMP abilitato.

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

Di solito, le trap vengono inviate al verificarsi di un cambiamento di condizione e l'agent si connette al server sulla porta 162 (a differenza della porta 161 sul lato agent utilizzata per le interrogazioni). L'uso delle trap può rilevare alcuni problemi brevi che si verificano nell'intervallo tra le interrogazioni e che potrebbero non essere rilevati dai dati delle interrogazioni.

La ricezione delle trap SNMP in Zabbix è progettata per funzionare con snmptrapd e con uno dei meccanismi per passare le trap a Zabbix: uno script Bash o Perl oppure SNMPTT.

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

Il flusso di lavoro per la ricezione di una trap:

  1. snmptrapd riceve una trap
  2. snmptrapd passa la trap allo script ricevitore (Bash, Perl) oppure a SNMPTT
  3. Il ricevitore analizza, formatta e scrive la trap in un file
  4. Zabbix SNMP trapper legge e analizza il file delle trap
  5. Per ogni trap, Zabbix trova tutti gli item "SNMP trapper" con interfacce host corrispondenti all'indirizzo della trap ricevuta. Si noti che durante la corrispondenza viene utilizzato solo il valore "IP" o "DNS" selezionato nell'interfaccia host.
  6. Per ogni item trovato, la trap viene confrontata con la regexp in snmptrap[regexp]. La trap viene impostata come valore di tutti gli item corrispondenti. Se non viene trovato alcun item corrispondente ed esiste un item snmptrap.fallback, la trap viene impostata come valore di quest'ultimo.
  7. Se la trap non è stata impostata come valore di alcun item, Zabbix per impostazione predefinita registra la 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 delle trap SNMP

Questo tipo di item richiede la seguente configurazione del frontend.

1. Creare un'interfaccia SNMP per il proprio host

  • In Data collection > Hosts, creare/modificare l'host e, nel campo Interfaces, aggiungere il tipo di interfaccia "SNMP", specificando l'indirizzo IP o DNS.

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

2. Configurare l'item

  • In Data collection > Hosts, creare/modificare l'item necessario.
  • Nel campo Key, utilizzare una delle chiavi trap SNMP:
Key
Description Return value Comments
snmptrap[regexp]
Intercetta tutte le trap SNMP che corrispondono alla espressione regolare specificata in regexp. Se regexp non è specificato, intercetta qualsiasi trap. Trap SNMP Questo item può essere impostato solo per interfacce SNMP.
Le macro utente e le espressioni regolari globali sono supportate nel parametro di questa chiave item.
snmptrap.fallback
Intercetta tutte le trap SNMP che non sono state intercettate da nessuno degli item snmptrap[] per quell'interfaccia. Trap SNMP Questo item può essere impostato solo per interfacce SNMP.

La corrispondenza di espressioni regolari multilinea non è attualmente supportata.

  • Impostare Type of information su "Log" affinché i timestamp vengano analizzati. Anche altri formati come "Numeric" sono accettabili, ma potrebbero richiedere un gestore trap personalizzato.

Configurazione del monitoraggio delle trap SNMP

Configurazione di Zabbix server/proxy

Per leggere le trap, Zabbix server o proxy deve essere configurato per avviare il processo SNMP trapper e puntare al file delle trap in cui vengono scritte da SNMPTT o da un ricevitore di trap Bash/Perl. Per farlo, modificare il file di configurazione (zabbix_server.conf o zabbix_proxy.conf):

StartSNMPTrapper=1
SNMPTrapperFile=[TRAP FILE]

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

Configurazione del ricevitore di trap Bash

Requisiti: solo snmptrapd.

Uno script per un ricevitore di trap Bash può essere utilizzato per passare le trap a Zabbix server da snmptrapd usando il file trapper. Per configurarlo, aggiungere l'opzione traphandle al file di configurazione di snmptrapd (snmptrapd.conf), vedere esempio.

Potrebbe essere necessario riavviare snmptrapd affinché recepisca le modifiche alla sua configurazione.

Configurazione del ricevitore trap Perl

Requisiti: Perl, Net-SNMP compilato con --enable-embedded-perl (eseguito per impostazione predefinita a partire da Net-SNMP 5.4)

Un ricevitore trap Perl (vedere misc/snmptrap/zabbix_trap_receiver.pl) può essere utilizzato per passare le trap direttamente al server Zabbix da snmptrapd. Per configurarlo:

  • aggiungere lo script Perl al file di configurazione di snmptrapd (snmptrapd.conf), ad esempio:
perl do "[FULL PATH TO PERL RECEIVER SCRIPT]";
  • configurare 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 si rifiuterà di avviarsi con messaggi simili a questi:

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 utilizzare SNMPTT.

Per ottenere le migliori prestazioni, SNMPTT deve essere configurato come daemon utilizzando snmptthandler-embedded per inoltrargli le trap. Vedere le istruzioni per la configurazione di SNMPTT.

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

  1. abilitare l'uso del modulo Perl del pacchetto NET-SNMP:
net_snmp_perl_enable = 1
  1. registrare le trap nel file trap che verrà letto da Zabbix:
log_enable = 1
log_file = [TRAP FILE]
  1. impostare il formato di data e ora:
date_time_format = %Y-%m-%dT%H:%M:%S%z

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

Ora formattare le trap affinché Zabbix possa riconoscerle (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 in 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 delle trap SNMP di seguito.

Non utilizzare trap sconosciute: Zabbix non sarà in grado di riconoscerle. Le trap sconosciute possono essere gestite definendo un evento generale in snmptt.conf:

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

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

[timestamp] [la trap, parte 1] ZBXTRAP [address] [la trap, parte 2]

dove

  • [timestamp] - il timestamp nel formato "%Y-%m-%dT%H:%M:%S%z"
  • ZBXTRAP - intestazione che indica che una nuova trap inizia in questa riga
  • [address] - indirizzo IP utilizzato per trovare l'host per questa trap

Si noti che "ZBXTRAP" e "[address]" verranno rimossi dal messaggio durante l'elaborazione. Se la trap è formattata diversamente, Zabbix potrebbe analizzare le 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à la 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 deve prima rinominare il vecchio file e solo successivamente eliminarlo, in modo che nessuna trap vada persa:\

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

A causa dell'implementazione del file trap, Zabbix ha bisogno che il file system supporti gli inode per differenziare i file (le informazioni vengono acquisite da a chiamata stat()).

Esempi di configurazione con diverse versioni del protocollo SNMP

Questo esempio utilizza snmptrapd e uno script ricevitore Bash per passare le trap al server Zabbix.

Configurazione:

  1. Configurare Zabbix per avviare SNMP trapper e impostare il file delle trap. Aggiungere a zabbix_server.conf:
StartSNMPTrapper=1
SNMPTrapperFile=/var/lib/zabbix/snmptraps/snmptraps.log
  1. Scaricare 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/trunk/Dockerfiles/snmptraps/alpine/conf/usr/sbin/zabbix_trap_handler.sh

Se necessario, modificare la variabile ZABBIX_TRAPS_FILE nello script. Per utilizzare il valore predefinito, creare prima la directory padre:

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

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

  1. Creare un item SNMP TEST (tenere presenti i requisiti di configurazione iniziali):\

    Tipo: SNMP trap
    Tipo di informazione: Log Interfaccia host: SNMP 127.0.0.1
    Chiave: snmptrap["linkUp"]
    Formato orario del log: yyyyMMdd.hhmmss

Si noti che viene utilizzato il formato di data e ora ISO 8601.

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

I protocolli SNMPv1 e SNMPv2 si basano sull'autenticazione tramite "community string". Nell'esempio seguente utilizzeremo "secret" come community string. Deve essere impostata sullo stesso valore nei mittenti di trap SNMP.

Si noti che, sebbene SNMPv2 sia ancora ampiamente utilizzato negli ambienti di produzione, non offre alcuna cifratura né una reale autenticazione del mittente. I dati vengono inviati in testo semplice e pertanto queste versioni del protocollo dovrebbero essere utilizzate solo in ambienti sicuri come una rete privata e non dovrebbero mai essere utilizzate su reti pubbliche o di terze parti.

La versione 1 di SNMP oggi non è praticamente più utilizzata, poiché non supporta i contatori a 64 bit ed è considerata un protocollo legacy.

Per abilitare l'accettazione di trap SNMPv1 o SNMPv2 è necessario aggiungere la seguente riga a snmptrapd.conf. Sostituire "secret" con la community string SNMP configurata sui mittenti di trap SNMP:

authCommunity log,execute,net secret

Successivamente possiamo inviare una trap di test utilizzando 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 cifratura. È possibile utilizzare MD5 o più metodi di autenticazione SHA e DES/più varianti AES come cifrario.

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

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

Si noti 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 si desidera utilizzare metodi di cifratura avanzati come AES192 o AES256, utilizzare 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. Vedere anche: Strong Authentication or Encryption.

Verifica

In entrambi gli esempi si vedranno 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