Archivi tag: snmp

CentOS 6: configurare Nagios per la ricezione delle trap SNMP

In questo post abbiamo visto come configurare Nagios per la ricezione dei check passivi. In quest’altro post, invece, ho spiegato come configurare snmptrapd per la ricezione delle trap SNMP provenienti dai dispositivi monitorati. Adesso vedremo come ricevere su Nagios le suddette trap.

Ingredienti

Oltre a Nagios ed al demone che si occupa della ricezione delle trap (ovvero snmptrapd), è necessario installare sulla macchina che funge da NMS un demone in grado di tradurre le informazioni ricevute in qualcosa di più umanemente comprensibile. Infatti, la difficile interpretazione dei dati riportati dalle trap SNMP rappresenta, sicuramente, uno dei maggiori ostacoli che un sysadmin deve affrontare. Il demone che svolge tale mansione prende il nome di snmptt.

Logica di funzionamento

A grandi linee, il giro del fumo si può riassumere come segue: il dispositivo monitorato genera, di sua sponte, una trap SNMP per segnalare un qualche tipo di anomalia. Essa verrà, successivamente, inoltrata all’NMS, sul quale è attivo il demone snmptrapd (in ascolto sulla porta UDP/162), il quale si occuperà di “passare” tali informazioni ad snmptt. A questo punto, snmptt “tradurrà” i dati che gli sono stati inviati, provvedendo anche inoltrare il relativo output ad uno scrip Nagios (submit_check_result, che potete scaricare da qui) in grado di carpirne il contenuto ed utilizzare quest’ultimo per aggiornare lo stato del servizio dotato di check passivo. Quanto detto fin’ora è riportato (in modo schematico) nell’immagine sottostante.

snmptt

Configurazione di Nagios

Come al solito, il primo step per la realizzazione del nostro ambiente, consiste nella configurazione dell’NMS. Il servizio di monitoraggio delle trap potrà essere simile al seguente:

 define service{
        use                   local-service
        host_name             localhost
        service_descripion   SNMP TRAP Interceptor
        check_command         check_passive
        passive_checks_enabled  1
        active_checks_enabled   0
        is_volatile             1
        check_freshness         1
        freshness_threshold     600
        flap_detection_enabled  0
        }

mentre il comando check_passive presenterà la seguente struttura:

# 'check_passive' command definition
define command{
        command_name check_passive
        command_line $USER1$/check_dummy 2 "No alerts received in 600 seconds"
}

Configurazione di snmptrapd

Rispetto alla configurazione vista qui, l’unica variazione consiste nell’aggiunta delle seguente direttiva:

traphandle default /usr/sbin/snmptt

e la configurazione in todo dovrà essere simile alla seguente:

traphandle default /usr/sbin/snmptt

authCommunity log,execute,net keypublic
format1 %l-%m-%y %h:%j:%k from %A: %b %P %N %W %v\n
format2 %l-%m-%y %h:%j:%k from %A: %b %P %N %W %v\n

Installazione e configurazione di snmptt

Per installare il software in questione è sufficiente utilizzare yum:

[root@NMS ~]# yum install snmptt net-snmp-perl

Una volta installato, si può procedere con la sua configurazione mediante l’editing del file /etc/snmp/snmptt.ini. Ecco le modifiche da me apportate:

net_snmp_perl_enable = 1
log_system_enable = 1
log_system_file = /var/log/snmptt/snmpttsystem.log

A questo punto occorrerà procedere con la “traduzione” delle MIB SNMP. Le si può pensare come una sorta di DB testuale, in cui è presente una descrizione “human friendly” di alcuni OID, anche per ciò che concerne le trap.

Il software che svolge tale mansione prende il nome di snmpttconvertmib e si potranno convertire trap presenti nelle MIB lanciando il seguente comando:

[root@NMS ~]# for i in *MIB*;do snmpttconvertmib --in=/usr/share/snmp/mibs/$i --out=/etc/snmp/snmptt.conf  --exec='/usr/lib64/nagios/plugins/eventhandlers/submit_check_result $r "SNMP TRAP Interceptor" 1';done

dove i parametri passati a submit_check_result sono:

1) $r, ovvero l’hostname del dispositivo che ha generato la trap;

2) SNMP TRAP Interceptor, ovvero il nome del servizio di Nagios che deve essere aggiornato mediante check passivo;

3) 1, evvero l’exit code da girare all’NMS (che, in tal caso, corrisponderà a WARNING).

Le trap “tradotte” andranno a popolare il file /etc/snmp/snmptt.conf, le cui entry saranno simili alle seguenti:

EVENT ucdShutdown .1.3.6.1.4.1.2021.251.2 "Status Events" Normal
FORMAT This trap is sent when the agent terminates $*
EXEC /usr/lib64/nagios/plugins/eventhandlers/submit_check_result $r TRAP 1 "This trap is sent when the agent terminates $*"
SDESC
This trap is sent when the agent terminates
Variables:
EDESC

Prima di continuare, una piccola nota a margine: per ciò che concerne i dispositivi Cisco, vi consiglio di consultare questo sito (per l’indentificazione ed il download delle MIB) e quest’altro (per la traduzione degli OID).

Inoltre, affinchè lo scrip submit_check_result sia in grado di scrivere all’interno del file nagios.cmd (dove vengono inoltrati tutti i comandi esterni), è necessario sostituire la stringa:

CommandFile="/usr/local/nagios/var/rw/nagios.cmd"

con:

CommandFile="/var/spool/nagios/cmd/nagios.cmd"

A configurazione di snmptt ultimata, possiamo fare in modo che il demone in questione venga eseguito automaticamente al boot:

[root@NMS ~]# chkconfig snmptt on

ed avviarlo:

[root@NMS ~]# service snmptt start

Inoltre, riavviamo snmptrapd per rendere effettive le modifiche apportate in precedenza:

