Il protocollo SNMP (Simple Network Management Protocol) appartiene alla suite di protocolli Internet definiti dall’IETF (Internet Engineering Task Force) nel 1989 ed opera a livello 7 del modello OSI. Questo protocollo permette agli amministratori di rete di misurare parametri di funzionamento dei dispositivi di rete al fine di rilevare anomalie o creare statistiche.
L'SNMP è passato attraverso le seguenti revisioni:
- SNMPv1: è la prima versione, utilizza l'invio in chiaro di nomi di community come password
- SNMPv2: rispetto al precedente utilizza un sistema di autenticazione che si basa sugli algoritmi MD5
- SNMPv3: oltre all'autenticazione cifrata MD5 utilizza un criptaggio DES per i dati
Come funziona
Per poter funzionare l'SNMP necessita di tre elementi, il sistema gestito, l'agent ed il manager.
Il sistema gestito può essere un router, una stampate, uno switch, o qualsiasi altro dispositivo che disponga di un agent di gestione che misura dei valori e li memorizza all'interno di un database gerarchico chiamato MIB (Management Information Base).
Il Manager è il sistema di gestione, tipicamente un sistema di monitoraggio in grado di interrogare il MIB.
In pratica questo protocollo è un'implementazione del modello client server dove il client è il dispositivo di monitoraggio ( sul quale gira il modula Manager) ed il server è il dispositivo da monitorare (sul quale gira l'applicazione agent). L'agent raccoglie dati, li memorizza nel MIB e rimane in ascolto sulla porta UDP 162 per rispondere alle interrogazioni da parte del Manager.
La struttura del MIB
Il MIB è un database gerarchico (ad albero) che permette di identificare i propri oggetti tramite un object idetifier (OID) secondo la notazione ‘.a.b.c.d.e.f…', dove al posto delle lettere appaiono caratteri alfanumerici.
Ad esempio la foglia trasmission nel MIB rappresentato in figura è identificato da: iso.org.dod.internet.mgmt.mib.trasmission oppure dalla sequenza .1.3.6.1.2.2.10.
L'albero dei MIB ha una struttura standard ed ogni costruttore può inserire il proprio ramo infatti sotto il ramo iso.org.dod.internet.private.enterprises vengono inseriti le registrazioni degli oggetti specifici dei diversi costruttori.
Per poter effettuare una misurazione è necessario conoscere l'OID che contiene il valore da misurare. Ad esempio se vogliamo misurare il traffico entrante i una interfaccia di rete su un router (parametro definito ifInOctets) lo troviamo al seguente OID:
.1.3.6.1.2.1.2.2.1.10.
Per trovare gli OID di nostro interesse bisogna fare riferimento alla documentazione del produttore o più semplicemente googleare.
Azioni sugli OID
Fondamentalmente le azioni che si possono compiere sugli OID sono tre:a) Leggere b) Scrivere c) Inviare una trap
Limitandoci al protocollo SNMPv1 le principali operazioni sono le seguenti:
1. GET: utilizzata dal Manager per leggere 2. GET-NEXT: utilizzata dal Manager per leggere ricorsivamente il MIB 3. SET: utilizzata dal Manager per scrivere 4. TRAP: utilizzata dall'agente per inviare messaggi al Manager
In questo articolo faremo riferimento a comandi appartenenti al pacchetto Net-SNMP, disponibile sia su piattaforma Unix che Windows.
Il comando che utilizzeremo per leggere un OID è l'snmpget.
Una volta identificato l'indirizzo ip del router da interrogare, la sua community e l'OID di nostro interesse (in questo caso ifInOctects) procediamo come segue:
$snmpget iprouter community ifInOctects
Dove: iprouter è l'indirizzo ip del router community è la community ifInOctects è .1.3.6.1.2.1.2.2.1.10.
Parametri misurabili
Oltre al parametro ifInOctects è possibile identificarne molti altri:
Parametro |
OID |
Descrizione |
ifOutOctects |
.1.3.6.1.2.1.2.2.1.16 |
Numero ottetti in ingresso |
ifSpeed |
.1.3.6.1.2.1.2.2.1.5 |
Banda massima, qualora non fosse misurabile viene inserita la banda nominale |
ifInErrors |
.1.3.6.1.2.1.2.2.1.14 |
Numero di pacchetti in ingresso contenenti errori che non sono stati inviati ai livelli superiori |
ifOutErrors |
.1.3.6.1.2.1.2.2.1.20 |
Numero di pacchetti in uscita che non sono stati inviati a causa di errori |
ifInDiscards |
.1.3.6.1.2.1.2.2.1.13 |
Numero di pacchetti eliminati nonostante non contengano errori |
ifPhysAddress |
.1.3.6.1.2.1.2.2.1.6 |
Indirizzo fisico dell'interfaccia |
ifOutQlen |
.1.3.6.1.2.1.2.2.1.21 |
Lunghezza della coda di output |
La tabella precedente è solo un piccolo elenco di parametri monitorabili.
Parametri calcolabili
Oltre a monitorare direttamente i parametri ve ne sono alcuni che possono essere calcolati, ad esempio la percentuale di banda occupata.
Abbiamo visto che la banda massima utilizzabile è misurata dal parametro ifSpeed. Altri due parametri importanti sono quelli che ci indicano il traffico come ifInOctects e ifOutOctects.
Per poter calcolare l'occupazione di banda dobbiamo misurare i valori IfInOctects ed ifOutOctects in due tempi differenti T1 e T2 e trovare il ∆ifInOctects e ∆ifOutOctects, in pratica si sottrae dal valore misurato al tempo T2 quello misurato al tempo T1 (∆T). L'occupazione di banda sara:
(∆ifInOctects+∆ifOutOctects) x 8 x 100/∆T x IfSpeed
Naturalmente questo è un parametro calcolato la cui accuratezza dipende dall'accuratezza della misurazione di ifSpeed.