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

大家提供了许多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) = @_;
}
(0)

相关推荐

  • Linux网络编程之UDP Socket程序示例

    在网络传输协议中,TCP协议提供的是一种可靠的,复杂的,面向连接的数据流(SOCK_STREAM)传输服务,它通过三段式握手过程建立连接.TCP有一种"重传确认"机制,即接收端收到数据后要发出一个肯定确认的信号,发送端如果收到接收端肯定确认的信号,就会继续发送其他的数据,如果没有,它就会重新发送. 相对而言,UDP协议则是一种无连接的,不可靠的数据报(SOCK_DGRAM)传输服务.使用UDP套接口不用建立连接,服务端在调用socket()生成一个套接字并调用bind()绑定端口后就可

  • 详解Linux的SOCKET编程

    本篇文章对Linux的SOCKET编程进行了详细解释,文章后面分享了一个编程实例供大家学习. 1. 网络中进程之间如何通信 进程通信的概念最初来源于单机系统.由于每个进程都在自己的地址范围内运行,为保证两个相互通信的进程之间既互不干扰又协调一致工作,操作系统为进程通信提供了相应设施,如 UNIX BSD有:管道(pipe).命名管道(named pipe)软中断信号(signal) UNIX system V有:消息(message).共享存储区(shared memory)和信号量(semap

  • C语言实现Linux下的socket文件传输实例

    本文实例讲述了C语言实现Linux下的socket文件传输.分享给大家供大家参考.具体如下: server.c如下: //////////////////////////////////// //服务器代码 /////////////////////////////////// //本文件是服务器的代码 #include <netinet/in.h> // for sockaddr_in #include <sys/types.h> // for socket #include &

  • linux socket通讯获取本地的源端口号的实现方法

    关于TCP IP网络通讯的资料非常多,TCP IP通过IP数据包模式进行端对端通讯.典型的TCP数据包如下 可以看到数据包包含了源端口号和目的端口号,客户端socket向服务端发起连接时,系统会给socket随机分配一个源端口号,我们可以通过getsocketname来获取连接成功的socket的原端口信息. 函数原型 #include <sys/socket.h> int getsockname(int sockfd, struct sockaddr *addr, socklen_t *ad

  • Linux网络编程之socket文件传输示例

    本文所述示例程序是基于Linux平台的socket网络编程,实现文件传输功能.该示例是基于TCP流协议实现的socket网络文件传输程序.采用C语言编写.最终能够实现传输任何格式文件的文件传输程序. 具体实现代码如下: Server端代码如下: /************************************************************************* > File Name: Server.c > Author: SongLee ***********

  • linux下开启php的sockets扩展支持实例

    下个相同版本的php源码,进行编译安装,再按照上面步骤搞,生成的so.copy到rpm装的那个,修改php.ini进行扩展就行了, 或者到网上找相同版本,相同系统 的编译好的so文件. 在linux下给PHP安装socket扩展,参考方法如下: #cd /usr/soft/php/ext/sockets (进入原php安装文件下的sockets目录) #/usr/local/php/bin/phpize (运行安装后的php安装文件下的phpize) #./configure --prefix=

  • Linux下高并发socket最大连接数所受的各种限制(详解)

    1.修改用户进程可打开文件数限制 在Linux平台上,无论编写客户端程序还是服务端程序,在进行高并发TCP连接处理时,最高的并发数量都要受到系统对用户单一进程同时可打开文件数量的限制(这是因为系统为每个TCP连接都要创建一个socket句柄,每个socket句柄同时也是一个文件句柄).可使用ulimit命令查看系统允许当前用户进程打开的文件数限制: [speng@as4 ~]$ ulimit -n 1024 这表示当前用户的每个进程最多允许同时打开1024个文件,这1024个文件中还得除去每个进

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

    大家提供了许多linux开代理的方法,一般用到python等语言,一些服务器可能不会安装,然而perl可以说是linux标配的语言,给大家一款Perl语言的socket代理,代码非常少,而且还支持密码,效果还是不错,感觉很稳定. #!/usr/bin/perl $auth_enabled = 0; $auth_login = "hidden"; $auth_pass = "hidden"; $port = 44269; use IO::Socket::INET; $

  • linux下socket编程常用头文件(推荐)

    sys/types.h:数据类型定义 sys/socket.h:提供socket函数及数据结构 netinet/in.h:定义数据结构sockaddr_in arpa/inet.h:提供IP地址转换函数 netdb.h:提供设置及获取域名的函数 sys/ioctl.h:提供对I/O控制的函数 sys/poll.h:提供socket等待测试机制的函数 其他在网络程序中常见的头文件 unistd.h:提供通用的文件.目录.程序及进程操作的函数 errno.h:提供错误号errno的定义,用于错误处理

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

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

  • Linux下的代理服务器设置

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

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

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

  • Linux下搭建简易的HTTP服务器完成图片显示

    目录 1. 前言 2. HTTP协议介绍 3. HTTP的消息结构 4. HTTP交互流程 5. 案例代码: 搭建HTTP服务器 6. 最终运行的效果 1. 前言 作为Linux下socket(TCP)网络编程的练习,使用C语言代码搭建一个简单的HTTP服务器,完成与浏览器之间的交互,最终在浏览器上显示一张图片. 2. HTTP协议介绍 HTTP协议本身是基于TCP通信协议来传递数据(HTML 文件, 图片文件-也叫超文本传输协议),HTTP协议必须工作在客户端-服务端架构上(本身底层就是TCP

  • Linux下搭建HTTP服务器完成图片显示功能

    目录 1. 前言 2. HTTP协议介绍 3. HTTP的消息结构 4. HTTP交互流程 5. 案例代码: 搭建HTTP服务器 6. 最终运行的效果 1. 前言 作为Linux下socket(TCP)网络编程的练习,使用C语言代码搭建一个简单的HTTP服务器,完成与浏览器之间的交互,最终在浏览器上显示一张图片. 2. HTTP协议介绍 HTTP协议本身是基于TCP通信协议来传递数据(HTML 文件, 图片文件-也叫超文本传输协议),HTTP协议必须工作在客户端-服务端架构上(本身底层就是TCP

  • Linux下用Nginx作Perl程序服务器及其中Perl模块的配置

    perl + fastcgi + nginx搭建 nginx + fastcgi是php下最流行的一套环境了,那perl会不会也有fastcgi呢,当然有,今天来搭建下nginx下perl的fastcgi.性能方面也不亚于php,但是现在web程序php的流行程度perl无法比拟了,性能再好也枉然,但是部分小功能可以考虑使用perl的fastcgi来搞定.进入正题. 1. 准备软件环境: nginx:http://www.nginx.org perl:系统自带 fastcgi:http://ww

随机推荐