IO::Socket::Socks.3pm

Langue: en

Version: 2009-04-04 (debian - 07/07/09)

Section: 3 (Bibliothèques de fonctions)

NAME

IO::Socket::Socks - SOCKS v5 proxy support for IO::Socket

SYNOPSIS

Provides a way to open a connection to a SOCKS v5 proxy and use the object just like an IO::Socket.

DESCRIPTION

IO::Socket::Socks connects to a SOCKS v5 proxy, tells it to open a connection to a remote host/port when the object is created. The object you receive can be used directly as a socket for sending and receiving data from the remote host.

EXAMPLES

Client

use IO::Socket::Socks;

my $socks = new IO::Socket::Socks(ProxyAddr=>``proxy host'',
                                  ProxyPort=>``proxy port'',
                                  ConnectAddr=>``remote host'',
                                  ConnectPort=>``remote port'',
                                 );

print $socks ``foo\n'';

$socks->close();

Server

use IO::Socket::Socks;

my $socks_server = new IO::Socket::Socks(ProxyAddr=>``localhost'',
                                         ProxyPort=>``8000'',
                                         Listen=>1,
                                         UserAuth=>\&auth,
                                         RequireAuth=>1
                                        );

my $select = new IO::Select($socks_server);

while(1) {
    if ($select->can_read())
    {
        my $client = $socks_server->accept();

         if (!defined($client))
         {
             print "ERROR: $SOCKS_ERROR\n";
             next;
         }
 
         my $command = $client->command();
         if ($command->[0] == 1)  # CONNECT
         {
             # Handle the CONNECT
             $client->command_reply(0, addr, port);
         }
         
         ...
         #read from the client and send to the CONNECT address
         ...
 
         $client->close();
     }
 }
 
 

sub auth {
    my $user = shift;
    my $pass = shift;

     return 1 if (($user eq "foo") && ($pass eq "bar"));
     return 0;
 }
 
 

METHODS

new( %cfg )

Creates a new IO::Socket::Socks object. It takes the following config hash:
   ProxyAddr => Hostname of the proxy
 
   ProxyPort => Port of the proxy
   
   ConnectAddr => Hostname of the remote machine
 
   ConnectPort => Port of the remote machine
 
   AuthType => What kind of authentication to support:
                 none       - no authentication (default)
                 userpass  - Username/Password
 
   RequireAuth => Do not send, or accept, ANON as a valid
                  auth mechanism.
 
   UserAuth => Function that takes ($user,$pass) and returns
               1 if they are allowed, 0 otherwise.
 
   Username => If AuthType is set to userpass, then you must
               provide a username.
 
   Password => If AuthType is set to userpass, then you must
               provide a password.
               
   SocksDebug => This will cause all of the SOCKS traffic to
                 be presented on the command line in a form
                 similar to the tables in the RFCs.
 
   Listen => 0 or 1.  Listen on the ProxyAddr and ProxyPort
             for incoming connections.
 
 

accept( )

Accept an incoming connection and return a new IO::Socket::Socks object that represents that connection. You must call command() on this to find out what the incoming connection wants you to do, and then call command_reply() to send back the reply.

command( )

After you call accept() the client has sent the command they want you to process. This function returns a reference to an array with the following format:
   [ COMMAND, HOST, PORT ]
 
 

command_reply( REPLY CODE, HOST, PORT )

After you call command() the client needs to be told what the result is. The REPLY CODE is as follows (integer value):
   0: Success
   1: General Failure
   2: Connection Not Allowed
   3: Network Unreachable
   4: Host Unreachable
   5: Connection Refused
   6: TTL Expired
   7: Command Not Supported
   8: Address Not Supported
 
 

HOST and PORT are the resulting host and port that you use for the command.

VARIABLES

$SOCKS_ERROR

This scalar behaves like $! in that if undef is returned, this variable should contain a string reason for the error.

AUTHOR

Ryan Eatmon This module is free software, you can redistribute it and/or modify it under the same terms as Perl itself.