3 SNMP-Traps

Übersicht

Der Empfang von SNMP-Traps ist das Gegenteil der Abfrage 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 gesammelt bzw. „abgefangen“.

Üblicherweise 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). Durch die Verwendung von Traps können kurze Probleme erkannt werden, die innerhalb des Abfrageintervalls auftreten und von den Abfragedaten möglicherweise übersehen werden.

Der Empfang von SNMP-Traps in Zabbix ist für die Zusammenarbeit mit snmptrapd und einem der Mechanismen zur Übergabe der Traps an Zabbix ausgelegt – entweder ein Bash- oder Perl-Skript oder SNMPTT.

Die einfachste Möglichkeit, die Trap-Überwachung nach der Konfiguration von Zabbix einzurichten, ist die Verwendung der 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 Empfang eines Traps:

  1. snmptrapd empfängt einen Trap
  2. snmptrapd übergibt den Trap an das Empfängerskript (Bash, Perl) oder an SNMPTT
  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 mit der Adresse des empfangenen Traps übereinstimmen. Beachten Sie, dass bei der Zuordnung nur das in der Host-Schnittstelle ausgewählte „IP“ oder „DNS“ 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 für alle übereinstimmenden Datenpunkte gesetzt. Wenn kein übereinstimmender Datenpunkt gefunden wird und es einen snmptrap.fallback-Datenpunkt gibt, 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 über „Nicht zugeordnete SNMP-Traps protokollieren“ unter Administration > General > Other 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.

Konfiguration von SNMP-Traps

Dieser Datenpunkttyp erfordert die folgende Konfiguration im Frontend.

1. Erstellen Sie eine SNMP-Schnittstelle für Ihren Host

  • Erstellen/bearbeiten Sie unter Datenerfassung > Hosts den Host und fügen Sie im Feld Schnittstellen den Schnittstellentyp „SNMP“ hinzu, wobei Sie die IP- oder DNS-Adresse angeben.

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

2. Konfigurieren Sie den Datenpunkt

  • Erstellen/bearbeiten Sie unter Datenerfassung > Hosts den erforderlichen Datenpunkt.
  • Verwenden Sie im Feld Key einen der folgenden SNMP-Trap-Keys:
Key
Beschreibung Rückgabewert Kommentare
snmptrap[regexp]
Erfasst alle SNMP-Traps, die dem in regexp angegebenen regulären Ausdruck entsprechen. Wenn regexp nicht angegeben ist, wird jeder Trap erfasst. SNMP-Trap Dieser Datenpunkt kann nur für SNMP-Schnittstellen festgelegt werden.
Benutzermakros und globale reguläre Ausdrücke werden im Parameter dieses Datenpunkt-Keys unterstützt.
snmptrap.fallback
Erfasst alle SNMP-Traps, die von keinem der Datenpunkte snmptrap[] für diese Schnittstelle erfasst wurden. SNMP-Trap Dieser Datenpunkt kann nur für SNMP-Schnittstellen festgelegt werden.

Der Abgleich mehrzeiliger regulärer Ausdrücke wird derzeit nicht unterstützt.

  • Setzen Sie Art der Informationen auf „Log“, damit die Zeitstempel geparst werden. Andere Formate wie „Numerisch“ sind ebenfalls zulässig, erfordern jedoch möglicherweise einen benutzerdefinierten Trap-Handler.

Einrichten der SNMP-Trap-Überwachung

Konfiguration 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 verweist, in die von SNMPTT oder einem Bash-/Perl-Trap-Empfänger geschrieben wird. Bearbeiten Sie dazu 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.

Konfiguration des Bash-Trap-Empfängers

Voraussetzungen: nur snmptrapd.

Ein Bash-Trap-Empfänger-Skript kann verwendet werden, um Traps aus snmptrapd über die Trapper-Datei an den Zabbix Server weiterzuleiten. Um ihn zu konfigurieren, fügen Sie die Option traphandle zur snmptrapd-Konfigurationsdatei (snmptrapd.conf) hinzu, siehe Beispiel.

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

