2000px-Cisco_logo.svg

Uno sguardo a CDP

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:

  1. SNMPv2-SMI
  2. SNMPv2-TC
  3. SNMPv2-CONF
  4. SNMPv2-MIB
  5. CISCO-SMI
  6. IANAifType-MIB
  7. IF-MIB
  8. CISCO-TC
  9. INET-ADDRESS-MIB
  10. SNMP-FRAMEWORK-MIB
  11. RMON-MIB
  12. CISCO-VTP-MIB
  13. RFC1155-SMI
  14. RFC-1212
  15. SNMPv2-TC-v1
  16. 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)