Looking Glass

Looking Glass

Adresse IP :

   

1 – Fonctions disponibles

1.1 – Ping

Cette fonction vous permet de tester la présence de l’adresse IP ou de l’hôte que vous avez sélectionné. Pour cela, un paquet de type ICMP sera envoyé et la réponse vous indiquera le temps d’allez retour. Ceci est identique à l’utilisation de l’utilitaire Ping de votre station de travail. Le seul avantage est que vous pouvez l’émettre à partir du routeur Cisco FrameIP situé sur un autre adressage Internet que vous.

1.2 – Traceroute

Traceroute, comme la fonction Ping permet de tester la présence de l’adresse IP ou de l’hôte que vous avez sélectionné. Il indiquera en plus, par quel routeur il passe pour jour joindre la destination. Pour cela, il envoi un paquet de type ICMP avec un TTL de 1 en attendant le message de retour du premier routeur. Puis il recommence avec un Ttl positionné à 2 et ainsi de suite jusqu’à la réponse de la destination finale. Cette fonction vous indiquera alors le temps de réponse, allez retour, pour chaque saut effectué.

1.3 – Show proc cpu hist

Cette fonction, présente uniquement pour le fun, vous indiquera l’état du processeur du routeur qui effectue les fonctions précédentes.

1.4 – Show mem stat hist

Cette fonction, présente uniquement pour le fun, vous indiquera l’état de la mémoire du routeur qui effectue les fonctions précédentes.

2 – Prise de main Cisco

Le principe est basé sur la prise distante de notre routeur Cisco via un script Php. Pour cela, le script effectue un telnet routeur.frameip.com 23. Puis indique le password et entre la commande désiré.

lookingglass prise en main cisco

  • 1 – Exécution du script php – Vous surfez sur une page web du site www.FrameIP.com et vous actionnez un formulaire Html qui enclenche l’exécution sur le serveur d’un script Php.
  • 2 – Demande d’exécution – Le précèdent script Php ouvre, via la commande fsockopen, une session Telnet sur notre routeur ISP situé à un autre endroit d’Internet. Puis passe les différentes commandes correspondantes à votre sélection dans le précédent formulaire Html.
  • 3 – Ping à destination de vous ou autre – Le routeur Cisco exécute votre commande comme le Ping, le Traceroute et etc.

3 – Suivi du développement

3.1 – Problème restant

  • La commande flush() ne permet pas d’avoir un affichage temps réel.

3.2 – RoadMap

  • Proposer le choix du nombre de Ping à effectuer.
  • Proposer le temps du Timeout.

3.3 – Suivi du projet

  • V1.2
    Protection contre l’utilisation des adresses privées grâce à la fonction est_ce_une_ip_privee().
    Affectation du timeout à deux secondes sur l’ouverture de la session TCP. Via la fonction fsockopen($routeur_ip,23,&$errno,&$errstr,2);
    Indication au routeur d’envoyer toute les données sans — more — via la commande « terminal length 0 ».
    Ajout de la commande sh proc cpu hist.
    Ajout de la commande sh mem stat hist.
  • V1.1
    Création de la fonction réception.
    Création du formulaire html correspondant.
    Solution pour la réception, je passe la socket en mode non bloquant et je lance la réception permanente jusqu’à la réception du prompt indiquant la fin de l’exécution de la commande.
  • V1.0
    Initiation du projet
    Ouverture de la connexion sur le routeur Cisco via fsockopen().
    Passage du password via fputs().
    Problème de réception avec : while (!feof($fp)) echo fgets($fp, 128); Cela fonctionne bien sauf avec le routeur Cisco oùu le eof n’est pas detecté.

4 – Code source

<?php

// ********************************************
// Nom du script : lookingglass.php
// Auteur : _SebF@frameIP.com.pas.de.spam
// Date de création : 15 mars 2004
// Version : 1.2
// Licence : Ce script est libre de toute utilisation.
//           La seule condition existante est de faire référence au site www.frameip.com afin de respecter le travail d'autrui.
// ********************************************
 
