Perl实现的Linux下socket代理服务器_perl

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

#!/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) = @_;
}

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索socket
, perl
代理服务器
linux socket实现、linux socket实现原理、socket代理服务器、socket5代理服务器、免费socket代理服务器,以便于您获取更多的相关知识。

时间: 2024-09-15 19:37:46

Perl实现的Linux下socket代理服务器_perl的相关文章

LINUX下架设代理服务器

在架设之前,让我们先来了解一下代理服务器的特点.我们这样来理解代理服务器:假设电脑A需要电脑B的数据,电脑A先与电脑C建立连接,电脑C接收到电脑A的数据请求后,再与电脑B建立连接,下载电脑A所请求的数据后再将此数据传送到电脑A,电脑C就称之为代理服务器. 代理服务器的作用可以概述为三方面: 一是通过代理服务器可以访问一些对IP有限制的网站: 二是可以当做防火墙使用: 三是可以很好隐藏自己真实IP,提高安全性. 接下来我们一起来看看架设步骤. 一.配置LINUX上网 第一步:单击"开始-系统工具-

LINUX下架设代理服务器的教程_代理服务器

1. LINUX下第三方代理服务器软件的选择 可以选择的其实还是不少,比如Apache:具有强大的功能.高速度和高效率等特点,但在LINUX下作代理服务器的性能优势并不明显,不建议使用:推荐使用Squid ,有关此软件的相关报道也不少,它由一个主要的服务程序squid,一个DNS查询程序dnsserver和几个管理工具组成,其比较明显的特性就是可以减少服务器等待DNS查询的时间,"Linux+Squid"是最好的代理服务器组合! 2.安装Squid 其实如今的Linux中基本都有已编译

Linux 下Socket编程基础

1. 引言Linux的兴起可以说是Internet创造的一个奇迹.Linux作为一个完全开放其原代码的免费的自由软件,兼容了各种UNIX标准(如POSIX.UNIX System V 和 BSD UNIX 等)的多用户.多任务的具有复杂内核的操作系统.在中国,随着Internet的普及,一批主要以高等院校的学生和ISP的技术人员组成的Linux爱好者队伍已经蓬勃成长起来.越来越多的编程爱好者也逐渐酷爱上这个优秀的自由软件.本文介绍了Linux下Socket的基本概念和函数调用. 2. 什么是So

Linux下Squid代理服务器的使用

本文介绍Linux下非常著名.常用的Squid代理服务器的使用,并着重讲述如何使用其提供的http://www.aliyun.com/zixun/aggregation/38609.html">访问控制策略,来保证代理服务器的合法使用. 代理服务器的功能是代理网络用户取得网络信息,它是网络信息的中转站.随着代理服务器的广泛使用,随之而来的是一系列的安全问题.由于没有对代理服务器的访问控制策略作全面细致的配置,导致用户可以随意地通过代理服务器访问许多色情.反动的非法站点,而这些行为往往又很难

Linux下的代理服务器设置_unix linux

前言: 本文主要介绍了在linux使用squid和squidGuard配置代理服务器,以www代理服务为例介绍如何过滤有害站点和限制用户对internet的访问. 一.介绍 Squid是Linux下最为流行的代理服务器软件,它功能强大,支持对HTTP,FTP,Gopher,SSL和WAIS等协议的代理:设置简单,只需对配置文件中稍稍改动就可使代理服务器运转起来.而且Squid具有页面缓存功能,它接收用户的下载申请,并自动处理所下载的数据.也就是说,当一个用户象要下载一个主页时,它向Squid

Linux下Socket连接超时的一种实现方法

目前各平台通用的设置套接字(Socket)连接超时的办法是: 创建套接字,将其设置成非阻塞状态. 调用connect连接对端主机,如果失败,判断当时的errno是否为EINPROGRESS,也就是说是不是连接正在进行中,如果是,转到步骤3,如果不是,返回错误. 用select在指定的超时时间内监听套接字的写就绪事件,如果select有监听到,证明连接成功,否则连接失败. 以下是Linux环境下的示例代码: #include <stdlib.h> #include <stdio.h>

Linux下Squid代理服务器的架设与维护经验分享_Linux

通过架设专门的WWW(FTP)代理来满足用户的主要需求,通过架设socks5代理来满足用户的其他需求. 一.对使用者的分析 现有网络情况: 我校校园网通过光缆已将31座建筑物连通,光缆总长度约15Km,绝大多数楼中实现结构化布线,连入校园网的网络多媒体教室.教学基地.实验室.机房等约有数十个,连网计算机达3000多台 .我校目前出口有2个,一条速率为10M bps,通过光纤接入中国教育科研网CERNET,另一条速率为4M bps连入中国电信. 用户的需求: 我校校园网的使用者主体为在校学生及老师

Linux下socket编程,附带tcp例子

1.网络中进程之间如何通信? 本地的进程间通信(IPC)有很多种方式,但可以总结为下面4类: 消息传递(管道.FIFO.消息队列) 同步(互斥量.条件变量.读写锁.文件和写记录锁.信号量) 共享内存(匿名的和具名的) 远程过程调用(Solaris门和Sun RPC) 但这些都不是本文的主题!我们要讨论的是网络中进程之间如何通信?首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的.其实TCP/IP协议族已经帮我们解决了这个问

在LINUX环境下架设代理服务器的方法

代理服务器在目前的http://www.aliyun.com/zixun/aggregation/16327.html">网络环境中应用较广,并在Internet里扮演着一个很重要的角色.今天我就给大家介绍一种在LINUX环境下架设代理服务器的方法,希望能够对各位朋友有所帮助. 代理服务器简介 在架设前,让我们先来了解一下代理服务器的特点.我们这样来理解代理服务器,假设电脑A需要电脑B的数据,电脑A先与电脑C建立连接,电脑C接收到电脑A的数据请求后,再与电脑B建立连接,下载电脑A所请求的数