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:
snmptrapdriceve un trap.snmptrapdpassa il trap allo script ricevitore (Bash, Perl) o a SNMPTT.- Il ricevitore analizza, formatta e scrive il trap in un file.
- Lo SNMP trapper di Zabbix legge e analizza il file dei trap.
- 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.
- 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 itemsnmptrap.fallback, il trap viene impostato come suo valore. - 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
- In Data collection > Hosts, crea un host oppure modifica quello esistente.
- Nel campo Interfaces, seleziona il tipo di interfaccia SNMP.
- Inserisci l'indirizzo IP/nome DNS e il numero di porta.
- 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
- Per l'host, crea un item oppure modifica quello esistente.
-
Nel campo Key, usa una delle chiavi per trap SNMP:
snmptrap[regexp]- intercetta tutte le trap SNMP che corrispondono all'espressione regolare specificata nel parametroregexp; seregexpnon è 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 itemsnmptrap[]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.
- 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:
- Abilitare l'uso del modulo Perl del pacchetto
NET-SNMP:
net_snmp_perl_enable = 1
- Registrare i trap nel file dei trap che verrà letto da Zabbix:
log_enable = 1
log_file = [TRAP FILE]
- 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):
- Ogni istruzione
FORMATdeve iniziare conZBXTRAP [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)
- 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:
- Zabbix apre il file trap nell'ultima posizione nota e passa al punto 3.
- 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.
- Zabbix legge i dati dal file attualmente aperto e imposta la nuova posizione.
- I nuovi dati vengono analizzati. Se si trattava del file ruotato, il file viene chiuso e si torna al punto 2.
- 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 utilizzando diverse versioni del protocollo SNMP
Questo esempio utilizza snmptrapd e uno script Bash ricevitore per inoltrare i trap al server Zabbix.
Configurazione:
- Configurare Zabbix per avviare lo SNMP trapper e impostare il file dei trap. Aggiungere a
zabbix_server.conf:
StartSNMPTrapper=1
SNMPTrapperFile=/var/lib/zabbix/snmptraps/snmptraps.log
- 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/7.4/templates/scripts/snmptraps/zabbix_trap_handler.sh
Se necessario, modificare la variabile ZABBIX_TRAPS_FILE nello script.
Per utilizzare il valore predefinito, creare prima la directory principale:
mkdir -p /var/lib/zabbix/snmptraps
- 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 affinché acquisisca le modifiche alla configurazione.
-
Creare un item SNMP TEST (tenere presenti i requisiti iniziali di configurazione):
Tipo: SNMP trap
Tipo di informazioni: Log
Interfaccia host: SNMP 127.0.0.1
Chiave:snmptrap["linkUp"]
Formato dell'ora del log:yyyyMMdd.hhmmss
Si noti che viene utilizzato il formato di data e ora ISO 8601.
- Ora configureremo
snmptrapdper la versione del protocollo SNMP scelta e invieremo trap di test utilizzando l'utilitysnmptrap.
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 dei trap SNMP.
Si noti che, sebbene SNMPv2 sia ancora ampiamente utilizzato negli ambienti di produzione, non offre alcuna crittografia né una reale autenticazione del mittente. I dati vengono inviati in testo non crittografato e pertanto queste versioni del protocollo devono essere utilizzate solo in ambienti sicuri, come una rete privata, e non devono mai essere utilizzate su reti pubbliche o di terze parti.
La versione 1 di SNMP non viene praticamente più utilizzata, poiché non supporta i contatori a 64 bit ed è considerata un protocollo legacy.
Per abilitare l'accettazione dei trap SNMPv1 o SNMPv2, aggiungere la riga seguente a snmptrapd.conf.
Sostituire secret con la community string SNMP configurata nei mittenti dei trap SNMP:
authCommunity log,execute,net secret
Ora possiamo inviare un trap di test utilizzando snmptrap. In questo esempio utilizzeremo l'OID comune "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. È possibile utilizzare i metodi di autenticazione MD5 o diversi metodi SHA e DES/diversi algoritmi AES come cifratura.
Configurare snmptrapd per accettare trap SNMPv3 aggiungendo le righe seguenti a snmptrapd.conf:
# Creare un utente USM SNMPv3 con autenticazione e privacy
createUser -e <engineID> <securityName> SHA <authKey> AES <privKey>
# Consentire all'utente di registrare i trap ed eseguire gli script del gestore dei trap
authUser log,execute <securityName>
Ad esempio:
createUser -e 0x8000000001020304 traptest SHA myAuthPassword AES myPrivPassword
authUser log,execute traptest
Si noti la parola chiave "execute", che consente di eseguire script per questo modello di sicurezza utente.
Per testare la configurazione del trap SNMPv3, inviare un trap di test utilizzando il comando seguente:
snmptrap -v 3 -n "" -a SHA -A myAuthPassword -x AES -X myPrivPassword -l authPriv -u traptest -e 0x8000000001020304 localhost 0 linkUp.0
Se si desidera utilizzare metodi di crittografia 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 verranno visualizzate 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