domenica, Dicembre 22, 2024

Dedalo: disegno automatico della tipologia di una rete Cisco

Introduzione

Il progetto ha lo scopo di realizzare un’applicazione che permetta di disegnare in modo automatico la topologia di una rete composta da apparati Cisco mediante l’utilizzo di query SNMP. L’utilizzo esclusivo di apparati Cisco è dovuto al fatto che questi imple-mentano il protocollo CDP che è incompatibile con periferiche di altri produttori. Inoltre anche con apparati Cisco bisogna avere una versione di IOS aggiornata. I test sono stati effettuati con versioni dalla 12.2 in poi.

L’applicazione riceve in input una lista di IP e una lista di community SNMP, effettua delle query e da come output la topologia della rete nel linguaggio dot (utilizzato per de-finire grafi). Per avere l’immagine della topologia basta passare l’output a Graphviz che si occuperà del rendering.

Link al progetto (da cui si può effettuare il download del software): http://www.yapsoft.it/software/dedalo/

Il protocollo CDP

CDP sta per Cisco Discovery Protocol ed è un protocollo che viaggia sopra il layer 2 (Da-ta Link) ed è implementato su tutti gli apparati Cisco come ad esempio router, bridge, access server e switch. Gli apparati tra loro si scambiano degli annunci contenenti varie informazioni come ad esempio il proprio indirizzo IP e il nome della porta su cui stanno effettuando l’annuncio. Queste informazioni vengono memorizzate in una cache attraver-so la quale, le applicazioni di network management, possono capire come sono collegati tra loro e di che tipo sono i vari apparati. Gli annunci sono inviati ad indirizzi multicast e contengono inoltre informazioni sul tempo di validità degli annunci in modo da non avere l’informazione in cache per un tempo limitato ed evitare inconsistenze per troppo tempo. Visto che CDP viaggia sopra il layer 2 lo si può utilizzare anche sugli switch e i bridge che non comunicano tra loro tramite IP. Si ha comunque bisogno di un ip a cui destinare le richieste snmp.

La configurazione di CDP

Command
Router(config)# cdp run //Enables CDP globally.
Router(config)# no cdp run //Disables CDP globally.
Per verificare che sia attivo: Command
Router# show cdp //Displays global CDP information.

c2610# show cdp      //Global CDP information:
        Sending CDP packets every 60 seconds
        Sending a holdtime value of 180 seconds
        Sending CDPv2 advertisements is enabled

E’ possibile abilitare/disabilitare CDP sulle singole interfacce tramite i comandi:

Router(config)# interface {{type1 slot/port} | {port-channel number}}  //Selects the port to configure.

Router(config-if)# cdp enable   //Enables CDP on the port.

Router(config-if)# no cdp enable  //Disable CDP on the port.

Dopo aver abilitato CDP sui vari apparati connessi tra loro è possible verificare (dalla console) cosa contiene la CDP cache:

Router# show cdp neighbors[type 1 slot/port] [detail]
// Displays information about neighbors. The display can be limited to
// neighbors on a specific interface and expanded to provide more detailed information.
c2610# show cdp neighbors
Capability Codes: R - Router, T - Trans Bridge, B - Source Route Bridge
S - Switch, H - Host, I - IGMP, r - Repeater

Device ID   Local Intrfce     Holdtme     Capability     Platform      Port ID
AP1120        Eth 0/0           128           T         AIR-AP1120      Fas 0
c2511         Ser 0/0           121           R           2511          Ser 1
c2520         Ser 0/3           124           R           2520          Ser 0

Realizzazione

Il programma non fa altro che istanziare un oggetto Topology (che si prende carico di tutto il lavoro di interrogazione e di output) e passargli la lista di indirizzi IP da interroga-re e la lista di community da usare.
Per ogni indirizzo IP, la classe Topology, tenta di usare tutte le community che gli sono state passate finchè non ne trova una con cui ottiene una risposta.
Le interrogazioni sono fatte mediante la classe CDPCache e in particolare tramite il me-todo retrieveInfo() che fa un walk sulla tabella concettuale cdpCacheTable (1.3.6.1.4.1.9.9.23.1.2.1) da cui estrae:

  • cdpCacheIfIndex: l’indice della tabella (insieme a cdpCacheDeviceIndex) che si riferisce all’interfaccia su cui è stato ricevuto l’annuncio. L’indice è poi utilizzato per trovare il nome dell’interfaccia interrogando la tabella ifTable nel MIB-2.
  • cdpCacheAddress: l’indirizzo su cui è in esecuzione SNMP sull’apparato con-nesso. Il tipo di questo MO è definito da una Textual-Convention definita nel mib CISCO-TC che in base al valore di cdpCacheAddressType definisce il modo in cui è rappresentato l’indirizzo. Qui viene assunto che l’indirizzo sia di tipo IP e quindi è rappresentato da 4 ottetti.
  • cdpCacheVersion: la versione del sistema operativo in esecuzione sull’apparato.
  • cdpCacheDeviceId: l’identificatore dell’apparato (l’hostname).
  • cdpCacheDevicePort: il nome dell’interfaccia da cui l’apparato remoto ha invia-to l’annuncio.
  • cdpCachePlatform: l’hardware remoto
  • cdpCacheDuplex: la modalità duplex dell’interfaccia remota

