SNMPv3-Traps in Zabbix

SNMPv3-Traps in Zabbix

Meine Frage betrifft Zabbix-Traps mit SNMPv3 und snmptrapd-Dienst unter Verwendungzabbix_trap_receiver.pl. Ich habe einen Switch, auf dem ich nur SNMPv3 aktiviert habe, daher hat der Switch kein SNMPv1/2crwoderroCommunities konfiguriert, und ich konnte es als Host auf Zabbix hinzufügen, nachdem ich lange damit verbracht hatte, vorhandene SNMPv2-Vorlagen zu ändern. InZabbix-DokumentationInsnmptrapd.confUm SNMP-Traps zu aktivieren, wurden, wie hier gezeigt, einige Zeilen hinzugefügt:

authCommunity execute public
perl do "/usr/bin/zabbix_trap_receiver.pl";

Meine Fragen:

  • Was ist die Bedeutung vonauthCommunity execute public
  • Ich habe nichtöffentlichKann der von der Community konfigurierte snmptrapd-Dienst SNMPv3-Traps entschlüsseln, da ich bei Wireshark SNMPv3-Anmeldeinformationen definieren musste, damit er mir den Inhalt der Trap-Pakete anzeigen kann?
  • Wenn nicht, wie kann ich es konfigurieren insnmptrapd.confdamit das Perl-Skript diese Traps von SNMPv3 lesen kann?
  • Warum steht bei Wireshark „SNMPv2c-Trap“, obwohl es als SNMPv3 verschlüsselt ist? Ich bin ratlos.
  • Erklären Sie mir bitte, wie Traps funktionieren, wenn SNMPv2 aktiviert ist und wenn SNMPv3 aktiviert ist?

Bearbeiten Ich habe auch Folgendes versucht

createUser -e <engineid> <user> SHA <key> AES <key>
authUser log,execute <user>
perl do "/usr/bin/zabbix_trap_receiver.pl";

Aber kein Glück

Antwort1

Die Art und Weise, wie der snmptrapd-Daemon mit Traps arbeitet, erlaubt nicht den Empfang von SNMPv3-Traps ohne Angabe der EngineID des sendenden Geräts. Sie müssen also nur Folgendes in /etc/snmp/snmptrapd.conf tun:

createUser snmpv3USER SHA auth_pass AES priv_pass
authUser log,execute snmpv3USER
perl do "/usr/bin/zabbix_trap_receiver.pl";

Sie erhalten niemals SNMPv3-Traps in Ihrem /tmp/zabbix_traps.tmp, da der in /var/lib/net-snmp/snmptrapd.conf erstellte usmUser die tatsächlichen Anforderungen nicht erfüllt, das ist alles.

Wenn es um SNMPv3-Informationen geht, können die meisten Switches sie nicht senden, daher sind wir auf SNMPv3-Traps angewiesen, und die Art und Weise, wie snmptrapd programmiert ist, funktioniert nur mit EngineIDs für SNMPv3-Traps. Selbst wenn ich in snmptrapd.conf disableAuthorization yes verwende, funktionieren SNMPv3-Traps nicht ohne die EngineID für jedes sendende Gerät, d. h. das Switch-Gerät.

Um SNMPv3-Traps zu empfangen, müssen Sie nun alle EngineIDs für alle Switches abrufen. Dazu habe ich ein Python-Skript geschrieben, um snmptrapd.conf mit SNMPv3 zu erstellen, was eine große Erleichterung ist. Die eigentliche Datei enthält vor jeder createUser-Zeile einen Kommentar, der den Switch-Namen und die IP-Adresse anzeigt. Diese Information zu SNMPv3-Traps wird tatsächlich in der net-snmp-Dokumentation erwähnt, aber als ich sie zum ersten Mal las, konnte ich sie nicht verstehen, weil dort steht, dass The difference is that SNMPv3 TRAPs use the engineID of the local application sending the trap rather than the engineID of the remote applicationman beim ersten Lesen verwirrt sein wird, aber mit ein wenig Konzentration wird es sehr klar:

SNMPv3-TRAPs sind in mancher Hinsicht etwas komplizierter, aber wenn man lange darüber nachdenkt, macht es Sinn, dass das Protokoll so funktioniert. Der Unterschied besteht darin, dass SNMPv3-TRAPs die EngineID der lokalen Anwendung verwenden, die den Trap sendet, und nicht die EngineID der Remote-Anwendung. Das bedeutet, dass Sie Benutzer in Ihrer Remote-Benutzerdatenbank etwas sorgfältiger erstellen müssen und für jede EngineID, von der Sie Traps senden möchten, einen erstellen müssen. Das bedeutet, dass Sie 100 createUser-Direktiven in Ihrer Datei /var/net-snmp/snmptrapd.conf benötigen, wenn Sie möchten, dass 100 SNMP-Agenten SNMPv3-Traps an Ihren Trap-Empfänger senden.

Die Datei /etc/snmp/snmptrapd.conf sieht folgendermaßen aus:

createUser -e 0x800007c703609c9f1eff01 snmpv3USER SHA auth_pass AES priv_pass
createUser -e 0x800007c703cc4e24e4c6c3 snmpv3USER SHA auth_pass AES priv_pass
createUser -e 0x800007c703d4c19e743e86 snmpv3USER SHA auth_pass AES priv_pass
createUser -e 0x800007c70378a6e10ca715 snmpv3USER SHA auth_pass AES priv_pass
createUser -e 0x800007c70378a6e10c46f0 snmpv3USER SHA auth_pass AES priv_pass
createUser -e 0x800007c70378a6e121bacd snmpv3USER SHA auth_pass AES priv_pass
createUser -e 0x800007c70378a6e121b7d8 snmpv3USER SHA auth_pass AES priv_pass
createUser -e 0x800007c703609c9f5136f4 snmpv3USER SHA auth_pass AES priv_pass

authUser log,execute snmpv3USER
perl do "/usr/bin/zabbix_trap_receiver.pl";

Die Datei ist viel länger, aber jetzt kann ich alle Traps von allen Switches empfangen. Ich habe auf Stackoverflow gesehen, dass es jemandem mit DES ohne EngineID gelungen ist, aber das ist wirklich Mist, bei mir hat es weder mit DES noch mit AES ohne EngineID funktioniert. Es ist nur etwas, das im Hintergrund von anderer Überwachungssoftware gemacht wurde, die eine Aufzeichnung der EngineIDs aller Geräte für die Aufgabe des Trap-Empfangs führt.

Mir ist auch aufgefallen, dass die Traps vom Core-Switch von der virtuellen Schnittstelle des VLAN empfangen werden, auf dem sich Zabbix befindet. Daher musste ich das Skript zabbix_trap_receiver.pl wie folgt ändern:

use NetSNMP::TrapReceiver; # should be added in order to get the script to work, otherwise it fails -- elekgeek 2nd DEC 2019
# get the host name
        $pdu_info{'receivedfrom'} =~ s/192.168.168.254/192.168.168.1/ig; # I added this line to get the core switch IP instead of zabbix's VLAN SVI IP, otherwise trap is not added to the CORE trap.fallback -- elekgeek 2nd DEC 2019
        my $hostname = $pdu_info{'receivedfrom'} || 'unknown';
        if ($hostname ne 'unknown')

Beim Arbeiten an Traps musste ich diese als Verlauf anzeigen, daher habe ich das Element SNMP-Traps (Fallback) von Informationstyp=Protokoll in Informationstyp=Text in Vorlage geändert Template Module Generic SNMPv3.

Viel Glück beim Zabbixen!

verwandte Informationen