[root@NMS ~]# service snmptrapd restart

e ricarichiamo la configurazione di Nagios:

[root@NMS ~]# service nagios reload

 Test e troubleshooting

La prima cosa da fare per capire se snmptt stia funzionando correttamente consiste nell’abilitazione delle opzioni di debug (presenti all’interno di snmptt.ini). Le direttive coinvolte sono le seguenti:

DEBUGGING = 0
DEBUGGING_FILE = /var/log/snmptt/snmptt.debug

Inoltre, è possibile (e opportuno) inviare al nostro handler una trap di test, recante il seguente formato:

[root@NMS ~]# snmptrap -v 1 -c keypublic 127.0.0.1 '.1.3.6.1.6.3.1.1.5.3' '0.0.0.0' 6 33 '55' .1.3.6.1.6.3.1.1.5.3 s “teststring000”

Se la suddetta trap verrà opportunamente gestita da snmptt e dell’event handler di Nagios (submit_check_result), con il successivo aggiornamento del servizio lato NMS, vorrà dire che il nostro sistema sta funzionando come dovrebbe.

Per ora è tutto. Alla prossima.

Configurare il protocollo SNMP su un router Cisco 2811

In questo post abbiamo visto come configurare una linux box affinchè possa ricevere le trap SNMP. Adesso vedremo come configurare il portocollo SNMP (sia polling che trap) su un router Cisco 2811.

cisco2811Configurazione generica

Per prima cosa occorre accedere alla CLI del router in modalità ena e successivamente lanciare i seguenti comandi:

Router# conf t
Router(config)# snmp-server host <IP> keypublic
Router(config)# snmp-server community keypublic RO
Router(config)# snmp-server community keyprivate RW

Mediante il primo comando stiamo definento l’host target delle trap SNMP, mentre con il secondo ed il terzo comando specifichiamo rispettivamente la community string in lettura e quella in scrittura.

Abilitazione delle trap

A questo punto possiamo definire le trap che dovranno essere inviate alla nostra linux box, ad esempio:

Router(config)# snmp-server enable traps snmp
Router(config)# snmp-server enable traps vrrp
Router(config)# snmp-server enable traps hsrp
Router(config)# snmp-server enable traps tty
Router(config)# snmp-server enable traps ethernet cfm cc
Router(config)# snmp-server enable traps ethernet cfm crosscheck
Router(config)# snmp-server enable traps memory
Router(config)# snmp-server enable traps config-copy
Router(config)# snmp-server enable traps config
Router(config)# snmp-server enable traps resource-policy
Router(config)# snmp-server enable traps pppoe
Router(config)# snmp-server enable traps cpu
Router(config)# snmp-server enable traps syslog
Router(config)# snmp-server enable traps isakmp policy add
Router(config)# snmp-server enable traps isakmp policy delete
Router(config)# snmp-server enable traps isakmp tunnel start
Router(config)# snmp-server enable traps isakmp tunnel stop
Router(config)# snmp-server enable traps ipsec cryptomap add
Router(config)# snmp-server enable traps ipsec cryptomap delete
Router(config)# snmp-server enable traps ipsec cryptomap attach
Router(config)# snmp-server enable traps ipsec cryptomap detach
Router(config)# snmp-server enable traps ipsec tunnel start
Router(config)# snmp-server enable traps ipsec tunnel stop
Router(config)# snmp-server enable traps ipsec too-many-sas

Inutile dire che la tipologia di trap da abilitare dipende strettamente dalla configurazione del router, dalle feature abilitate (VPN IPsec), dal tipo di connessione WAN (PPP), ecc.

Polling SNMP tramite Nagios

Premesso che gli OID SNMP possono variare in base alla versione di IOS installata sul nostro router (a tal proposito vi consiglio di consultare questo sito), per prima cosa occorre definire i comandi specifici (all’interno dei file /etc/nagios/object/commands.cfg) che dovranno essere utilizzati dal nostro NMS per interrogare il dispositivo target.

Eccone un esempio:

# 'check_snmp_if_status' command definition
define command{
        command_name    check_snmp_if_status
        command_line    $USER1$/check_snmp -t 20 -H $HOSTADDRESS$ -C $ARG1$ -o $ARG2$ -r $ARG3$
        }
# 'check_snmp_cpu_load' command definition

define command{
        command_name    check_snmp_cpu_load
        command_line    $USER1$/check_snmp -t 20 -H $HOSTADDRESS$ -C $ARG1$ -o $ARG2$ -w $ARG3$ -c $ARG4$
        }

# 'check_snmp_used_memory' command definition

define command{
        command_name    check_snmp_used_memory
        command_line    $USER1$/check_snmp -t 20 -H $HOSTADDRESS$ -C $ARG1$ -o $ARG2$ -w $ARG3$ -c $ARG4$
        }

# 'check_snmp_uptime' command definition

define command{
        command_name    check_snmp_uptime
        command_line    $USER1$/check_snmp -t 20 -H $HOSTADDRESS$ -C $ARG1$ -o $ARG2$ -w $ARG3$ -c $ARG4$
        }

Infine, definiamo i servizi che si avvarranno dei suddetti comandi:

define service{
 use                             local-service         ; Name of service template to use
 host_name                       cisco
 service_description             Uptime
 check_command                   check_snmp_uptime!keypublic!.1.3.6.1.6.3.10.2.1.3.0!@61:900!@0:60
 }
define service{
 use                             local-service         ; Name of service template to use
 host_name                       cisco
 service_description             Last Minute CPU Load
 check_command                   check_snmp_cpu_load!keypublic!.1.3.6.1.4.1.9.2.1.57.0!80!90
 }
define service{
 use                             local-service         ; Name of service template to use
 host_name                       cisco
 service_description             Last 5 Minutes CPU Load
 check_command                   check_snmp_cpu_load!keypublic!.1.3.6.1.4.1.9.2.1.58.0!80!90
 }
