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.