4 SNMP-Trap

Übersicht

Das Empfangen von SNMP-Traps ist das Gegenstück zum Abfragen von SNMP-fähigen Geräten.

In diesem Fall werden die Informationen von einem SNMP-fähigen Gerät an snmptrapd gesendet und von Zabbix Server oder Zabbix Proxy aus einer Datei erfasst oder "gefangen".

Normalerweise werden Traps bei einer Zustandsänderung gesendet, und der Agent verbindet sich mit dem Server über Port 162 (im Gegensatz zu Port 161 auf der Agent-Seite, der für Abfragen verwendet wird). Die Verwendung von Traps kann einige kurzfristige Probleme erkennen, die zwischen den Abfrageintervallen auftreten und von den Abfragedaten möglicherweise übersehen werden.

Das Empfangen von SNMP-Traps in Zabbix ist für die Zusammenarbeit mit snmptrapd und einem der Mechanismen zum Weiterleiten der Traps an Zabbix ausgelegt - entweder einem Bash- oder Perl-Skript oder SNMPTT.

Der einfachste Weg, die Trap-Überwachung nach der Konfiguration von Zabbix einzurichten, ist die Bash-Skript-Lösung, da Perl und SNMPTT in modernen Distributionen oft fehlen und eine komplexere Konfiguration erfordern. Diese Lösung verwendet jedoch ein als traphandle konfiguriertes Skript. Für eine bessere Leistung in Produktionssystemen verwenden Sie die eingebettete Perl-Lösung (entweder ein Skript mit der Option do perl oder SNMPTT).

Der Ablauf beim Empfangen eines Traps:

  1. snmptrapd empfängt einen Trap.
  2. snmptrapd leitet den Trap an das Empfangsskript (Bash, Perl) oder SNMPTT weiter.
  3. Der Empfänger analysiert, formatiert und schreibt den Trap in eine Datei.
  4. Der Zabbix SNMP-Trapper liest und analysiert die Trap-Datei.
  5. Für jeden Trap findet Zabbix alle SNMP-Trapper-Datenpunkte mit Host-Schnittstellen, die zur empfangenen Trap-Adresse passen. Beachten Sie, dass beim Abgleich nur die ausgewählte IP oder DNS in der Host-Schnittstelle verwendet wird.
  6. Für jeden gefundenen Datenpunkt wird der Trap mit dem regulären Ausdruck in snmptrap[regexp] verglichen. Der Trap wird als Wert aller übereinstimmenden Datenpunkte gesetzt. Wenn kein passender Datenpunkt gefunden wird und ein snmptrap.fallback-Datenpunkt vorhanden ist, wird der Trap als dessen Wert gesetzt.
  7. Wenn der Trap nicht als Wert eines Datenpunkts gesetzt wurde, protokolliert Zabbix standardmäßig den nicht zugeordneten Trap. (Dies wird durch Nicht zugeordnete SNMP-Traps protokollieren unter Administration > Allgemein > Sonstiges konfiguriert.)
Hinweise zum HA-Failover

Während des Wechsels eines Hochverfügbarkeits-(HA-)Knotens setzt Zabbix die Verarbeitung nach dem letzten Datensatz innerhalb des letzten ISO-8601-Zeitstempels fort; wird derselbe Datensatz nicht gefunden, wird nur der Zeitstempel verwendet, um die letzte Position zu bestimmen.

SNMP-Traps konfigurieren

Dieser Datentyp erfordert die folgende Frontend-Konfiguration:

Schritt 1: Eine SNMP-Schnittstelle für den Host erstellen
  1. Unter Datenerfassung > Hosts einen Host erstellen oder den vorhandenen bearbeiten.
  2. Wählen Sie im Feld Schnittstellen den Schnittstellentyp SNMP aus.
  3. Geben Sie die IP-Adresse/DNS-Namen und die Portnummer ein.
  4. Wählen Sie die SNMP-Version aus der Dropdown-Liste: (SNMPv1, SNMPv2 oder SNMPv3) und fügen Sie die Schnittstellen-Anmeldedaten entsprechend der ausgewählten SNMP-Version hinzu.

Die Adresse jedes empfangenen Traps wird mit den IP- und DNS-Adressen aller SNMP-Schnittstellen verglichen, um die entsprechenden Hosts zu finden.