define service{
 use                             local-service         ; Name of service template to use
 host_name                       cisco
 service_description             Used Memory
 check_command                   check_snmp_used_memory!keypublic!1.3.6.1.4.1.9.9.48.1.1.1.5.1!100000000!120000000
 }
define service{
 use                             local-service         ; Name of service template to use
 host_name                       cisco
 service_description             Status Interface WAN
 check_command                   check_snmp_if_status!keypublic!.1.3.6.1.2.1.2.2.1.8.1!1
 }
define service{
 use                             local-service         ; Name of service template to use
 host_name                       cisco
 service_description             Status Interface LAN
 check_command                   check_snmp_if_status!keypublic!.1.3.6.1.2.1.2.2.1.8.2!1
 }

A questo punto sarà sufficiente ricaricare la configurazione di Nagios mediante il comando:

[root@linuxbox ~]# service nagios reload

ed abbiamo finito.

Alla prossima.

Centos 6 e snmptrapd: ricevere le trap SNMP sulla nostra linux box

Il protocollo SNMP, nativamente, ci mette a disposizione 2 modalità di funzionamento: quella classica, basata sul semplice polling, che utilizza la porta UDP 161, e quella “asincrona”, le cosiddette trap, che utilizzano la porta UDP 162.

Va da se che la seconda modalità è migliore rispetto alla prima, in quanto ci consente di ricevere un allarme quasi in tempo reale, dato che è proprio il dispositivo monitorato a generare l’evento (trap) ed a inoltrarcelo.

snmptrap

Ma vediamo ora come configurare la nostra linux box in modo da farle accettare (e loggare) le suddette trap.

Iptables

La prima cosa da fare consiste nel consentire il traffico UDP in ingresso, sulla porta 162:

iptables -I INPUT -p udp --dport 162 -j ACCEPT

Ovviamente tale regola iptables può essere ulteriormente affinata, specificando, ad esempio, l’interfaccia in ingresso (-i), l’IP sorgente (-s) e l’IP di destinazione (-d).

Configurazione di snmptrapd

Adesso occorre configurare il demone che si occupa della ricezione delle trap, ovvero snmptrapd.

Il suo file di configurazione è /etc/snmp/snmptrapd.conf, il cui contenuto dovrà essere simile al seguente:

authCommunity log,execute,net keypublic
format1 %l-%m-%y %h:%j:%k from %A: %b %P %N %W %v\n
format2 %l-%m-%y %h:%j:%k from %A: %b %P %N %W %v\n

La prima entry specifica la community string (keypublic) e le azioni che snmptrapd può effettuare alla ricezione delle trap, ovvero loggarle (log), eseguire un evento specifico tramite handler (execute) oppure inoltrarle ad un altro dispositivo connesso in rete (net).

Mediante le direttive format1 e format2 (utilizzare, rispettivamente, nell’ambito del protocollo SNMPv1 e v2c), specifichiamo il formato del file di log in cui verranno salvate le trap ricevute. In particolare, con:

%l-%m-%y %h:%j:%k

indichiamo il timestamp nel formato giorno-mese-anno ora:minuto:secondo.

Utilizzando invece:

from %A

siamo in grado di loggare il nome del dispositivo che ci ha inviato la trap, mentre con:

%b

ricaviamo l’indirizzo IP del suddetto dispositivo.

Infine, con:

 %P, %N, %W

abbiamo rispettivamente la community string utilizzata dalla trap, la stringa enterprise (che identifica univocamente il produttore del dispositivo) e la descrizione della trap. Ecco un esempio del contenuto del file di log popolato da snmptrapd:

23-7-2015 10:9:0 from 10.12.12.3: UDP: [10.12.12.3]:62741->[10.12.12.2] TRAP, SNMP v1, community keypublic VMWARE-CIMOM-MIB::vmwCimOm Enterprise Specific VMWARE-ENV-MIB::vmwEnvIndicationTime.0 = STRING: 2015-7-23,8:8:59.0

Occorre notare che le trap non vengono ricevute (e loggate) in formato numerico, in quanto sulla linux box sono presenti le MIB (scritte attraverso il linguaggio SMI) specifiche per i dispisitivi monitorati (in questo caso degli host VMWare). Solo a titolo informativo, le suddette MIB vanno salvate all’interno della directory /usr/share/snmp/mibs/.

 Opzioni di avvio

Una volta configurato, snmptrapd deve essere avviato utilizzando determinate opzioni, affinchè il processo di logging venga effettuato secondo le nostre necessità. Il file in cui specificare tali opzioni è /etc/sysconfig/snmptrapd, il cui contenutò dovrà essere simile al seguente:

OPTIONS="-A -m ALL -M /usr/share/snmp/mibs -Lf /var/log/snmptrapd.log -p /var/run/snmptrapd.pid"

dove l’opzione -A indica la modalità di scrittura del file di log (append); -m ALL indica la necessità di utilizzare tutte le MIB presenti sul sistema; -M serve a specificare il pathname delle MIB; -Lf indica il file di log ed infine -p punta al pathname del file *.pid (process ID) associato al demone in questione.

Rotazione del file di log

Naturalmente un file di log troppo grande risulta molto più difficile da consultare, ergo occorre definire delle regole di rotazione utilizzando lo strumento messo a disposizione dalla nostra linux box, ovvero logrotate. In particolare, il contenuto del file snmptrapd presente nella directory /etc/logrotate.d dovrà essere il seguente:

/var/log/snmptrapd.log {
    rotate 10
    missingok
    notifempty
    sharedscripts
    delaycompress
    copytruncate
    weekly
    postrotate
        /sbin/service snmtrapd restart > /dev/null 2>/dev/null || true
    endscript
}

