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 usando diverse versioni del protocollo SNMP
Questo esempio usa snmptrapd e uno script Bash ricevitore per inoltrare i trap a server Zabbix.
Configurazione:
- 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
- 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
- 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.
-
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.
- 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