creative commons
Perles de Mongueurs (28)
icone programmation
Signature :
GNU/Linux Magazine
Sommaire de l'article :
Depuis le numéro 59, les Mongueurs de Perl vous proposent tous les mois de découvrir les scripts jetables qu’ils ont pu coder ou découvrir dans leur utilisation quotidienne de Perl. Bref, des choses trop courtes pour en faire un article, mais suffisament intéressantes pour mériter d’être publiées. Ce sont les perles de Mongueurs

Un scanneur de ports à pas cher

J’utilise un serveur Linux pour quelques développements internes à mon travail. Il s’agit d’un PC de récupération, sans écran ni clavier, posé sous un bureau, auquel je me connecte par SSH depuis un portable Windows. Il arrive trop souvent hélas que mes collègues l’éteignent le soir en partant. Ou alors, ce sont les personnes chargées du ménage qui le débranchent pour brancher l’aspirateur ! ;-) Le serveur obtenant son adresse IP par DHCP, celle-ci peut changer au démarrage et il est parfois un peu laborieux de chercher un clavier et un écran, juste pour regarder le résultat de la commande ifconfig. Heureusement, c’est la seule machine du sous-réseau qui fasse tourner le service SSH. J’ai donc programmé un scanneur de ports minimal qui cherche les machines connectées au réseau, et tente de se connecter au service SSH.
    #!/usr/bin/perl
    use strict;
    use warnings;
    use Net::Ping;
    use IO::Socket::INET;

    $|++;
    my $base = shift || ‘192.168.9’;
    # délai d’attente sur le ping : 0.1 seconde (réseau local !)
    my $p = Net::Ping->new( ‘icmp’, 0.1 );

    # boucle sur toute la plage d’adresse
    for my $h ( 1 .. 254 ) {
        print “.”;
        # d’abord on essaye un ping
        my $host = "$base.$h";
        if ( $p->ping($host) ) {
            print "\r$host: alive\n";

            # si ça marche, on tente une connexion port 22
            my $s = IO::Socket::INET->new(
                PeerAddr => $host,
                PeerPort => 22,
                Timeout  => 0.1,     # en secondes
            );
            next if !( $s && $s->connected() );
            print "    " . <$s> . "\n";
            close $s;
        }
    }
$|++ permet de passer en mode sans temporisation (ou autoflush), afin d’afficher des points pour indiquer la progression du script. Et voici le résultat :
    192.168.9.1: alive
    192.168.9.3: alive
    192.168.9.5: alive
    192.168.9.6: alive
    192.168.9.7: alive
    192.168.9.8: alive
    192.168.9.9: alive
        SSH-2.0-OpenSSH_4.3p2 Debian-5

    192.168.9.10: alive
    192.168.9.20: alive
    192.168.9.21: alive
    192.168.9.25: alive
    192.168.9.42: alive
    192.168.9.44: alive
    192.168.9.46: alive
    192.168.9.103: alive.......................................
    192.168.9.104: alive
    192.168.9.106: alive
    192.168.9.109: alive
    ............................
Notez que les valeurs de délai de garde (timeout) sont très faibles (0.1 seconde), car je m’intéresse seulement aux machines du réseau local. Ce matin encore, après que ma connexion a échoué, j’ai rallumé le serveur et lancé le script sur mon portable pendant que la cafetière chauffait. Le scanneur a fait le tour du réseau en 40 secondes, mais j’ai eu ma réponse en 7 secondes. Même pas le temps de profiter de mon café ! (Avec un délai de garde d’une seconde, il faut environ 4 minutes 30 pour faire le tour du réseau.) Il est évidemment très simple d’étendre ce scanneur pour rechercher d’autres ports, tout simplement en ajoutant une boucle de connexion sur les ports souhaités, juste après le ping :
    # si ça marche, on tente une connexion sur chaque port
    for my $port (@ports) {

        my $s = IO::Socket::INET->new(
            PeerAddr => $host,
            PeerPort => $port,
            Timeout  => 1,       # en secondes
        );
        next if !( $s && $s->connected() );
        print “    port $port\n”;
        close $s;
    }
On obtiendra alors des résultats comme ci-après (ici @ports contient les valeurs 22, 23 et 80) :
    192.168.9.1: alive
        port 23
    192.168.9.3: alive
    192.168.9.5: alive
    192.168.9.6: alive
    192.168.9.7: alive
        port 80
    192.168.9.8: alive
    192.168.9.9: alive
        port 22
        port 80
    192.168.9.10: alive
    192.168.9.20: alive
    192.168.9.21: alive
        port 80
    192.168.9.25: alive
    192.168.9.42: alive
        port 23
L’avantage d’un tel script est qu’il ne nécessite aucun droit administratif sur la machine pour pouvoir être installé et qu’il est même suffisamment simple pour pouvoir être écrit de mémoire. Ceci dit, si vous voulez vraiment vous livrer à un scan exhaustif du réseau, je vous conseille d’utiliser nmap. Et d’être discret, car il est fort probable que votre administrateur réseau n’appréciera pas votre curiosité. :-)

À vous !

Envoyez vos perles à perles@mongueurs.net. Elles seront peut-être publiées dans un prochain numéro de Linux Magazine.
Il y a : 0 commentaire(s)

Donnez votre avis

Vous devez avoir ouvert une session pour écrire un commentaire.

Brèves
Édito : Linux Pratique Essentiel N°24
Édito : Linux Pratique HS N°23
Édito : GNU/Linux Magazine 146
Édito : GNU/Linux Magazine HS N°58
Édito : Open Silicium N°5
Communication
Linux Pratique HS 23 – Communiqué de presse
Linux Pratique Essentiel N°24 – Communiqué de presse
Gnu/Linux Magazine sponsor et partenaire de PROLOGIN
Linux Essentiel partenaire des Rencontres du Libre de Lion sur Mer (Normandie)
GNU/Linux Magazine HS 58 – Communiqué de presse
prochainement moteur de recherches des articles
 
:
:
Jours heures minutes secondes
En kiosque
Le tout nouveau Linux Pratique Essentiel est disponible dès maintenant chez votre marchand de journaux et sur notre site...

Lire la suite...

Le tout nouveau Linux Pratique est disponible dès maintenant chez votre marchand de journaux et sur notre site...

Lire la suite...

Le tout nouveau GNU/Linux Magazine est disponible dès maintenant chez votre marchand de journaux et sur notre site...

Lire la suite...

Le tout nouveau GNU/Linux Magazine HS est disponible dès maintenant chez votre marchand de journaux et sur notre site...

Lire la suite...

Le tout nouveau Open Silicium est disponible dès maintenant chez votre marchand de journaux et sur notre site...

Lire la suite...

Le tout nouveau Linux Pratique est disponible dès maintenant chez votre marchand de journaux et sur notre site...

Lire la suite...

Le tout nouveau Misc est disponible dès maintenant chez votre marchand de journaux et sur notre site...

Lire la suite...

Le tout nouveau GNU/Linux Magazine est disponible dès maintenant chez votre marchand de journaux et sur notre site...

Lire la suite...