4 |
|
|
5 |
use strict; |
use strict; |
6 |
use POSIX; |
use POSIX; |
7 |
use IO::Socket::SSL; |
use IO::Socket::SSL qw(debug3); |
8 |
|
$Net::SSLeay::trace = 4; |
9 |
use Getopt::Long; |
use Getopt::Long; |
10 |
|
use Time::HiRes qw(time); |
11 |
|
|
12 |
|
my $localport = 8080; |
13 |
|
my $localaddr = "127.0.0.1"; |
14 |
|
my $port = 80; |
15 |
|
my $host = "127.0.0.1"; |
16 |
|
my $logdir = "$localaddr:$localport-$host:$port"; |
17 |
|
|
|
my $localport; |
|
|
my $localaddr; |
|
18 |
my $help; |
my $help; |
|
my $host; |
|
|
my $port; |
|
19 |
my $daemon; |
my $daemon; |
20 |
my $buffersize = 2048; |
my $buffersize = 2048; |
21 |
my $logtype; |
my $logtype; |
|
my $logdir; |
|
22 |
my $daemon; |
my $daemon; |
23 |
my $serverkey; |
my $serverkey = "$logdir/ssl.key"; |
24 |
my $servercert; |
my $servercert = "$logdir/ssl.cert"; |
25 |
my $serverdh; |
my $serverdh; |
26 |
|
|
27 |
$| = 1; |
$| = 1; |
62 |
exit; |
exit; |
63 |
} |
} |
64 |
|
|
|
# set default values |
|
|
$localport = 8080 unless ($localport); |
|
|
$localaddr = "127.0.0.1" unless ($localaddr); |
|
|
$port = 80 unless ($port); |
|
|
$host = "127.0.0.1" unless ($host); |
|
|
$logdir = "dump" unless ($logdir); |
|
|
|
|
65 |
mkdir $logdir; |
mkdir $logdir; |
66 |
|
|
67 |
|
system "openssl req -new -x509 -days 365 -nodes -out $servercert -keyout $serverkey" |
68 |
|
if ! -e $serverkey && ! -e $servercert; |
69 |
|
|
70 |
|
|
71 |
my %o = ( |
my %o = ( |
72 |
'dir' => $logdir, |
'dir' => $logdir, |
73 |
'port' => $localport, |
'port' => $localport, |
91 |
'SSLdhfile' => $serverdh, |
'SSLdhfile' => $serverdh, |
92 |
'SSL_cert_file' => $servercert, |
'SSL_cert_file' => $servercert, |
93 |
'SSL_key_file' => $serverkey, |
'SSL_key_file' => $serverkey, |
94 |
'Listen' => 10 |
'Listen' => 10, |
95 |
|
# 'SSL_version' => 'SSLv3', # SSLv3, SSLv2, TLSv1 |
96 |
|
# 'SSL_cipher_list' => 'RC4-MD5', |
97 |
) || die "$!"; |
) || die "$!"; |
98 |
|
|
99 |
$SIG{'CHLD'} = 'IGNORE'; |
$SIG{'CHLD'} = 'IGNORE'; |
123 |
my $th = IO::Socket::SSL->new( |
my $th = IO::Socket::SSL->new( |
124 |
'PeerAddr' => $o->{'tohost'}, |
'PeerAddr' => $o->{'tohost'}, |
125 |
'PeerPort' => $o->{'toport'}, |
'PeerPort' => $o->{'toport'}, |
126 |
'SSL_use_cert' => '0', |
# 'SSL_use_cert' => '0', |
127 |
'SSL_verify_mode' => '0', |
# 'SSL_verify_mode' => '0', |
128 |
|
|
|
# 'SSL_cipher_list' => 'NUL:LOW:EXP:ADH', |
|
129 |
'SSL_version' => 'SSLv3', # SSLv3, SSLv2, TLSv1 |
'SSL_version' => 'SSLv3', # SSLv3, SSLv2, TLSv1 |
130 |
|
'SSL_cipher_list' => 'RC4-MD5', |
131 |
'Proto' => 'tcp' |
'Proto' => 'tcp' |
132 |
); |
); |
133 |
if ( !$th ) { print "cannot connect th: $!"; exit 0; } |
if ( !$th ) { print "cannot connect th: $!"; exit 0; } |
135 |
my $fh; |
my $fh; |
136 |
if ( $o->{'dir'} ) { |
if ( $o->{'dir'} ) { |
137 |
$fh = Symbol::gensym(); |
$fh = Symbol::gensym(); |
138 |
open( $fh, ">$o->{'dir'}/tunnel$num.log" ) or die "$!"; |
my $path = $o->{'dir'} . '/' . Time::HiRes::time(); |
139 |
|
open( $fh, '>', $path ) or die "$!"; |
140 |
} |
} |
141 |
$ch->autoflush(); |
$ch->autoflush(); |
142 |
$th->autoflush(); |
$th->autoflush(); |