下载安卓APP箭头
箭头给我发消息

客服QQ:3315713922

Linux系统下以Perl实现的socket代理服务器

作者:课课家教育     来源: http://www.kokojia.com点击数:1193发布时间: 2016-02-14 09:38:51

标签: linux系统linux socketLinux

  网络上有许多Linux开代理的方法,一般用到Python等语言,一些服务器可能不会安装,然而perl可以说是linux标配的语言,给大家一款Perl语言的socket代理,代码非常少,而且还支持密码,效果还是不错,感觉很稳定。

Linux系统下以Perl实现的socket代理服务器_linux系统_linux socket_Linux_课课家

  #!/usr/bin/perl

  $auth_enabled = 0;

  $auth_login = "hidden";

  $auth_pass = "hidden";

  $port = 44269;

  use IO::Socket::INET;

  $SIG{'CHLD'} = 'IGNORE';

  $bind = IO::Socket::INET->new(Listen=>10, Reuse=>1, LocalPort=>$port) or die "Нельзя забиндить порт $port\\n";

  while($client = $bind->accept()) {

  $client->autoflush();

  if(fork()){ $client->close(); }

  else { $bind->close(); new_client($client); exit(); }

  }

  sub new_client {

  local $t, $i, $buff, $ord, $success;

  local $client = $_[0];

  sysread($client, $buff, 1);

  if(ord($buff) == 5) {

  sysread($client, $buff, 1);

  $t = ord($buff);

  unless(sysread($client, $buff, $t) == $t) { return; }

  $success = 0;

  for($i = 0; $i < $t; $i++) {

  $ord = ord(substr($buff, $i, 1));

  if($ord == 0 && !$auth_enabled) {

  syswrite($client, "\\x05\\x00", 2);

  $success++;

  break;

  }

  elsif($ord == 2 && $auth_enabled) {

  unless(do_auth($client)){ return; }

  $success++;

  break;

  }

  }

  if($success) {

  $t = sysread($client, $buff, 3);

  if(substr($buff, 0, 1) == '\\x05') {

  if(ord(substr($buff, 2, 1)) == 0) {

  ($host, $raw_host) = socks_get_host($client);

  if(!$host) { return; }

  ($port, $raw_port) = socks_get_port($client);

  if(!$port) { return; }

  $ord = ord(substr($buff, 1, 1));

  $buff = "\\x05\\x00\\x00".$raw_host.$raw_port;

  syswrite($client, $buff, length($buff));

  socks_do($ord, $client, $host, $port);

  }

  }

  } else { syswrite($client, "\\x05\\xFF", 2); };

  }

  $client->close();

  }

  sub do_auth {

  local $buff, $login, $pass;

  local $client = $_[0];

  syswrite($client, "\\x05\\x02", 2);

  sysread($client, $buff, 1);

  if(ord($buff) == 1) {

  sysread($client, $buff, 1);

  sysread($client, $login, ord($buff));

  sysread($client, $buff, 1);

  sysread($client, $pass, ord($buff));

  if($login eq $auth_login && $pass eq $auth_pass) {

  syswrite($client, "\\x05\\x00", 2);

  return 1;

  } else { syswrite($client, "\\x05\\x01", 2); }

  }

  $client->close();

  return 0;

  }

  sub socks_get_host {

  local $client = $_[0];

  local $t, $ord, $raw_host;

  local $host = "";

  sysread($client, $t, 1);

  $ord = ord($t);

  if($ord == 1) {

  sysread($client, $raw_host, 4);

  @host = $raw_host =~ /(.)/g;

  $host = ord($host[0]).".".ord($host[1]).".".ord($host[2]).".".ord($host[3]);

  } elsif($ord == 3) {

  sysread($client, $raw_host, 1);

  sysread($client, $host, ord($raw_host));

  $raw_host .= $host;

  } elsif($ord == 4) {

  #ipv6 - not supported

  }

  return ($host, $t.$raw_host);

  }

  sub socks_get_port {

  local $client = $_[0];

  local $raw_port, $port;

  sysread($client, $raw_port, 2);

  $port = ord(substr($raw_port, 0, 1)) << 8 | ord(substr($raw_port, 1, 1));

  return ($port, $raw_port);

  }

  sub socks_do {

  local($t, $client, $host, $port) = @_;

  if($t == 1) { socks_connect($client, $host, $port); }

  elsif($t == 2) { socks_bind($client, $host, $port); }

  elsif($t == 3) { socks_udp_associate($client, $host, $port); }

  else { return 0; }

  return 1;

  }

  sub socks_connect {

  my($client, $host, $port) = @_;

  my $target = IO::Socket::INET->new(PeerAddr => $host, PeerPort => $port, Proto => 'tcp', Type => SOCK_STREAM);

  unless($target) { return; }

  $target->autoflush();

  while($client || $target) {

  my $rin = "";

  vec($rin, fileno($client), 1) = 1 if $client;

  vec($rin, fileno($target), 1) = 1 if $target;

  my($rout, $eout);

  select($rout = $rin, undef, $eout = $rin, 120);

  if (!$rout && !$eout) { return; }

  my $cbuffer = "";

  my $tbuffer = "";

  if ($client && (vec($eout, fileno($client), 1) || vec($rout, fileno($client), 1))) {

  my $result = sysread($client, $tbuffer, 1024);

  if (!defined($result) || !$result) { return; }

  }

  if ($target && (vec($eout, fileno($target), 1) || vec($rout, fileno($target), 1))) {

  my $result = sysread($target, $cbuffer, 1024);

  if (!defined($result) || !$result) { return; }

  }

  if ($fh && $tbuffer) { print $fh $tbuffer; }

  while (my $len = length($tbuffer)) {

  my $res = syswrite($target, $tbuffer, $len);

  if ($res > 0) { $tbuffer = substr($tbuffer, $res); } else { return; }

  }

  while (my $len = length($cbuffer)) {

  my $res = syswrite($client, $cbuffer, $len);

  if ($res > 0) { $cbuffer = substr($cbuffer, $res); } else { return; }

  }

  }

  }

  sub socks_bind {

  my($client, $host, $port) = @_;

  }

  sub socks_udp_associate {

  my($client, $host, $port) = @_;

  }

赞(23)
踩(0)
分享到:
华为认证网络工程师 HCIE直播课视频教程