Schritt 2: Den Datenpunkt konfigurieren
  1. Erstellen Sie für den Host einen Datenpunkt oder bearbeiten Sie den vorhandenen.
  2. Verwenden Sie im Feld Key einen der SNMP-Trap-Keys:

    • snmptrap[regexp] - erfasst alle SNMP-Traps, die dem im Parameter regexp angegebenen regulären Ausdruck entsprechen; wenn regexp nicht angegeben ist, wird jeder Trap erfasst.
      Benutzer-Makros und globale reguläre Ausdrücke werden im Parameter unterstützt.
      Rückgabewert: SNMP-Trap.
      Dieser Datenpunkt kann nur für SNMP-Schnittstellen festgelegt werden.
    • snmptrap.fallback - erfasst alle SNMP-Traps, die von keinem der snmptrap[]-Datenpunkte für diese Schnittstelle erfasst wurden.
      Rückgabewert: SNMP-Trap.
      Dieser Datenpunkt kann nur für SNMP-Schnittstellen festgelegt werden.

Die Verarbeitung regulärer Ausdrücke über mehrere Zeilen wird derzeit nicht unterstützt.

  1. Setzen Sie Typ der Information auf Log, damit Zeitstempel geparst werden. Andere Formate wie Numerisch sind ebenfalls zulässig, erfordern jedoch möglicherweise einen benutzerdefinierten Trap-Handler.

Einrichten der SNMP-Trap-Überwachung

Konfigurieren von Zabbix Server/Proxy

Um die Traps zu lesen, muss der Zabbix Server oder Proxy so konfiguriert werden, dass der SNMP-Trapper-Prozess gestartet wird und auf die Trap-Datei verwiesen wird, die von SNMPTT oder einem Bash/Perl-Trap-Receiver geschrieben wird. Dazu bearbeiten Sie die Konfigurationsdatei (zabbix\_server.conf oder zabbix\_proxy.conf):

StartSNMPTrapper=1
SNMPTrapperFile=[TRAP FILE]

Wenn der systemd-Parameter PrivateTmp verwendet wird, funktioniert diese Datei in /tmp wahrscheinlich nicht.

Konfigurieren des Bash-Trap-Receivers

Anforderungen: nur snmptrapd.

Ein Bash-Trap-Receiver-Skript kann verwendet werden, um Traps von snmptrapd über die Trapper-Datei an Zabbix Server zu übergeben. Um es zu konfigurieren, fügen Sie die Option traphandle zur Konfigurationsdatei von snmptrapd (snmptrapd.conf) hinzu, siehe Beispiel.

snmptrapd muss möglicherweise neu gestartet werden, damit Änderungen an seiner Konfiguration übernommen werden.

Konfiguration des Perl-Trap-Receivers

Anforderungen: Perl, Net-SNMP kompiliert mit --enable-embedded-perl (seit Net-SNMP 5.4 standardmäßig aktiviert)

Ein Perl-Trap-Receiver (siehe misc/snmptrap/zabbix\_trap\_receiver.pl) kann verwendet werden, um Traps direkt von snmptrapd an den Zabbix Server weiterzuleiten. So konfigurieren Sie ihn:

  • Fügen Sie das Perl-Skript zur Konfigurationsdatei von snmptrapd (snmptrapd.conf) hinzu, z. B.:
perl do "[FULL PATH TO PERL RECEIVER SCRIPT]";
  • Konfigurieren Sie den Receiver, z. B.:
$SNMPTrapperFile = '[TRAP FILE]';
$DateTimeFormat = '[DATE TIME FORMAT]';

snmptrapd muss möglicherweise neu gestartet werden, damit Änderungen an seiner Konfiguration übernommen werden.

Wenn der Skriptname nicht in Anführungszeichen gesetzt ist, verweigert snmptrapd den Start mit Meldungen, die diesen ähneln:

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
SNMPTT konfigurieren

Zunächst sollte snmptrapd so konfiguriert werden, dass es SNMPTT verwendet.

Für die beste Leistung sollte SNMPTT als Daemon konfiguriert werden, indem snmptthandler-embedded verwendet wird, um die Traps an SNMPTT zu übergeben. Anweisungen zum Konfigurieren von SNMPTT finden Sie dort.

Wenn SNMPTT so konfiguriert ist, dass es die Traps empfängt, konfigurieren Sie snmptt.ini:

  1. Aktivieren Sie die Verwendung des Perl-Moduls aus dem NET-SNMP-Paket:
net_snmp_perl_enable = 1
  1. Protokollieren Sie Traps in die Trap-Datei, die von Zabbix gelesen wird:
