¿Cómo escanear una LAN en busca de hosts en vivo usando PHP y SNMP?

Me gustaría tener una secuencia de comandos rápida que enumere todos los hosts activos en una LAN y estoy un poco perdido. De otras publicaciones, pensé que esto se puede hacer de manera más efectiva sondeando el servidor DHCP (en mi caso, un enrutador Lancom) usando SNMP.

Sin embargo, no estoy familiarizado con los comandos SNMP en PHP. ¿Es snmpwalk() la función correcta? ¿Puedo obtener snmpwalk() o cualquier otra función de php para devolver una matriz que contenga una lista de todos los hosts en vivo?

preguntado el 30 de junio de 12 a las 18:06

2 Respuestas

Encontrar anfitriones en vivo

La el albergue mejor calificado manera de asegurarse de obtener todos los anfitriones en vivo es con un ping barrido de la subred, usando una herramienta como nmap. Dado que los hosts de Windows no responden a los pings de forma predeterminada, también incluye un breve análisis de puertos TCP. La sintaxis de la CLI de Linux es nmap -sP 192.0.2.0/24 (sustituya su subred en lugar de 192.0.2.0/24).

consulta SNMP

No creo que SNMP realmente resuelva su problema, pero incluiré lo que pueda para ayudarlo... Cuando use el Extensión PHP SNMP, primero debe conocer el OID de la tabla con la información correcta. los LANCOM-1711-MIB es una posibilidad, pero es difícil saberlo con certeza; debe ponerse en contacto con el soporte de LANCOM si no sabe qué SNMP OID sondear.

Simplemente vamos a suponer que staDhcpLanIpadd (OID: 1.3.6.1.4.1.2356.500.2.1712.1.32.21.1.2) es el OID que necesita. En este punto, Ud. snmpwalk el enrutador que usa SNMPv2c y la comunidad SNMP que configuró en él. Presumiblemente, este OID le brinda la lista de direcciones DHCP emitidas; sin embargo, eso no significa que estén activos en el momento en que sondee el enrutador (alguien podría haber desconectado el cable o haberlos apagado).

Respondido el 30 de junio de 12 a las 22:06

gracias mike Se agradecen sus explicaciones muy claras y bien estructuradas. Sin embargo, he mirado el MIB y todavía me estoy rascando la cabeza. Sería un golpe de suerte para mí si alguien tuviera un fragmento de código preconfigurado que permitiera extraer la tabla BOOTP del enrutador Lancom... - AAG

Así que escribí una secuencia de comandos que sondea el enrutador Lancom y extrae la tabla DHCP/BOOTP. Puede ser utilizado por todos aquellos que necesitan monitorear dichos enrutadores y, por lo tanto, lo comparto. También genera una bonita tabla HTML; la función BetterTable() se puede utilizar en cualquier matriz 2D.

Deberá configurar IP, ID de usuario y pwd (las primeras tres variables) para usar el script en su enrutador.

    <?php

    $router_ip = '';
    $username = '';
    $password = '';
    $port = 23;
    $timeout = 10;

    $connection = fsockopen($router_ip, $port, $errno, $errstr, $timeout);

    if(!$connection){
     echo "Connection failed\n";
     exit();
    } else {

     fputs($connection, "$username\r\n");
     fputs($connection, "$password\r\n");
     fputs($connection, "cd setup/dhcp/dhcp-table \r\n");
     fputs($connection, "dir \r\n");
     fputs($connection, " ");

     $j = 0;
     while ($j < 16) {
      fgets($connection);
      $j++;
     }
     stream_set_timeout($connection, 2);
     $timeoutCount = 0;
     $content ='';
     $DhcpArray = '';
     (int) $index =0;

    $DhcpFile = "C:\IP-Symcon\webfront\user\images\LancomDhcp.txt";
    $fh = fopen($DhcpFile, 'w') or die("can't open file");

    //$DhcpArray[0] = array ('IP-Address', 'MAC-Address', 'Timeout', 'Hostname', 'Type', 'LAN-Ifc', 'Ethernet-Port', 'VLAN-ID', 'Network-Name');

     while (!feof($connection)){

      $content = fgets($connection);
      $content = str_replace("\r", '', $content);
      $content = str_replace("\n", "", $content);
      $lineArray = explode(' ', $content); 
      if (isValidIp($lineArray [0]))
          { 
          $DhcpArray[$index]['IP-Address'] = substr ($content, 0,17);
          $DhcpArray[$index]['MAC-Address'] = substr ($content, 17,32-18);
          $DhcpArray[$index]['Timeout'] = substr ($content, 31,41-32);
          $DhcpArray[$index]['Hostname'] = substr ($content, 40,108-41);
          $DhcpArray[$index]['Type'] = substr ($content, 107,125-108);
          $DhcpArray[$index]['LAN-Ifc'] = substr ($content, 124,137-125);
          $DhcpArray[$index]['Ethernet-Port'] = substr ($content, 136,152-137);
          $DhcpArray[$index]['VLAN-ID'] = substr ($content, 151,161-152);
          $DhcpArray[$index]['Network-Name'] = substr ($content, 160);
          fwrite($fh, $content);
          $index +=1;
          }

      # If the router say "press space for more", send space char:
      if (preg_match('/MORE/', $content) ){ // IF current line contain --More-- expression,
       fputs ($connection, " "); // sending space char for next part of output.
      } # The "more" controlling part complated.

      $info = stream_get_meta_data($connection);
      if ($info['timed_out']) { // If timeout of connection info has got a value, the router not returning a output.
       $timeoutCount++; // We want to count, how many times repeating.
      }
      if ($timeoutCount >2){ // If repeating more than 2 times,
       break;   // the connection terminating..
      }
     }
     $content = substr($content,410);

     BetterTable($DhcpArray);




    fclose($fh);

    }
    echo "End.\r\n";

    //--------------------------------------------------------------------

    function isValidIp($ip)
    {/* PCRE Pattern written by Junaid Atari */
        return !preg_match ( '/^([1-9]\d|1\d{0,2}|2[0-5]{2})\.('.
                             '(0|1?\d{0,2}|2[0-5]{2})\.){2}(0|1?'.
                             '\d{0,2}|2[0-5]{2})(\:\d{2,4})?$/',
                             (string) $ip )
                ? false
                : true;
    }

    //--------------------------------------------------------------

    function BetterTable($twoDimArray)
    {
    $i = 0;
    echo "<table>
            <table class='BetterTable' border='1'>";

    echo "<tr>";
    echo '<td>Line #
    </td>';
    foreach ($twoDimArray[0] as  $fieldName => $fieldValue)
        {
            echo '<td>'.$fieldName. '</td>';
        }echo '</tr>';
    $i = 0;

    foreach ($twoDimArray as $rowName => $rowValue) 
    {
            if ($i%2 == 0) 
                Echo "<tr bgcolor=\"#d0d0d0\" >";
            else 
                Echo "<tr bgcolor=\"#eeeeee\">";
        $fields = count($twoDimArray[$i]);
        $y = 0;
        echo '<td>'.$i. '</td>';
        foreach ($rowValue as  $fieldName => $fieldValue)
        {
            echo '<td>'.$fieldValue. '</td>';
            $y = $y + 1;
        }
        echo '</tr>';
        $i = $i + 1;
    }


    echo '</table>';
    }


    ?>

Respondido 08 Jul 12, 16:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.