Tra le suddette opzioni, quella più importante è certamente copytruncate, senza la quale, dopo ogni rotazione, il file di log non sarebbe in grado di registrare nuovi eventi.

Ora che è tutto configurato possiamo avviare il demone:

[root@linuxbox ~]# service snmptrapd start

e fare in modo che venga eseguito automaticamente dopo ogni boot:

[root@linuxbox ~]# chkconfig snmptrapd on

Invio tramite email delle trap di allarme

L’ultimo step consiste nel fare in modo che tutte le trap di allarme vengano inviate sulla nostra mailbox. Per fare ciò si può utilizzare swatch, il cui file di configurazione (/etc/swatch_snmp.conf) dovrà essere simile a questo:

#SNMP TRAP ALERT
watchfor  /Alert|alert/
     echo
     mail addresses=vostro.indirizzo\@email.it,subject=SWATCH LINUX-BOX: SNMP TRAP ALERT

Editiamo il file /etc/rc.local in modo da avviare automaticamente swatch ad ogni boot della macchina:

swatch -c /etc/swatch_snmp.conf -t /var/log/snmptrapd.log &

Lanciamo il comando:

[root@linuxbox ~]# swatch -c /etc/swatch_snmp.conf -t /var/log/snmptrapd.log &

ed abbiamo finito.

Alla prossima.

Stack Catalyst 3750 ed SNMP

Spesso mi è capitato di avere a che fare con degli switch Cisco Catalyst 3750 configurati in stack. Grazie a questa configurazione, due o più switch vengono visti, a livello logico, come un unico commutatore. Ciò significa che a tutto lo stack può essere associato un unico indirizzo IP di management.

Ma dove sta l’inghippo? Semplice: nel caso in cui si utilizzino dei sistemi di monitoraggio della rete (ad esempio Nagios), il semplice ping non è sufficiente ad indicare che tutti gli switch di uno stack funzionano correttamente. Infatti, se uno di essi si guastasse, lo stack continuerebbe ad esistere e quindi ad essere raggiungibile a livello IP.

Come fare dunque per montorare l’effettivo stato di ogni singolo switch che costituisce lo stack? La risposta è semplice: SNMP.

In particolare, gli OID da utilizzare sono reperibili su questo server FTP anonimo (la directory è /pub/mibs/oid) ed il file di riferimento è CISCO-STACKWISE-MIB.oid

Per la precisione, gli OID che indicano lo stato di funzionamento relativo alle stackport degli switch che costituiscono uno stack sono i seguenti:

1.3.6.1.4.1.9.9.500.1.2.2.1.1.5180

(per la prima porta del primo switch)

1.3.6.1.4.1.9.9.500.1.2.2.1.1.5181

(per la seconda porta del primo switch)

1.3.6.1.4.1.9.9.500.1.2.2.1.1.5183

(per la prima porta del secondo switch)

1.3.6.1.4.1.9.9.500.1.2.2.1.1.5184

(per la seconda porta del secondo switch)

1.3.6.1.4.1.9.9.500.1.2.2.1.1.5186

(per la prima porta del terzo switch)

1.3.6.1.4.1.9.9.500.1.2.2.1.1.5187

(per la seconda porta del terzo switch)

e così via.

Per verificare che gli OID sopra citati siano effettivamente supportati nell’ambito dello stack, potete utilizzare il comando snmpget (se avete a disposizione una linux box) oppure il tool Getif (nel caso in cui la vostra workstation sia una macchina Windows).

Configuriamo ora nagios. Per prima cosa definiamo il comando che ci permette di controllare lo stato dei vari switch:

nightfly@nightbox:~$ cd /etc/nagios-plugins/config

nightfly@nightbox:~$ sudo nano snmp.cfg

Inseriamo la seguente direttiva:

'snmp_stack' command definition
define command {
command_name    snmp_stack
command_line    /usr/lib/nagios/plugins/check_snmp -H '$HOSTADDRESS$' -C '$ARG1$' -o '$ARG2$' -r '$ARG3$'
}

Ora che abbiamo definito il comando, aggiungiamo il servizio per il monitoraggio degli switch all’interno del file di configurazione che identifica lo stack:

nightfly@nightbox:~$ cd /etc/nagios3/conf.d

nightfly@nightbox:~$ sudo nano host-stack_nagios3.cfg

Inseriamo quanto segue:

define service {
use                             generic-service         ; Name of service template to use
host_name                       Stack
service_description             Status Switch 1 Stackport 1
check_command                  
snmp_stack!vostracommunitystring!1.3.6.1.4.1.9.9.500.1.2.2.1.1.5181!1
}

define service {
use                             generic-service         ; Name of service template to use
host_name                       Stack
service_description             Status Switch 1 Stackport 2
check_command                  
snmp_stack!vostracommunitystring!1.3.6.1.4.1.9.9.500.1.2.2.1.1.5181!1
}

define service {
use                             generic-service         ; Name of service template to use
host_name                       Stack
service_description             Status Switch 2 Stackport 1
check_command                  
snmp_stack!vostracommunitystring!1.3.6.1.4.1.9.9.500.1.2.2.1.1.5183!1
}

define service {
use                             generic-service         ; Name of service template to use
host_name                       Stack
service_description             Status Switch 2 Stackport 2
check_command                  
snmp_stack!vostracommunitystring!1.3.6.1.4.1.9.9.500.1.2.2.1.1.5184!1
}

define service {
use                             generic-service         ; Name of service template to use
host_name                       Stack
service_description             Status Switch 3 Stackport 1
check_command                  
snmp_stack!vostracommunitystring!1.3.6.1.4.1.9.9.500.1.2.2.1.1.5186!1
}

define service {
use                             generic-service         ; Name of service template to use
host_name                       Stack
service_description             Status Switch 3 Stackport 2
check_command                  
snmp_stack!vostracommunitystring!1.3.6.1.4.1.9.9.500.1.2.2.1.1.5187!1
}