log_enable = 1
log_file = [TRAP FILE]
  1. Legen Sie das Datums- und Zeitformat fest:
date_time_format = %Y-%m-%dT%H:%M:%S%z

Das Paket net-snmp-perl wurde in RHEL 8.0-8.2 entfernt und in RHEL 8.3 wieder hinzugefügt. Weitere Informationen finden Sie unter den bekannten Problemen.

Formatieren Sie nun die Traps so, dass Zabbix sie erkennt (bearbeiten Sie snmptt.conf):

  1. Jede FORMAT-Anweisung sollte mit ZBXTRAP [address] beginnen, wobei [address] mit den IP- und DNS-Adressen der SNMP-Schnittstellen auf Zabbix verglichen wird. Zum Beispiel:
EVENT coldStart .1.3.6.1.6.3.1.1.5.1 "Status Events" Normal
FORMAT ZBXTRAP $aA Device reinitialized (coldStart)
  1. Weitere Informationen zum SNMP-Trap-Format finden Sie unten.

Verwenden Sie keine unbekannten Traps - Zabbix kann sie nicht erkennen. Unbekannte Traps können behandelt werden, indem in snmptt.conf ein allgemeines Ereignis definiert wird:

EVENT general .* "General event" Normal
SNMP-Trap-Format

Alle benutzerdefinierten Perl-Trap-Empfänger und die SNMPTT-Trap-Konfiguration müssen den Trap auf folgende Weise formatieren:

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

wobei

  • [timestamp] - der Zeitstempel im Format %Y-%m-%dT%H:%M:%S%z.
  • ZBXTRAP - Kopfzeile, die angibt, dass in dieser Zeile ein neuer Trap beginnt.
  • [address] - IP-Adresse, die verwendet wird, um den Host für diesen Trap zu ermitteln.

Beachten Sie, dass ZBXTRAP und [address] während der Verarbeitung aus der Nachricht entfernt werden. Wenn der Trap anders formatiert ist, kann Zabbix die Traps möglicherweise unerwartet parsen.

Beispiel-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

Dies führt zu folgendem Trap für die SNMP-Schnittstelle mit 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

Systemanforderungen

Es wird empfohlen, MIB-Dateien zu installieren, um sicherzustellen, dass Datenpunktwerte im korrekten Format angezeigt werden. Ohne die MIB-Dateien können Formatierungsprobleme auftreten, z. B. die Anzeige von Werten in HEX statt in UTF-8 oder umgekehrt.

Unterstützung großer Dateien

Zabbix unterstützt große Dateien für SNMP-Trapper-Dateien. Die maximale Dateigröße, die Zabbix lesen kann, beträgt 2\^63 (8 EiB). Beachten Sie, dass das Dateisystem eine niedrigere Grenze für die Dateigröße festlegen kann.

Log-Rotation

Zabbix stellt kein eigenes System zur Log-Rotation bereit - dies muss vom Benutzer übernommen werden. Die Log-Rotation sollte zuerst die alte Datei umbenennen und sie erst später löschen, damit keine Traps verloren gehen:

  1. Zabbix öffnet die Trap-Datei am zuletzt bekannten Speicherort und geht zu Schritt 3.
  2. Zabbix prüft, ob die aktuell geöffnete Datei rotiert wurde, indem die Inode-Nummer mit der Inode-Nummer der definierten Trap-Datei verglichen wird. Wenn keine geöffnete Datei vorhanden ist, setzt Zabbix den letzten Speicherort zurück und geht zu Schritt 1.
  3. Zabbix liest die Daten aus der aktuell geöffneten Datei und setzt den neuen Speicherort.
  4. Die neuen Daten werden geparst. Wenn dies die rotierte Datei war, wird die Datei geschlossen und es geht zurück zu Schritt 2.
  5. Wenn keine neuen Daten vorhanden waren, schläft Zabbix 1 Sekunde und geht zurück zu Schritt 2.
Dateisystem

Aufgrund der Implementierung der Trap-Datei benötigt Zabbix ein Dateisystem mit Unterstützung für Inodes, um Dateien zu unterscheiden (die Informationen werden durch einen stat()-Aufruf ermittelt).

Setup-Beispiele mit verschiedenen SNMP-Protokollversionen

Dieses Beispiel verwendet snmptrapd und ein Bash-Empfangsskript, um Traps an den Zabbix Server weiterzuleiten.

