31 Jul 2007

Sobre SNMP

SNMP es un protocolo de red que permite obtener una gran cantidad de información del dispositivo que lo tenga activo. Actualmente cualquier dispositivo con una interfaz de red cuenta con la posibilidad de activar un demonio SNMP que permita al administrador acceder a la información del mismo e incluso modificarla de forma remota.
Para los sistemas Linux basta con hacer:

snmpwalk -Os -v2c -c public ip_del_dispositivo > ip_del_dispositivo.walk

Es conveniente redirigir la salida a un fichero por la enorme cantidad de información que se recibe.

Como cosa curiosa he comprobado que obtengo más información si empleo un punto como OID. Suponía que snmpwalk sin OID devolvería todo el árbol completo ¿?.

snmpwalk -Os -v2c -c public ip_del_dispositivo . > ip_del_dispositivo.walk

Bajo Windows se puede emplear un equivalente mediante PHP. Una vez bajado y descomprimido en
C:\PHP
Hay que modificar el php.ini:
- Descomentar php_snmp.dll
- Descomentar php_sockets.dll
- Hacer extensión_dir=”c:\php\ext”
Añadir en variables de entorno de sistema el path: c:\php
Añadir en variables de entorno de sistema: mibdirs como c:\php\extras\mibs

En el Notepad creamos y guardamos como snmpwalk_report.php lo siguiente:

#!/usr/bin/php
<?php
$string = "public";
$host = "$argv[1]";
check_snmp($host);
spitinfo($host);

function check_snmp($box) //primero comprueba que el host tiene
//activo snmp

{
$string="public";
$infocheck = @snmpget("$box", "$string", "system.sysDescr.0");
if(! $infocheck)
{
die("SNMP no esta activo en el host: $box\n");
}
else
{
return $infocheck;
}
}
function spitinfo($host)//obtiene y muestra datos de snmp.
{
$string = "public";
$hostinfo = @snmpget("$host","$string","system.sysDescr.0");
list ($k)=array(split(" ", $hostinfo));
$os = $k[0];
$hostname = @snmpget("$host","$string","system.sysName.0");
$user = @snmpget("$host","$string","system.sysContact.0");
$location = @snmpget("$host","$string","system.sysLocation.0");
$macaddr = @snmpget("$host","$string","interfaces.ifTable.ifEntry.ifPhysAddress.2");
$ethstatus = @snmpget("$host","$string","interfaces.ifTable.ifEntry.ifOperStatus.2");
$ipfwd = @snmpget("$host","$string","ip.ipForwarding.0");
$ipaddr = @gethostbyname("$host");
$info=array("Hostname:"=>"$hostname","Contact:"=>"$user",
"Location:"=>"$location","OS:"=>"$os","MAC Address:"=>
"$macaddr","IP Address:"=>"$ipaddr","Network Status:"=>
"$ethstatus",
"Forwarding:"=>"$ipfwd");
echo "\nTCP Port Summary\n";
tabdata($info);
print "\nTCP Port Summary\n";
snmp_portscan($hostname);
echo "\nOtra forma\n";
$a = snmpwalk("127.0.0.1", "public", "system");
for ($i=0; $i$value)
{
if($label){
print "$label\t";
}else{
print "Not Available\t";
}
if($value){
print "$value\n";
}else{
print "Not Available\n";
}
}
}
function snmp_portscan($target)
{
$listen_ports=snmpwalk("$target","public",".1.3.6.1.2.1.6.13.1.3.0.0.0.0");
foreach($listen_ports as $key=>$value)
{
print "TCP Port $value (" . getservbyport($value, 'tcp') . ") listening \n";
}
}?>

Solo hay que hacer en linea de comandos >php snmpwalk_report.php ip_remoto
En la salida hay varios ejemplos de cómo extraer la información, algunos redundantes, pero sirven como ejemplo y modelo.

Como programas gratuitos podemos usar los
Getif en http://www.wtcs.org/snmp4tpc/getif.htm

Y el impagable
Dude en http://wiki.mikrotik.com/wiki/Dude_windows_installation