Ovviamente sono partito dal presupposto che lo stack sia composto da 3 switch.

Salviamo il file e riavviamo Nagios:

nightfly@nightbox:~$ sudo service nagios3 restart

e finalmente potremo monitorare l’effettivo stato degli switch di uno stack.

A presto.

Monitorare i dispositivi di rete mediante SNMP e Nagios

Una delle necessità principali del sistemista di rete riguarda solitamente il monitoraggio dei vari dispositivi che costituiscono il network di cui è amministratore. Per esempio, potrebbe essere necessario avere informazioni sulla raggiungibilità dei dispositivi (attraverso un semplice ping), oppure sul traffico che interessa le varie interfacce di rete (sia in ingresso che in uscita), piuttosto che sul loro stato di funzionamento.

Per fare ciò, occorre utilizzare un protocollo sviluppato ad hoc, ovvero SNMP (Simple Network Management Protocol), che può essere configurato in due modalità: poll e trap. Nel primo caso è il sistemista, attraverso degli opportuni client di monitoraggio, a domandare periodicamente ed in modo semiautomatizzato qual è lo stato dei vari servizi presenti sugli host o sui dispositivi di rete. Nel secondo caso, poichè per il client di monitoraggio potrebbe essere oneroso effettuare troppe query, sono i dispositivi di rete stessi a generare degli alert nel caso in cui si verifichi un problema di raggiungibilità relativo ad un determinato servizio. Tali alert verranno recapitati al client, il quale li mostrerà, se cosi si può dire, al sistemista.

Ora, premesso che in questa breve guida utilizzeremo il protocollo SNMP in modalità poll, vediamo quali sono i dispositivi di rete che vogliamo monitorare, e quale client di monitoraggio utilizzare.

In particolare, i dispositivi di rete su cui concentreremo la nostra attenzione sono un home router, per la precisione un Cisco soho 77, ed un firewall (Cisco PIX 501). Il client di monitoraggio, invece, sarà nagios3.

SNMP su PIX 501

Per prima cosa abilitamo il protocollo SNMP sul firewall. Per fare ciò è necessario seguire i questi step:

PIX501> ena

PIX501# conf t

PIX501(config)# snmp-server host <IP del client di monitoraggio> poll

In questo modo, abbiamo istruito il PIX su quale dovrà essere l’IP sorgente da cui potranno provenire le query SNMP. Le query provenienti da altri IP saranno ovviamente ignorate.

Adesso diciamo al PIX qual è la community string (ovvero una sorta di password) che verrà utilizzata:

PIX501(config)# snmp-server community <community string>

Salviamo adesso la configurazione con un write mem:

PIX501(config)# write mem

Bene, verifichiamo adesso che il protocollo SNMP sia stato abilitato correttamente sul nostro PIX, lanciando una query direttamente dalla linux box che utilizzeremo come stazione di monitoraggio:

nightfly@nightbox:~$ snmpwalk -v 1 -c <community string> <IP dell'interfaccia inside del PIX>

Se riceveremo una risposta del tipo:

IF-MIB::ifNumber.0 = INTEGER: 2
IF-MIB::ifIndex.1 = INTEGER: 1
IF-MIB::ifIndex.2 = INTEGER: 2

<output omesso>

vuol dire che la query ha restituito dei risultati e che quindi il protocollo è funzionante.

Alcune precisazioni

Come avrete notato dalla query eseguita mediante il comando snmpwalk, la versione del protocollo SNMP abilitata sul PIX è la 1. Tale versione, come la 2, è estremamente vulnerabile in quanto consente la propagazione della community string in chiaro. Converrete con me che tale scelta risulta piuttosto insensata, in quanto il firewall dovrebbe essere la security appliance per antonomasia. L’unica attenuante che mi sento di concedere è che il PIX 501 resta comunque un dispositivo piuttosto datato, il cui sistema operativo integrato (Finesse) non viene più sviluppato da tempo.

Un’altra precisazione riguarda proprio l’uso del comando snmpwalk. Nella fattispecie, mediante tale comando è possibile scorrere l’intero SMI alla ricerca dell’OID che ci interessa. Nel caso in cui, invece, conoscessimo l’OID specifico, si potrebbe utilizzare il comando snmpget, con la seguente sintassi:

nightfly@nightbox:~$ snmpget -v 1 -c <community string> <IP dell'interfaccia inside del PIX> <OID>

A proposito, se non sapete cos’è lo SMI e cosa si intende per OID e MIB date un’occhiata a questo post.

Infine, se come stazione di monitoraggio non avete a disposizione una linux box ma una macchina Windows, potete scaricare il tool Getif (direttamente da qui, è gratuito), il quale vi consentirà di eseguire le query SNMP in modo semplice ed efficace.

SNMP su SOHO 77

Dopo aver abilitato il protocollo SNMP sul firewall, abilitiamolo anche sul router. Per fare ciò occorre digitare i comandi:

soho77> ena

soho77# conf t

soho77(config)# snmp-server enable informs

soho77(config)# snmp-server community <community string>

Salviamo adesso la configurazione:

soho77(config)# end

soho77# copy run start

Effettuiamo la solita query mediante snmpwalk e se otteniamo risposta significa che anche sul router il protocollo in questione è stato abilitato in modo corretto:

nightfly@nightbox:~$ snmpwalk -v 2c -c <community string> <IP del router>

Come avrete già sicuramente notato dal comando precedente, sul router è abilitato il protocollo SNMP versione 2.

Configurazione della stazione di monitoraggio

Dopo aver abilitato il protocollo SNMP sui dispositivi che vogliamo monitorare, vediamo adesso come configurare al meglio la nostra stazione di monitoraggio. In questa guida partirò dal presupposto che tale stazione sarà una macchina linux, su cui verrà installato un apposito client, ovvero nagios3.