Einrichtung:

  1. Konfigurieren Sie Zabbix so, dass der SNMP-Trapper gestartet und die Trap-Datei gesetzt wird. Fügen Sie in zabbix_server.conf Folgendes hinzu:
StartSNMPTrapper=1
SNMPTrapperFile=/var/lib/zabbix/snmptraps/snmptraps.log
  1. Laden Sie das Bash-Skript nach /usr/sbin/zabbix_trap_handler.sh herunter:
curl -o /usr/sbin/zabbix_trap_handler.sh https://raw.githubusercontent.com/zabbix/zabbix-docker/7.4/templates/scripts/snmptraps/zabbix_trap_handler.sh

Falls erforderlich, passen Sie die Variable ZABBIX_TRAPS_FILE im Skript an. Um den Standardwert zu verwenden, erstellen Sie zuerst das übergeordnete Verzeichnis:

mkdir -p /var/lib/zabbix/snmptraps
  1. Fügen Sie Folgendes zu snmtrapd.conf hinzu (siehe funktionierendes Beispiel)
traphandle default /bin/bash /usr/sbin/zabbix_trap_handler.sh

snmptrapd muss möglicherweise neu gestartet werden, damit die Konfigurationsänderungen übernommen werden.

  1. Erstellen Sie einen SNMP-Datenpunkt TEST (beachten Sie die anfänglichen Konfigurationsanforderungen):

    Typ: SNMP trap
    Typ der Information: Log
    Host-Schnittstelle: SNMP 127.0.0.1
    Schlüssel: snmptrap["linkUp"]
    Log-Zeitformat: yyyyMMdd.hhmmss

Beachten Sie, dass das Datums- und Zeitformat ISO 8601 verwendet wird.

  1. Als Nächstes konfigurieren wir snmptrapd für die gewählte SNMP-Protokollversion und senden Test-Traps mit dem Dienstprogramm snmptrap.
SNMPv1, SNMPv2

Die Protokolle SNMPv1 und SNMPv2 verwenden die Authentifizierung über eine "Community-String". Im folgenden Beispiel verwenden wir "secret" als Community-String. Er muss bei allen SNMP-Trap-Sendern auf denselben Wert gesetzt werden.

Bitte beachten Sie, dass SNMPv2 zwar in Produktionsumgebungen noch weit verbreitet ist, aber keine Verschlüsselung und keine echte Senderauthentifizierung bietet. Die Daten werden im Klartext gesendet und diese Protokollversionen sollten daher nur in sicheren Umgebungen wie privaten Netzwerken verwendet werden und niemals über öffentliche oder fremde Netzwerke.

SNMP-Version 1 wird heutzutage kaum noch verwendet, da sie keine 64-Bit-Zähler unterstützt und als veraltetes Protokoll gilt.

Um den Empfang von SNMPv1- oder SNMPv2-Traps zu aktivieren, fügen Sie die folgende Zeile zu snmptrapd.conf hinzu. Ersetzen Sie secret durch den auf den SNMP-Trap-Sendern konfigurierten SNMP-Community-String:

authCommunity log,execute,net secret

Als Nächstes können wir mit snmptrap einen Test-Trap senden. In diesem Beispiel verwenden wir die gängige OID "link up":

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

SNMPv3 behebt die Sicherheitsprobleme von SNMPv1/v2 und bietet Authentifizierung und Verschlüsselung. Sie können die Authentifizierungsmethoden MD5 oder mehrere SHA-Varianten sowie DES oder mehrere AES-Varianten als Cipher verwenden.

Um den Empfang von SNMPv3 zu aktivieren, fügen Sie die folgenden Zeilen zu snmptrapd.conf hinzu:

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

Beachten Sie das Schlüsselwort "execute", das die Ausführung von Skripten für dieses Benutzersicherheitsmodell erlaubt.

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

Wenn Sie starke Verschlüsselungsmethoden wie AES192 oder AES256 verwenden möchten, verwenden Sie bitte net-snmp ab Version 5.8. Möglicherweise müssen Sie es mit der configure-Option --enable-blumenthal-aes neu kompilieren. Ältere Versionen von net-snmp unterstützen AES192/AES256 nicht. Siehe auch: Strong Authentication or Encryption.

Verifizierung

In beiden Beispielen sehen Sie ähnliche Zeilen in Ihrer Datei /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

Der Datenpunktwert in Zabbix wird sein:

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

Beispiel mit 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

Siehe auch