Ho recentemente ricercato soluzioni per reperire informazioni sulla topologia di una rete e tra le varie tecnologie che ho analizzato mi sono soffermato sulle possibilità offerte dal protocollo CDP di Cisco.
CDP è un protocollo proprietario Cisco che lavora a livello 2. Ogni dispositivo di rete conforme a questo protocollo (ossia quasi tutti i dispositivi Cisco) invia a tempo (di base 60 secondi) pacchetti conformi a questo protocollo ad un indirizzo di multicast definito. Tutti gli altri apparati nel medesimo dominio di broadcast raccolgono questi pacchetto/annuncio e memorizzano le informazioni ivi contenute in una memoria cache (cdp cache).
Le informazioni indicano versione di IOS, ruolo, porte, hostname, e altro ancora, costruendo per ciascun dispositivo una conoscenza su quale altro apparato ha nelle vicinanze (neighbours).
La cache è interrogabile via comandi IOS (show cdp…
) oppure remotamente via SNMP.
Per costruire una topologia della rete (che vada anche oltre l’analisi di livello 2) occorre quindi interrogare un qualche oggetto (noto) capace di CDP e da questo ricorsivamente tutti gli oggetti confinanti rilevabili (non noti a priori). In questo modo una volta rilevato un router potremo anche superare la barriera del rilevamento a livello 2 (tipico di un nmap, ad esempio). [Cfr Rif. 1 pag 4]
Per eseguire queste interrogazioni da remoto occorre disporre di un altro protocollo, lo SNMP.
In particolare per interrogare un dispositivo Cisco con CDP attivo occorre compilare i seguenti MIBs:
- SNMPv2-SMI
- SNMPv2-TC
- SNMPv2-CONF
- SNMPv2-MIB
- CISCO-SMI
- IANAifType-MIB
- IF-MIB
- CISCO-TC
- INET-ADDRESS-MIB
- SNMP-FRAMEWORK-MIB
- RMON-MIB
- CISCO-VTP-MIB
- RFC1155-SMI
- RFC-1212
- SNMPv2-TC-v1
- CISCO-CDP-MIB
Disponibili sul sito Cisco.
Nello specifico potremmo interrogare i seguenti oggetti:
- cdpGlobal
- cdpInterface
- cdpCache
Pur potendo eseguire il tutto a mano (o in maniera batch) mediante il comando snmpwalk (o altro strumento di navigazione tra rami SNMP) ho cercato una soluzione integrabile in una interfaccia web.
Così ho cercato e trovato un framework in PHP molto interessante che offre una soluzione per interrogare ricorsivamente dispositivi CDP (oltre a tutta un’altra serie di capacità che meritano di essere approfondite).
Si tratta del Framework OpenSolutions/OSS_SNMP. E’ estremamente estensibile e è già compatibile con tecnologie Cisco, HP, Foundry/Brocade, Asterisk, Extreme, MRV.
Richiede PHP >5.4.
Senza entrare in dettagli vi fornisco un programma demo che utilizza tale framework (è necessario che tutti i dispositivi di rete rispondano in SNMPv2 per la stessa community) .
Fornendo a linea di comando (PHP-CLI) l’indirizzo di un dispositivi noto interrogabile (switch, router, ecc) e la community restituisce (ovvero stampa a console) un array con la topologia individuata.
#! /usr/bin/php <?php // This is an example script for OSS_SNMP Cisco CDP MIBs if( count( $argv ) != 3 ) { echo "Missing argument\n"; echo "USAGE: <hostname/IP Address> <community>\n"; exit( 1 ); } require_once( dirname( __FILE__ ) . '/../OSS_SNMP/SNMP.php' ); $router = new \OSS_SNMP\SNMP( $argv[1], $argv[2] ); // Neighbours del route dato print_r( $router->useCisco_CDP()->neighbours(true) ); // Interroga ricorsivamente i router periferici print_r( $router->useCisco_CDP()->crawl() ); echo "\n\n"; exit( 0 );
Vedremo in un prossimo articolo come consentire ad un server Linux di diventare un oggetto di rete che si annuncia via CDP e sia pertanto visibile come oggetto confinante ai dispositivi Cisco.
Riferimenti
1 “Cisco Discovery Protocol Configuration Guide, Cisco IOS Release 15M&T” 2014 (cdp-15-mt-book.pdf)