Procediamo quindi con l’installazione di tale applicativo:

nightfly@nightbox:~$ sudo apt-get install nagios3

Ad installazione completata spostiamoci nella seguente directory:

nightfly@nightbox:~$ cd /etc/nagios3/conf.d

qui sono presenti i file di configurazione dei vari host. Apriamo in lettura uno dei file di configurazione che vengono generati automaticamente dopo l’installazione di nagios, ad esempio localhost_nagios2.cfg:

nightfly@nightbox:/etc/nagios3/conf.d$ cat localhost_nagios2.cfg

l’output sarà simile al seguente:

define host {
use                     generic-host            ; Name of host template to use
host_name       localhost
alias                   localhost
address             127.0.0.1
}

define service {
use                                  generic-service         ; Name of service template to use
host_name                    localhost
service_description     Disk Space
check_command          check_all_disks!20%!10%
}

Mediante la direttiva define host viene definito l’host template, l’hostname, l’alias e l’indirizzo IP del dispositivo da monitorare.

Invece, mediante la direttiva define service, viene definito il servizio da monitorare per il suddetto host.

Ma come funzionano effettivamente i servizi? Bene, qui la spiegazione diventa inevitabilmente un po’ più impegnativa. Per prima cosa occorre precisare che nagios prevede la presenza di alcuni eseguibili presenti all’interno della direcotory /usr/lib/nagios/plugins. Tali eseguibili verranno utilizzati nell’ambito di alcuni comandi creati appositamente. In particolare, una lista di tali comandi è presente all’interno della directory /etc/nagios-plugins/config, il cui contenuto è simile al seguente:

apt.cfg     disk.cfg      dummy.cfg   hppjd.cfg     ldap.cfg  mrtg.cfg     news.cfg  pgsql.cfg  radius.cfg   snmp.cfg     telnet.cfg
breeze.cfg  disk-smb.cfg  flexlm.cfg  http.cfg      load.cfg  mysql.cfg    nt.cfg    ping.cfg   real.cfg     ssh.cfg      users.cfg
dhcp.cfg    dns.cfg       ftp.cfg     ifstatus.cfg  mail.cfg  netware.cfg  ntp.cfg   procs.cfg  rpc-nfs.cfg  tcp_udp.cfg

Come è possibile notare, quindi, esistono diversi comandi raccolti all’interno di opportuni file di configurazione. Più precisamente, tali comandi vengono suddivisi a seconda del protocollo o dell’applicativo che intendono monitorare. Osserviamo adesso uno stralcio del contenuto di un qualsiasi file di configurazione menzionato in precedenza, ad esempio snmp.cfg:

# 'check_compaq_thermalCondition' command definition
define command {
command_name    check_compaq_thermalCondition
command_line     /usr/lib/nagios/plugins/check_snmp -H '$HOSTADDRESS$' -C '$ARG1$' -o .1.3.6.1.4.1.232.6.2.1.0,.1.3.6.1.4.1.232.6.2.2.0,.1.3.6.1.4.1.232.6.2.3.0,.1.3.6.1.4.1.232.6.2.4.0 -u 'ThermalCondition','ThermalTemp','ThermalSystem','ThermalCPUFan' -w 2:2,2:2,2:2,2:2 -c 1:2,1:2,1:2,1:2 -l "Thermal status "
}

In questo caso, mediante l’eseguibile check_snmp, vengono monitorate le condizioni termiche dell’host specificato all’interno della variabile ‘$HOSTADDRESS$’, il cui contenuto è presente proprio nella definizione dell’host contenuta in un file posizionato in /etc/nagios3/conf.d$

La variabile ‘$ARG1$’, invece, serve a specificare la community string da utilizzare. Infine, la flag -o specifica gli OID da usare per ottenere dal sistema interrogato le informazioni desiderate.

Configurare nagios per monitorare il PIX 501

Ora che sappiamo come funzionano i comandi, possiamo crearne uno ad hoc per monitorare lo stato delle interfacce inside ed outside del nostro PIX.

Apriamo in scrittura il file snmp.cfg ed inseriamo la seguente direttiva:

# 'snmp_if' command definition
define command {
command_name    snmp_if
command_line    /usr/lib/nagios/plugins/check_snmp -H '$HOSTADDRESS$' -C '$ARG1$' -o '$ARG2$' -r '$ARG3$'
}

Salviamo il file, posizioniamoci all’interno della directory /etc/nagios3/conf.d e creiamo il file hots-pix501_nagios3.cfg:

nightfly@nightbox:/etc/nagios3/conf.d$ sudo touch hots-pix501_nagios3.cfg

A questo punto inseriamo all’interno del file in questione le informazioni relative al PIX:

 define host {
 host_name   PIX501
 alias       PIX501 Inside
 address     <ip del PIX>
 use         generic-host
 }

e definiamo, inoltre, i servizi da monitorare per questo host:

 define service {
 use                             generic-service         ; Name of service template to use
 host_name                       PIX501
 service_description             Status Interface Outside
 check_command                   snmp_if!vostracommunitystring!.1.3.6.1.2.1.2.2.1.8.1!1
 }

Come potete notare, gli argomenti richiesti nell’ambito della definizione del comando snmp_if vengono riconosciuti grazie al prefisso ! e dati in pasto al comando stesso proprio mediante la configurazione del servizio.

Ovviamente, l’OID che indica lo stato dell’interfaccia outside del PIX è .1.3.6.1.2.1.2.2.1.8.1

Allo stesso modo, possiamo monitorare lo stato dell’interfaccia inside del PIX:

define service {
use                             generic-service         ; Name of service template to use
host_name                       gateway
service_description             Status Interface Inside
check_command                   snmp_if!vostracommunitystring!.1.3.6.1.2.1.2.2.1.8.2!1
}

Con

figurare nagios per monitorare il SOHO 77

