Dedalo: disegno automatico della tipologia di una rete Cisco

venerdì 8 febbraio, 2008
Autore: Andrea Parrella
gravatarN/A
Inserito in: Cisco, Docs, Italiano
| 0 commenti

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 mediante l’utilizzo di query . L’utilizzo esclusivo di apparati è dovuto al fatto che questi imple-mentano il protocollo che è incompatibile con periferiche di altri produttori. Inoltre anche con apparati 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 , 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

sta per Discovery Protocol ed è un protocollo che viaggia sopra il layer 2 (Da-ta Link) ed è implementato su tutti gli apparati 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 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 .

La configurazione di

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

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

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

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

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

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

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

Router# show  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  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 sull’apparato con-nesso. Il tipo di questo MO è definito da una Textual-Convention definita nel mib -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 .tar.gz
nash ~ $ cd 
nash ~/ $ make

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

nash ~/ $ ./ --h
Usage: ./ <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 se esistono indirizzi sconosciuti.
I file devono contenere una community/indirizzo per riga.
Esempio:

nash ~/ $ ./ --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 ~/ $ 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 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.cisco.com/univercd/cc/td/doc/product/lan/cat6000/122sx/swcg/cdp.htm
http://www.net-snmp.org/
http://www.graphviz.org/

Condividi/segnala rapidamente:
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks
  • LinkedIn
  • Slashdot
  • YahooMyWeb
  • Live
  • Socialogs
  • SphereIt
  • Wists
  • FriendFeed
  • Twitter

Lascia un Commento

Occorre aver fatto il login per inviare un commento