#!/usr/bin/perl -w use IO::Socket; my ($localport,$sslserver,$sslport,$ircserver,$ircport); #MAIN SECTION print STDERR "tunnel.pl simple SSH tunnel\n"; init(); bindserver(); waitforconnect(); #END SECTION sub init { if ( @ARGV < 5 ) { die "Insufficient parameters\n"; } ($localport,$sslserver,$sslport,$ircserver,$ircport) = @ARGV; } sub bindserver { $server = IO::Socket::INET->new( Proto => "tcp", LocalPort => $localport, Listen => SOMAXCONN, Reuse => 1); die "Can not start server on $localport \n" unless $server; print STDERR "Server connected to $localport \n"; } sub waitforconnect { print STDERR "waiting for connection on $localport \n"; if (defined($client=$server->accept())) { print STDERR "Connection on $localport \n"; connectssl(); startconn(); } } sub connectssl { $errflag=0; $handle = IO::Socket::INET->new( Proto => "tcp", PeerAddr => $sslserver, PeerPort => $sslport); $errflag=1 unless $handle; if ($errflag==1) { print STDERR "Error connecting SSL server $sslserver on port $sslport \n"; } else { print STDERR "Connected to SSL server $sslserver on port $sslport\n"; print $handle "CONNECT $ircserver:$ircport HTTP/1.0 \r\n\r\n"; $flag=0; while (defined($_=<$handle>) && $flag==0) { if (/AUTH/) { $line=<$client>; print $handle $line; print STDERR "CLIENT: $line \n"; print STDERR "Connected to IRCserver $ircserver on port $ircport \n"; $flag=1; } } } } sub startconn { $kidpid=fork(); if ($kidpid) { while (defined($line=<$client>)) { print $handle $line; } } else { while (defined($line=<$handle>)) { print $client $line; } } }