Per il router il discorso di fa un po’ più complesso. In questo caso, oltre a voler monitorare lo stato dell’interfaccia ethernet0 e della dialer0, vogliamo anche monitorare il traffico in ingresso ed in uscita per entrambe le interfacce citate in precedenza. Creiamo dunque il file host-soho77_nagios3.cfg:

nightfly@nightbox:/etc/nagios3/conf.d$ sudo touch hots-soho77_nagios3.cfg

apriamolo in scrittura ed aggiungiamo le seguenti direttive:

define host {
host_name   soho77
alias        router soho77
address     <ip del router>
use         generic-host
}

define service{
use                             generic-service         ; Name of service template to use
host_name                       soho77
service_description             Status Interface eth0
check_command                   snmp_if!vostracommunitystring!.1.3.6.1.2.1.2.2.1.8.2!1
}

define service {
use                             generic-service         ; Name of service template to use
host_name                       soho77
service_description             Status Interface dia0
check_command                   snmp_if!vostracommunitystring!.1.3.6.1.2.1.2.2.1.8.8!1
}

define service {
use                             generic-service         ; Name of service template to use
host_name                       soho77
service_description             Traffic Inbound Interface eth0                 check_command                   snmp_if!vostracommunitystring!.1.3.6.1.2.1.2.2.1.10.2!1

}

define service {
use                             generic-service         ; Name of service template to use
host_name                       soho77
service_description             Traffic Inbound Interface dia0
check_command                   snmp_if!vostracommunitystring!.1.3.6.1.2.1.2.2.1.10.8!1
}

define service {
use                             generic-service         ; Name of service template to use
host_name                       soho77
service_description             Traffic Outbound Interface eth0
check_command                   snmp_if!vostracommunitystring!.1.3.6.1.2.1.2.2.1.16.2!1
}

define service {
use                             generic-service         ; Name of service template to use
host_name                       soho77
service_description             Traffic Outbound Interface dia0
check_command                   snmp_if!vostracommunitystring!.1.3.6.1.2.1.2.2.1.16.8!1
}

salviamo il file e riavviamo dunque nagios digitando:

nightfly@nightbox:~$ sudo service nagios3 restart

ed infine diamo un’occhiata allo status dei vari dispositivi direttamente dall’interfaccia Web messa a nostra disposizione da nagios3:

http://ipstazionedimonitoraggio/nagios3

A questo punto verranno richieste le credenziali di accesso alla pagina (lo username di default è nagiosadmin)

Cliccando infine su host details o su service detail sarà possibile constatare l’effettiva raggiungibilità dei vari dispositivi e lo stato dei servizi attivi.

Spero di essere stato chiaro, per ulteriori chiarimenti contattatemi.

PS: potete fare in modo che nagios3 vi invii una mail per notificare l’eventuale irraggiungibilità di un dispositivo oppure per segnalare qualche problema riscontrato su uno dei servizi attivi nella rete. Per fare ciò è necessario editare il file contacts_nagios2.cfg presente nella directory /etc/nagios3/conf.d:

nightfly@nightbox:/etc/nagios3/conf.d$ sudo nano contacts_nagios2.cfg

Vi basterà modificare quindi il campo email presente in contact:

define contact {
        contact_name                    root
        alias                           Root
        service_notification_period     24x7
        host_notification_period        24x7
        service_notification_options    w,u,c,r
        host_notification_options       d,r
        service_notification_commands   notify-service-by-email
        host_notification_commands      notify-host-by-email
        email                           vostroindirizzoemail       

}

Riavviate nagios3 ed il gioco è fatto.

Monitorare le chiamate VOIP attive su un router Cisco 2851 mediante SNMP

Recentemente mi è capitato di dover monitorare mediante Nagios le chiamate attive su un router Cisco 2851 adibito a voice gateway. Premesso che tale router è dotato di due interfacce seriali, entrambe utilizzate nell’ambito di linee E1, occorre fare alcune precisazioni.

Precisazione #1

Le linee E1 utilizzano ben 30 canali dati (B-channel, dove B sta per Bearer) a 64 Kbps ed un canale di segnalazione (D ovvero Delta) a 128 Kbps. In questo modo è possibile raggiungere delle velocità teoriche di 2Mbps. Esse rappresentano, inoltre, le PRI (Primary Rate Interface) usate in Europa, Asia ed Australia.

Le linee T1 utilizzano invece 23 canali dati (a 64 Kbps) ed un canale di segnalazione (anch’esso a 64 Kbps) . Tale tipologia di PRI viene usata negli Stati Uniti d’America ed in Giappone e permette di raggiungere velocità nominali pari a 1.544 Mbps.

Precisazione #2

Quello che ci interessa è monitorare il numero di chiamate VOIP attive. Per fare ciò è sufficiente utilizzare i seguenti comandi:

Router2851#sh isdn active <nomeinterfaccia>

per visualizzare il numero di chiamate attive

Router2851#sh call resource voice stats

per ottenere informazioni statistiche relative al Digital Signal 0 (DS0), ovvero il canale utilizzato per trasportare il traffico voce (in realtà il termine DS0 si riferisce alle linee T1, per le linee E1 vi è il corrispondente E0, anche se sul router viene menzionato solo DS0).

Configurazione di Nagios

Monitoriamo quindi mediante SNMP le statistiche associate al DS0, usando il seguente OID:

.1.3.6.1.4.1.9.10.19.1.1.9.1.3.0.0

Non ci resta che configurare il comando su Nagios:

nightfly@nightbox:~$ cd /etc/nagios-plugins/config

nightfly@nightbox:~$ sudo nano snmp.cfg

Inseriamo la seguente direttiva:

'snmp_call' command definition
 define command {
 command_name    snmp_call
 command_line    /usr/lib/nagios/plugins/check_snmp -H '$HOSTADDRESS$' -C '$ARG1$' -o '$ARG2$'
 }