// ********************************************
// Affichage de l'entête html
// ********************************************
echo
      '
      <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 
      <html>
 
      <head>
 
      <LINK REL="StyleSheet" HREF="../style.css" TYPE="text/css">
 
      <title>FrameIP, Pour ceux qui aiment IP - Script Lookingglass</title>
 
      <META http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
      <META NAME="AUTHOR" CONTENT="www.frameip.com">
      <META NAME="COPYRIGHT" CONTENT="Copyright (c) 2003 by framip">
      <META NAME="KEYWORDS" CONTENT="lookingglass, ping, tracert, traceroute, icmp, cisco, bgp, route, show, enable, en, routeur, temps de reponse, test, proc, cpu, mem, hist, conf t, terminal, length">
      <META NAME="DESCRIPTION" CONTENT="Frameip, pour ceux qui aiment IP - Script Lookingglass">
      <META NAME="ROBOTS" CONTENT="INDEX, FOLLOW">
      <META NAME="REVISIT-AFTER" CONTENT="1 DAYS">
      <META NAME="RATING" CONTENT="GENERAL">
      <META NAME="GENERATOR" CONTENT="powered by frameip.com - webmaster@frameip.com">
      
      </head>
 
      <body>
      ';
 
// *****************************
// Récupération des champs
// *****************************
$ping_ip_demande=$_POST['ipaddress'];
$choix_de_la_commande=$_POST['valeur_bouton'];
 
// *****************************
// Création de la commande à partir du bouton selectionné
// *****************************
if ($choix_de_la_commande=="bouton_ping")
      $commande_cisco="ping ".$ping_ip_demande."\n";
else if ($choix_de_la_commande=="bouton_traceroute")
      $commande_cisco="traceroute ".$ping_ip_demande."\n";
else if ($choix_de_la_commande=="bouton_cpu")
      $commande_cisco="sh proc cpu hist\n";
else if ($choix_de_la_commande=="bouton_mem")
      $commande_cisco="sh mem stat hist\n";
else
      $commande_cisco="\n";
 
// **********************************************
// Enregistrement du compteur
// **********************************************
include '../variables.php';
$info_compteur1=$ping_ip_demande;
$info_compteur2=$choix_de_la_commande;
$info_compteur3=str_replace("\n","",$commande_cisco); // Suppression du /n pour ne pas perturber le fichier compteur
$specifiez_le_nom_du_compteur="lookingglass.php";
include '../compteur.php';
 
// *****************************
// Initiation des variables
// *****************************
$routeur_ip="routeur.frameip.com";
$prompt_cisco="Routeur__SebF>";
 
// *****************************
// Interdie la saisie d'une ip privée
// *****************************
if (est_ce_une_ip_privee($ping_ip_demande)==true)
      lookingglass_erreur(1);
 
// *****************************
// Ouverture de la session TCP
// *****************************
$id_de_la_socket=@fsockopen($routeur_ip,23,&$errno,&$errstr,2);
 
// *****************************
// Valide si l'ouverture de session TCP a eu lieu
// *****************************
if($id_de_la_socket)
      {
      // ********************************************
      // Présentation des résultats
      // ********************************************
      echo '
            <p align="center">
                  <font size="4" color="#008000">
                        <b>
                             Lookingglass
                        </b>
                  </font>
            </p>
            ';
 
      // *****************************
      // Configuration du timeout maximum à 17 pour être à -1 de celui de l'hébergeur
      // *****************************
      @socket_set_timeout($id_de_la_socket,17);
 
      // *****************************
      // Passage de la socket en mode non bloquant
      // *****************************
      @stream_set_blocking($id_de_la_socket,false);
 
      // *****************************
      // Reception
      // *****************************
      reception($id_de_la_socket,"Password: ",false);
 
      // *****************************
      // Envoi du password
      // *****************************
      fputs ($id_de_la_socket, "Jisudhey56\n");
 
      // *****************************
      // Reception
      // *****************************
      reception($id_de_la_socket,$prompt_cisco,false);
 
      // *****************************
      // Indication au routeur que le buffer de reception est illimité
      // *****************************
      fputs ($id_de_la_socket, "terminal length 0\n");
 
      // *****************************
      // Reception
      // *****************************
      reception($id_de_la_socket,$prompt_cisco,false);
 
      // *****************************
      // Affichage du prompt
      // *****************************
      echo $prompt_cisco;
 
      // *****************************
      // Envoi de la commande
      // *****************************
      fputs ($id_de_la_socket, $commande_cisco);
 
      // *****************************
      // Reception
      // *****************************
      reception($id_de_la_socket,$prompt_cisco,true);
 
      // ********************************************
      // Fin du script général
      // ********************************************
      fin_du_script();
      }
else
      lookingglass_erreur(2);
 
