27 mai 2007

Outil perl pour tester l'accès à un port IP

Ceci est particulièrement utile (quand le réseau possède des firewall / routeurs) pour voir si un port est accessible ou s'il est bloqué ... Merci François pour cet utilitaire.

  1. Copier le code suivant sur la machine Unix ciblée (par exemple sous le nom TestPortIP.pl).
  2. Fermer le programme utilisant ce port (AP0, Tomcat, OpenHR ...), sinon une erreur "Failed to initialize socket" apparaitra du fait d'un conflit d'accès.
  3. L'exécuter en lui passant en paramètre le port à tester (par exemple "perl TestPortIP.pl 2222").
  4. Sur votre poste Windows, ouvrir une fenêtre DOS et exécutez un telnet en précisant la machine et le port ciblés (par exemple "telnet 10.20.30.40 2222").

Si le telnet (au bout de son time out) n'arrive pas à accéder au serveur, une erreur apparaît, le port est bloqué.

Dans le cas contraire, un message "got a connection from:" apparait sur le serveur et "Smile from the server" sur le PC.

#!/usr/bin/perl

use Socket;
$port = $ARGV[0];

$server_struct = pack("S n a4 x8", AF_INET, $port, $server_addr);
$proto = (getprotobyname('tcp'))[2];
socket(MYSOCK, PF_INET, SOCK_STREAM, $proto)|| die "Failed to initialize socket: $!\n";
setsockopt(MYSOCK, SOL_SOCKET, SO_REUSEADDR, 1) or die "setsock: $!";

my $paddr = sockaddr_in($port, INADDR_ANY);

# bind to a port, then listen
bind(MYSOCK, $paddr) or die "bind: $!";
listen(MYSOCK, SOMAXCONN) or die "listen: $!";
print "SERVER started on port $port\n";

# accepting a connection
my $client_addr;
while ($client_addr = accept(CLIENT, MYSOCK)) {
        # find out who connected
        my ($client_port, $client_ip) = sockaddr_in($client_addr);
        my $client_ipnum = inet_ntoa($client_ip);
        my $client_host = gethostbyaddr($client_ip, AF_INET);
        # print who has connected
        print "got a connection from: $client_host", "[$client_ipnum]\n";
        # send them a message, close connection
        print CLIENT "Smile from the server";
        close CLIENT;
}

Aucun commentaire:

Enregistrer un commentaire