Per ogni agent interrogato l’applicazione crea dei sottografi di tipo cluster che contengo-no dei nodi. Il cluster rappresenta l’apparato ed è identificato dal DeviceId mentre i nodi rappresentano le porte. Dopo aver definito i vari sottografi vengono definiti i collegamen-ti tra le interfacce associando la coppia (DeviceId, InterfacciaLocale) in questo modo: “DeviceId locale-Interfaccia locale” — “DeviceId remoto-Interfaccia remota”.

Utilizo

Dopo aver decompresso il file, basta eseguire il comando make all’interno della directory.

nash ~ $ tar xvfz dedalo.tar.gz
nash ~ $ cd Dedalo
nash ~/dedalo $ make

Eseguendo il comando ./dedalo --h si può vedere l’help:

nash ~/Dedalo $ ./dedalo --h
Usage: ./dedalo <options>
        --w Enable device walk 
        --cf <file> Set community file
        --c <community> Set single community
        --af <file> Set address file
        --a <address> Set single address
        --h This help

E’ obbligatorio specificare almeno una community e un indirizzo da interrogare. Per im-postare la community si può specificare una singola community mediante il flag --c oppure una lista di community tramite il flag --cf community_file.
Analogamente per gli indirizzi, il flag --a permette di impostare un singolo indirizzo e il flag --af address_file permette di impostare la lista di indirizzi.
Il flag --w abilità la modalità walk. Questa modalità cerca di determinare gli indirizzi di device non specificati nella riga di comando o nel file della lista di indirizzi. Per farlo cerca all’interno delle cache CDP se esistono indirizzi sconosciuti.
I file devono contenere una community/indirizzo per riga.
Esempio:

nash ~/Dedalo $ ./dedalo --w --cf community_file --a 10.0.0.1 > output.dot 4

Il file risultante dall’esecuzione nella rete di test è il seguente:

strict graph G {
subgraph "cluster_c2610" { label = "DeviceId: c2610"; "c2610-Ethernet0/0" [ label = 
"Ethernet0/0" ]; "c2610-Serial0/0" [ label = "Serial0/0" ]; "c2610-Serial0/3" [ label = 
"Serial0/3" ]; }
subgraph "cluster_AP1120" { label = "DeviceId: AP1120"; "AP1120-FastEthernet0" [ label = 
"FastEthernet0" ]; }
subgraph "cluster_c2511" { label = "DeviceId: c2511"; "c2511-Serial1" [ label = 
"Serial1" ]; "c2511-Async1" [ label = "Async1" ]; "c2511-Async17" [ label = "Async17" ]; }
subgraph "cluster_c2520" { label = "DeviceId: c2520"; "c2520-Ethernet0" [ label 
= "Ethernet0" ]; "c2520-Serial0" [ label = "Serial0" ]; "c2520-Async4" [ label = "Async4" ]; }
subgraph "cluster_c2610-wifi" { label = "DeviceId: c2610-wifi"; "c2610-wifi-Ethernet0/0" [ label = "Ethernet0/0" ]; 
"c2610-wifi-Async65" [ label = 
"Async65" ]; }
subgraph "cluster_c2610-wifi" { label = "DeviceId: c2610-wifi"; "c2610-wifi-Ethernet0/0" [ label = "Ethernet0/0" ]; 
"c2610-wifi-Async65" [ label = "Async65" ]; }
"c2610-Ethernet0/0" -- "AP1120-FastEthernet0";
"c2610-Serial0/0" -- "c2511-Serial1";
"c2610-Serial0/3" -- "c2520-Serial0";
"AP1120-FastEthernet0" -- "c2610-Ethernet0/0";
"c2511-Serial1" -- "c2610-Serial0/0";
"c2511-Async1" -- "c2520-Async4";
"c2511-Async17" -- "c2610-wifi-Async65";
"c2520-Async4" -- "c2511-Async1";
"c2520-Ethernet0" -- "c2610-wifi-Ethernet0/0";
"c2520-Serial0" -- "c2610-Serial0/3";
"c2610-wifi-Ethernet0/0" -- "c2520-Ethernet0";
"c2610-wifi-Async65" -- "c2511-Async17";
"c2610-wifi-Ethernet0/0" -- "c2520-Ethernet0";
"c2610-wifi-Async65" -- "c2511-Async17";
}

L’output del programma, come già detto, è in formato dot. Per generare un’immagine jpeg della topologia, va utilizzando il programma chiamato a sua volta dot e contenuto nel pacchetto Graphviz:

nash ~/dedalo $ cat output.dot | dot -Tjpg -o rete.jpg

Schema Dedalo

Lavoro futuro

Nel progetto ci sono varie cose che possono essere migliorate. Ad esempio nel caso di reti composte da switch Cisco si può visualizzare, oltre a tutte le connessioni, anche lo spanning tree in modo da sapere dove sta passando il traffico in un determinato momento. Inoltre si potrebbe avere in output una pagina html invece che una semplice jpeg e avere dei link alle statistiche dei singoli apparati. Sarebbe infine utile visualizzare gli indirizzi IP di management.

Riferimenti

http://www.net-snmp.org/
http://www.graphviz.org/

Articoli correlati

Noleggia una Tesla per il tuo evento ICT!

Categorie