e successivamente abilitiamo il servizio per il 2851:

nightfly@nightbox:~$ cd /etc/nagios3/conf.d

nightfly@nightbox:~$ sudo nano host-2851_nagios3.cfg

Inseriamo quanto segue:

 define service {
 use                             generic-service         ; Name of service template to use
 host_name                       2851
 service_description             Active Calls
 check_command                   snmp_call!vostracommunitystring!.1.3.6.1.4.1.9.10.19.1.1.9.1.3.0.0
 }

Finalmente sarà possibile monitorare le chiamate attive sul nostro voice gateway.

A presto.

Monitorare la RAM su un dispositivo Cisco mediante SNMP

Per visualizzare la RAM installata su un qualsiasi dispositivo Cisco è sufficiente lanciare il comando sh ver:

Router# sh ver

La parte di output che ci interessa è simile alla seguente:

Cisco 2851 (revision 53.51) with 249856K/12288K bytes of memory.

Il primo valore, ovvero 249856K indica la memoria libera, mentre il secondo, ovvero 12288K, indica la memoria utilizzata. Sommando dunque questi due valori otterremo la dimensione totale della RAM installata sul dispositivo (in tal caso 256 MB).

Ora, vogliamo monitorare, mediante SNMP, la RAM in uso e quella libera. Per fare ciò è possibile utilizzare i seguenti OID:

.1.3.6.1.4.1.9.9.48.1.1.1.5.1

(per la memoria attualmente in uso dal processor pool)

.1.3.6.1.4.1.9.9.48.1.1.1.5.1

(per la memoria attualmente in uso dall’I/O pool)

.1.3.6.1.4.1.9.2.1.8.0

(per la memoria libera)

Definiamo ora il comando per monitorare la memoria in uso e la memoria libera attraverso delle query SNMP:

nightfly@nightbox:~$ cd /etc/nagios-plugins/config

nightfly@nightbox:~$ sudo nano snmp.cfg

inseriamo la direttiva:

'snmp_cisco_memory_usage' command definition
 define command {
 command_name    snmp_cisco_memory_usage
 command_line    /usr/lib/nagios/plugins/check_snmp -H '$HOSTADDRESS$' -o '$ARG1$','$ARG2$','$ARG3$' -w '$ARG4$','$ARG5$','$ARG6$' -c '$ARG7$','$ARG8$','$ARG9$' -u "bytes,bytes,bytes" -l "Memory" -C '$ARG10$'
 }

In particolare, la flag -l serve per definire una label, la flag -u indica l’unità di misura a cui si riferisce l’output della query, la flag -w specifica le soglie di warning per la memoria libera ed in uso, la flag -c specifica le soglie di critical per la memoria libera ed in uso.

Non ci resta che aggiungere il servizio per il monitoraggio della RAM all’interno del file in cui è definito l’host Cisco:

nightfly@nightbox:~$ cd /etc/nagios3/conf.d

nightfly@nightbox:~$ sudo nano host-cisco_nagios3.cfg

Inseriamo quanto segue:

 define service {
 use                             generic-service         ; Name of service template to use
 host_name                       Cisco
 service_description             Cisco memory usage check
 check_command                  snmp_cisco_memory_usage!.1.3.6.1.4.1.9.9.48.1.1.1.5.1,
 .1.3.6.1.4.1.9.9.48.1.1.1.5.2,.1.3.6.1.4.1.9.2.1.8.0!140000000,10000000!60000000:!100000000,12000000!20000000:!vostracommunitystring
 }

dove i : dopo la soglia di warning 6000000 e quella di critical 40000000 indicano rispettivamente <60000000 e <40000000 (poichè abbiamo a che fare con la memoria libera).

Riavviamo Nagios:

nightfly@nightbox:~$ sudo service nagio3 restart

ed abbiamo finito.

A presto.

Snmpwalk: visualizzare informazioni sulle interfacce di un Cisco Catalyst 3750

Recentemente mi è capitato di avere a che fare con un tool per il monitoraggio della rete (weathermap). Questo tool, affinchè riesca a monitorare il traffico che interessa le varie interfacce di uno switch o di un router, effettua banalmente delle query SNMP.

Ora, la versione di tale protocollo abilitata sui vari device è la 2, ergo, utilizzando snmpwalk posso interrogare l’agente (e i vari subagent) in esecuzione sul dispositivo di mio interesse semplicemente digitando:

snmpwalk -v 2c -c <community string> <ip del dispositivo> 1.3.6.1.2.1.2.2.1.1

Direte voi… cos’è quel numero strano in coda alla query? Ebbene, quello è l’OID (Object Identifier) relativo alle interfacce del Catalyst. Ogni OID viene generato a partire dal cosiddetto SMI (Structure of Management Information), che presenta una struttura “ad albero”. Per maggiore completezza, un esempio di SMI è riportato nella figura sottostante:

Snmp.gif
Grazie alle MIB (Management Information Base), inoltre, è possibile identificare mediante una determinata stringa parte di un OID. La tabella seguente può far capire in modo abbastanza banale che cosa si intende per MIB:
OID                     MIB
1.3                      org
1.3.6                   dod
1.3.6.1               internet
1.3.6.1.1            directory
1.3.6.1.2            mgmt
1.3.6.1.3            experimental
1.3.6.1.4            private
1.3.6.1.4.1         enterprises
Quindi l’OID utilizzato nell’ambito della query effettuata mediante snmpwalk equivale a:
mgmt.1.2.2.1.1
Infine, occorre precisare che del protocollo in questione esistono ben 3 versioni: la 1 e la 2 piuttosto insicure, in quanto non cifrano la community string (neanche quando le query vengono effettuate da remoto attraverso Internet). La versione 3, invece, prevede un meccanismo di cifratura che la rende molto più sicura rispetto alle versioni precedenti.
Bye.