function reception($id_de_la_socket,$chaine_attendue,$affichage)
  // Argument 1 : $id_de_la_socket est de type SOCKET. Il représente l'id de la socket à analyser.
  // Argument 2 : $chaine_attendue est de type char xx[xx]. Il représente la chaine de caractère indiquant la fin de la reception.
  // Argument 3 : $affichage est de type bool. Il indique si l'echo des caractères reçu doit être affiché.
      {
      // *****************************
      // Initiation des variables
      // *****************************
      $chaine_recue="";
      $tempo="";
      $condition_de_sortie=0;
 
      // *****************************
      // Boucle de reception
      // *****************************
      while($condition_de_sortie==0)
            {
            // *****************************
            // Valide si la chaine attendue est réceptionnée ou la fin du tampon
            // *****************************
            if (strpos($chaine_recue,$chaine_attendue)!=false||@feof($id_de_la_socket))
                  $condition_de_sortie=1;
 
            // *****************************
            // Reception des données de 1280 octets, mais peu importe dû au mode non bloquant
            // *****************************
            $tempo=@fgets($id_de_la_socket,1024);
 
            // *****************************
            // Force l'affiche
            // *****************************
            flush();
 
            // *****************************
            // Remplace le code de retour charriot pour correspondre à la norme html
            // *****************************
            $tempo=str_replace("\n","<br>",$tempo);
 
            // *****************************
            // Affichage des données recues
            // *****************************
            if ($affichage==true)
                  echo $tempo;
 
            // *****************************
            // Concatenation des donnée recue afin de pourvoir comparer par rapport à la chaine attendue de sortie
            // *****************************
            $chaine_recue.=$tempo;
            }
      }
 
function est_ce_une_ip_privee($adresse_ip)
  // Argument 1 : $adresse_ip est de type char xx[nn]. Il représente l'adresse IP à comparer.
  // Return     : La valeur retournée est de type bool. Il représente true si l'IP est de privée.
      {
      // ********************************************
      // Validation que la variable $adresse_ip est bien une IP
      // ********************************************
      if (ip2long($adresse_ip)==-1)
            return (false);         // !!!!! Attention je concidère les IP non valide comme une ip non privée !!!!!
 
      // ********************************************
      // Vérification si l'IP est compris dans le network 10/8
      // ********************************************
      if ( (ip2long($adresse_ip)>=ip2long("10.0.0.0")) && (ip2long($adresse_ip)<=ip2long("10.255.255.255")) )
            return (true);
 
      // ********************************************
      // Vérification si l'IP est compris dans le network 192.168/16
      // ********************************************
      if ( (ip2long($adresse_ip)>=ip2long("192.168.0.0")) && (ip2long($adresse_ip)<=ip2long("192.168.255.255")) )
            return (true);
 
      // ********************************************
      // Vérification si l'IP est compris dans le network 172.16/19
      // ********************************************
      if ( (ip2long($adresse_ip)>=ip2long("172.16.0.0")) && (ip2long($adresse_ip)<=ip2long("172.31.255.255")) )
            return (true);
 
      return (false);
      }
 
// ********************************************
// Fonction d'affichage de l'erreur de saisie
// ********************************************
function lookingglass_erreur($erreur) // $erreur représente le numéro d'erreur.
      {
      // ********************************************
      // Affichage de titre
      // ********************************************
      echo
            '
            <p align="center">
                  <b>
                        <font size="5" color="#008000">
                             Erreur
                        </font>
                  </b>
            </p>
            ';
 
      // ********************************************
      // Affichage de l'erreur
      // ********************************************
      echo
            '
            <p>
            ';
 
      // ********************************************
      // Message personnalisé
      // ********************************************
      if ($erreur==1)
            echo 'Désolé, pour des raisons de sécurité, l\'équipe FrameIP ne peut pas vous permettre d\'utiliser les adresses privées.';
      elseif ($erreur==2)
            echo 'Désolé, impossible d\'ouvrir la session TCP à destination du routeur.';
      
      // ********************************************
      // Fin du script général
      // ********************************************
      fin_du_script();
      }
 
function fin_du_script()
      {
      // ********************************************
      // Affiche de l'Url
      // ********************************************
      echo '
            <p align="right">
                  <a target="_blank" href="http://www.frameip.com">
                        www.frameip.com
                  </a>
            </p>
            ';
 
      // ********************************************
      // Fin de la page Html
      // ********************************************
      echo
            '
            </body>
 
            </html>
            ';
 
      // ********************************************
      // Fin du script général
      // ********************************************
      exit(0);
      }
 
?>

5 – Suivi du document

Création et suivi de la documentation par _SebF

6 – Discussion autour du looking Glass

Vous pouvez poser toutes vos questions, faire part de vos remarques et partager vos expériences à propos du looking Glass. Pour cela, n’hésitez pas à laisser un commentaire ci-dessous :