Konfiguration des Perl-Trap-Empfängers

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

Ein Perl-Trap-Empfänger (siehe misc/snmptrap/zabbix_trap_receiver.pl) kann verwendet werden, um Traps direkt von snmptrapd an den Zabbix Server weiterzuleiten. Zur Konfiguration:

  • Fügen Sie das Perl-Skript zur snmptrapd-Konfigurationsdatei (snmptrapd.conf) hinzu, z. B.:
perl do "[FULL PATH TO PERL RECEIVER SCRIPT]";
  • Konfigurieren Sie den Empfänger, 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 ähnlich den folgenden:

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 mit snmptthandler-embedded konfiguriert werden, um die Traps an ihn zu übergeben. Siehe Anweisungen zum Konfigurieren von SNMPTT.

Wenn SNMPTT für den Empfang der Traps konfiguriert ist, 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-/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; in RHEL 8.3 wieder hinzugefügt. Weitere Informationen finden Sie unter den bekannten Problemen.

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

  1. Jede FORMAT-Anweisung sollte mit "ZBXTRAP [address]" beginnen, wobei [address] mit den IP- und DNS-Adressen von SNMP- Schnittstellen in 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 wird sie nicht erkennen können. Unbekannte Traps können durch Definieren eines allgemeinen Ereignisses in snmptt.conf verarbeitet werden:

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

Alle angepassten Perl-Trap-Empfänger und SNMPTT-Trap-Konfigurationen müssen den Trap auf folgende Weise formatieren:

[timestamp] [der Trap, Teil 1] ZBXTRAP [address] [der Trap, Teil 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 finden

Beachten Sie, dass "ZBXTRAP" und "[address]" während der Verarbeitung aus der Nachricht entfernt werden. Wenn der Trap anders formatiert ist, könnte Zabbix die Traps 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 zum folgenden 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 System für die Log-Rotation bereit – dies muss vom Benutzer übernommen werden. Die Log-Rotation sollte zunächst die alte Datei umbenennen und erst später löschen, damit keine Traps verloren gehen:\

  1. Zabbix öffnet die Trap-Datei an der zuletzt bekannten Position 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 Datei geöffnet ist, setzt Zabbix die letzte Position zurück und geht zu Schritt 1.
  3. Zabbix liest die Daten aus der aktuell geöffneten Datei und setzt die neue Position.
  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, wartet Zabbix 1 Sekunde und geht zurück zu Schritt 2.
Dateisystem

Aufgrund der Implementierung der Trap-Datei benötigt Zabbix ein Dateisystem, das Inodes unterstützt, um Dateien zu unterscheiden (die Informationen werden durch einen stat()-Aufruf ermittelt).

Einrichtungsbeispiele mit verschiedenen SNMP-Protokollversionen

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

Einrichtung:

  1. Konfigurieren Sie Zabbix so, dass der SNMP-Trapper gestartet wird, und legen Sie die Trap-Datei fest. Fügen Sie zu 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/trunk/Dockerfiles/snmptraps/alpine/conf/usr/sbin/zabbix_trap_handler.sh

Passen Sie bei Bedarf 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 Änderungen an seiner Konfiguration übernommen werden.

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

    Typ: SNMP-Trap
    Informationstyp: 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 basieren auf der Authentifizierung per "Community-String". Im folgenden Beispiel verwenden wir "secret" als Community-String. Er muss auf SNMP-Trap-Sendern auf denselben Wert gesetzt sein.

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

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

Um das Annehmen von SNMPv1- oder SNMPv2-Traps zu aktivieren, sollten Sie die folgende Zeile zu snmptrapd.conf hinzufügen. 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 "link up"-OID:

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

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

Um das Annehmen 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 bitte 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, nutzen 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 /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