Der SNMP Trap Translator nimmt den jew. Trap entgegen und sucht in seiner Konfigdatei nach einem entsprechenden „traphandle“ (eine Datei mit den MIB-Informationen).
Somit lassen sich die OIDs aus den Traps in verständlichen Text einfach und schnell übersetzen.
Installiert werden müssen:
apt-get install libsnmp-base libconfig-inifiles-perl
perl -MCPAN -e shell install Net-SNMP Text::ParseWords Getopt::Long Posix Config::IniFiles Time::HiRes Sys::Hostname File::Basename Text::Balanced Socket Sys::Syslog DBI DBD::mysql Net-SNMP snmptranslate Perl Module Digest::MD5
Installation mit dem Embedded Handler der nicht so viel overhead, beim erhalten von Traps, erzeugt.
Zuletzt habe ich den normalen Handler benutzt, die embedded Version hat nicht funktioniert.
Prüfen ob der snmptrapd Perlfähig ist.
snmptrapd -H 2>&1 | grep perl
Wenn die Ausgabe unteranderem folgendes ausspuckt, dann ist dies somit der Fall:
perl PERLCODE
Nun kann SNMPTT installiert werden.
cp <PFAD_ZU_SNMPTT_QUELLVERZEICHNIS>/snmptt /usr/sbin chmod +x snmptt cp <PFAD_ZU_SNMPTT_QUELLVERZEICHNIS>/snmptthandler-embedded /usr/sbin cp <PFAD_ZU_SNMPTT_QUELLVERZEICHNIS>/snmpttconvertmib /usr/sbin/
Es sollte noch ein eigener User und eine Gruppe angelegt werden, mit der der SNMPTT-Daemon läuft.
useradd snmptt
Nun kopiert man noch die SNMPTT-Konfigurationsdatei nach /etc/snmp
und passt den Besitzer an:
cp <PFAD_ZU_SNMPTT_QUELLVERZEICHNIS>/snmptt.ini /etc/snmp chown snmptt.snmptt /etc/snmp/snmptt.ini
Die Ini-Datei kann evtl. auch in /etc
kopiert werden.
Auf jeden Fall müssen die Einträge der „ini“ angepasst werden.
Weiterhin benötigt man noch ein Spool-Verzeichnis.
mkdir /var/spool/snmptt chown snmptt:snmptt /var/spool/snmptt
Zuletzt fügt man SNMPTT zum Init-Start hinzu, oder startet es einfach mittels snmptt –daemon
.
Das beigefügte Init-Script ist nicht ganz mit Ubuntu kompatibel, daher hier eine angepasste Version.
vi /etc/init.d/snmptt
Inhalt:
#!/bin/bash # init file for snmptt # Alex Burger - 08/29/02 # - 09/08/03 - Added snmptt.pid support to Stop function # - 05/17/09 - Added LSB init keywords, change priority, add # INIT INFO. #! /bin/sh -e ### BEGIN INIT INFO # Provides: snmptt # Required-Start: $syslog $local_fs # Required-Stop: $syslog $local_fs # Required-Start: $network snmptrapd # Required-Stop: $network snmptrapd # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: SNMP Trap Translator daemon ### END INIT INFO set -e # source function library . /lib/lsb/init-functions export PATH=/sbin:/usr/sbin:/bin:/usr/bin OPTIONS="--daemon" prog="snmptt" # cd to / before starting any daemons. cd / case "$1" in start) log_daemon_msg "Starting SNMP Trap Translator daemon:" start-stop-daemon --quiet --start --oknodo \ --exec /usr/sbin/snmptt -- $OPTIONS touch /var/lock/snmptt log_progress_msg " $prog" ;; stop) log_daemon_msg "Stopping SNMP Trap Translator daemon:" start-stop-daemon --quiet --stop --oknodo --exec /usr/sbin/snmptt rm -f /var/lock/snmptt if test -f /var/run/snmptt.pid ; then rm -f /var/run/snmptt.pid fi log_progress_msg " $prog" ;; reload) log_daemon_msg "Reloading SNMP Trap Translator daemon:" start-stop-daemon --quiet --stop --signal 1 \ --pidfile /var/run/snmptt.pid --exec /usr/sbin/snmptt log_progress_msg " $prog" ;; status) status=0 status_of_proc /usr/sbin/snmptt snmptt || status=$? exit $status ;; *) echo "Usage: /etc/init.d/snmpd {start|stop|reload|status}" exit 1 esac exit 0
Danach nicht vergessen:
chmod a+x /etc/init.d/snmptt update-rc.d snmptt defaults
Hier auch als Upstart-Script (einfach unter /etc/init/
die Datei snmptt.conf
anlegen und ausführbar machen):
# SNMPTT Daemon # # description "SNMPTT Daemon" start on filesystem or runlevel [2345] stop on runlevel [!2345] #respawn #respawn limit 10 5 #umask 022 pre-start script test -x /usr/sbin/snmptt || { stop; exit 0; } test -e /etc/snmp/snmptt.ini || { stop; exit 0; } test -e /etc/snmp/snmptt.conf || { stop; exit 0; } test -c /dev/null || { stop; exit 0; } end script #post-stop script # # clean up # rm -rf /var/run/snmptt.pid #end script exec /usr/sbin/snmptt --daemon
vi /etc/default/snmpd
Hier folgende Zeile auf on
setzen:
TRAPDRUN=no
service snmpd restart
Nun können die folgenden Komponenten konfiguriert werden.
vi /etc/snmp/snmptrapd.conf
Folgendes einfügen:
traphandle default /usr/sbin/snmptthandler-embedded disableAuthorization yes ignoreAuthFailure yes
Oder wenn man nur bestimmte Traps empfangen möchte, folgendes anstatt „disableAuthorization yes“ und „ignoreAuthFailure yes“ einfügen:
authCommunity TYPES COMMUNITY authCommunity TYPES COMMUNITY authCommunity TYPES COMMUNITY
Als Types können „log“, „execute“ und „net“ verwendet werden.
Hier ein Beispiel:
authCommunity log,execute,net public authCommunity log,execute,net hpprocurve authCommunity log,execute,net netscreen
vi /etc/snmp/snmptt.ini
Hier folgende Zeilen hinzufügen bzw. anpassen.
mode = daemon daemon_fork = 1 daemon_uid = snmptt spool_directory = /var/spool/snmptt/ sleep = 5 dns_enable = 0 strip_domain = 1 log_enable = 1 syslog_enable = 0 exec_enable = 1 snmptt_conf_files = << END /etc/snmp/snmptt.conf END
Nachdem man nun die Grundvoraussetzungen für den Empfang von SNMPTraps geschaffen hat, muss nun noch Nagios diese als Passiven Check annehmen.
Weiterhin muss Nagios externe Kommandos annehmen Konfigvariable in nagios.cfg: „check_external_commands=1“
Da es ja vorkommen kann, dass ein Host mehr als einen Trap direkt nacheinander versendet, müssen die Checks, von Nagios, sofort mit dem Status „OK“ bestätigt werden.
Dies erreicht man durch flüchtige Checks (Service Parameter: „is_volatile“). Durch solche flüchtigen Checks ist es somit möglich nacheinander kommende Traps zu verarbeiten.
Am besten legt man sich dafür eine Servicevorlage an, die nur die Anpassungen für SNMPTraps beinhaltet und ansonsten auf einer anderen Vorlage aufbaut, oder man weißt einem Host einfach mehrere Vorlagen zu.
define service{ name tpl-svc-snmp-traps use register 0 service_description SNMP_Traps Template is_volatile 1 check_command check-host-alive ;Zum Zurücksetzen des Status auf "OK" (über "Re-schedule the next check of this host") flap_detection_enabled 0 process_perf_data 0 max_check_attempts 1 ; auf "1" belassen normal_check_interval 1 ; auf "1" belassen retry_check_interval 1 ; auf "1" belassen passive_checks_enabled 1 ; passive Checks aktivieren check_period 24x7 notification_interval 31536000 ; Auf eine hohe Zahl setzen, um die Anzahl an alten Traps klein zu halten (nicht auf "0" setzen) active_checks_enabled 0 notification_options w,u,c contact_groups sysadmins }
Nun noch einen Service anlegen, welcher einem oder mehreren Hosts zugewiesen ist.
define service{ host_name <IP_ODER_HOSTNAME> use tpl-svc-default,tpl-svc-snmp-traps service_description shows SNMP Traps }
Damit die ankommenden Traps lesbar in Nagios dargestellt werden können, muß man die OIDs mit dem jew. Anzeigetext verknüpfen.
Das kann man zwar auch manuell machen, aber wenn man SNMP-MIBs hat, konvertiert das Tool snmpttconvertmib
diese.
snmpttconvertmib --in=<PFAD_ZU_MIB_DATEI> --out=/etc/snmp/snmptt.conf. --exec='/usr/local/nagios/libexec/eventhandlers/submit_check_result $r <SERVICE_NAME> 1'
Oder wenn man eine MIB-Sammlung in einer Verzeichnisstruktur hat folgender Befehl:
find <PFAD_ZU_MIB_DATEIEN> -type f -exec snmpttconvertmib --in={} --out=/etc/snmp/snmptt.conf --exec='/usr/local/nagios/libexec/eventhandlers/submit_check_result $r <SERVICE_NAME> 1' \;
Mögliche Parameter in der Exec-Zeile (Quelle: sourceforge.net)
Parameter | Beschreibung |
---|---|
$A | Trap agent host name (see Note 1) |
$aA | Trap agent IP address |
$Be | securityEngineID (snmpEngineID) (see Note 7) |
$Bu | securityName (snmpCommunitySecurityName) (see Note 7) |
$BE | contextEngineID (snmpCommunityContextEngineID) (see Note 7) |
$Bn | contextName (snmpCommunityContextName) (see Note 7) |
$c | Category |
$C | Trap community string |
$D | Description text from SNMPTT.CONF or MIB file (see Note 6) |
$E | Enterprise trap OID in symbolic format |
$e | Enterprise trap OID in number format |
$Fa | alarm (bell) (BEL) |
$Ff | form feed (FF) |
$Fn | newline (LF, NL) |
$Fr | return (CR) |
$Ft | tab (HT, TAB) |
$Fz | Translated FORMAT line (EXEC only) |
$G | Generic trap number (0 if enterprise trap) |
$H | Host name of the system running SNMPTT |
$S | Specific trap number (0 if generic trap) |
$N | Event name defined in .conf file of matched entry |
$i | Event OID defined in .conf file of matched entry (could be a wildcard OID) |
$O | Trap OID in symbolic format (see Note 4) |
$o | Trap OID in numerical format (see Note 4) |
$R, $r | Trap hostname (see Note 1) |
$aR, $ar | IP address |
$s | Severity |
$T | Uptime: Time since network entity was initialized |
$X | Time trap was spooled (daemon mode) or current time (standalone mode) |
$x | Date trap was spooled (daemon mode) or current date (standalone mode) |
$# | Number of (how many) variable-bindings in the trap |
$$ | Print a $ |
$@ | Number of seconds since the epoch of when the trap was spooled (daemon mode) or the current time (standalone mode) |
$n | Expand variable-binding n (1-n) (see Note 2,5) |
$+n | Expand variable-binding n (1-n) in the format of variable name:value (see Note 2,3,5) |
$-n | Expand variable-binding n (1-n) in the format of variable name (variable type):value (see Note 2,3,5) |
$vn | Expand variable name of the variable-binding n (1-n)(see Note 3) |
$* | Expand all variable-bindings (see Note 5) |
$+* | Expand all variable-bindings in the format of variable name:value (see Note 2,3,5) |
$-* | Expand all variable-bindings in the format of variable name (variable type):value (see Note 2,3,5) |
ACHTUNG: Wenn dieses ein zweites Mal ausgeführt wird, fügt es die neuen oder auch vorhandenen MIBs in der Datei „snmptt.conf“ unten an. Es werden somit vorhandene Einträge nicht überschrieben.
Auf der Seite wiki.monitoring-portal.org findet man auch schon konvertierte MIBs.
Hier noch eine Erklärung der syntax für den Befehl „submit_check_result“ von der sourceforge.net Seite:
#!/bin/sh # SUBMIT_CHECK_RESULT # Written by Ethan Galstad (egalstad@nagios.org) # Last Modified: 02-18-2002 # # This script will write a command to the Nagios command # file to cause Nagios to process a passive service check # result. Note: This script is intended to be run on the # same host that is running Nagios. If you want to # submit passive check results from a remote machine, look # at using the nsca addon. # # Arguments: # $1 = host_name (Short name of host that the service is # associated with) # $2 = svc_description (Description of the service) # $3 = return_code (An integer that determines the state # of the service check, 0=OK, 1=WARNING, 2=CRITICAL, # 3=UNKNOWN). # $4 = plugin_output (A text string that should be used # as the plugin output for the service check) # echocmd="/bin/echo" CommandFile="/usr/local/nagios/var/rw/nagios.cmd" # get the current date/time in seconds since UNIX epoch datetime=`date +%s` # create the command line to add to the command file cmdline="[$datetime] PROCESS_SERVICE_CHECK_RESULT;$1;$2;$3;$4" # append the command to the end of the command file `$echocmd $cmdline >> $CommandFile`
Damit der Daemon auch loggen kann, erstellt man sich ein eigenes Verzeichnis und die Log-Datei:
mkdir /var/log/snmptt touch /var/log/snmptt/snmptt.log chown snmptt /var/log/snmptt/snmptt.log
Weiterhin fügt man noch dem Log-Rotation die Konfigurationsdatei von SNMPTT hinzu.
cp <PFAD_ZU_SNMPTT_QUELLVERZEICHNIS>/snmptt.logrotate /etc/logrotate.d/snmptt
Manchmal ist es sinnvoll die eingehenden Traps die SNMPTrapd annimmt, einzusehen.
vi /etc/default/snmpd
Hier folgende Zeile hinzufügen bzw. anpassen:
TRAPDOPTS='-Lf /var/log/snmptrap.log'
Um SNMPTT zu debuggen, startet man diesen im Debug-Modus
snmptt --debug=1 --debugfile=/var/log/snmptt/snmptt-debug.log