Inhaltsverzeichnis

Snmptt

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.

Installation

Installiert werden müssen:

  1. snmp
  2. Net-SNMP
  3. snmptt
  4. snmptranslate

snmp

apt-get install libsnmp-base libconfig-inifiles-perl

net-snmp

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

snmptt installieren

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.

Embedded Handler

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

snmptrapd aktivieren

vi /etc/default/snmpd

Hier folgende Zeile auf on setzen:
TRAPDRUN=no

service snmpd restart

Konfiguration

Nun können die folgenden Komponenten konfiguriert werden.

snmptrapd

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

snmptt

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

Nagios

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
}

MIBs Konvertieren

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`

Logging

SNMPTT

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

SNMPTrapd

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'

Debug

Um SNMPTT zu debuggen, startet man diesen im Debug-Modus

snmptt --debug=1 --debugfile=/var/log/snmptt/snmptt-debug.log