Chinaunix

标题: 共享一下我的代理服务器源码 [打印本页]

作者: bierdaci    时间: 2008-04-12 11:36
标题: 共享一下我的代理服务器源码
代码是利用闲暇时间写的,感兴趣的朋友可以看看


代码分为转发服务器和代理服务器,先说转发服务器

转发服务器其实也可以说成是重定向服务器,比如转发服务器监听80端口,如果有浏览器用户访问服务器IP(浏览器默认请求80端口),转发服务器接收到浏览器用户的请求后,便把浏览器用户的请求重定向到本机的其它端口或者处于同一网段其它机器的指定端口

再说一下代理服务器

先说明一下,我这个代理服务器只能代理指定的网站或其它可以代理的客户,比如建在内网的SVN服务或者有些地方不能访问的外网网站。
代理服务器分为服务器端和客户端,服务器端需要运行在客户端和大家都能访问的外网上,客户端需要放在能访问到需要代理的客户的网络上,也可以放在客户的本机上。

用法:

解压proxy.tar.gz 进入proxy目录,然后make,会生成三个我们需要的程序,transmit(转发服务器)、manager(代理服务器端)、client(代理客户端)

服务器端用法:
./transmit [端口](比如80)
./manager [端口](随便指定)

客户端用法:
./client -i [代理服务器IP]:[端口] -t [客户IP]:[端口] -d [客户域名]

举例:
假如我的外网服务器IP为1.2.3.4,代理的客户为网易(网易域名:www.163.com,IP:202.108.9.33)

服务器端如下运行
./transmit 80
./mananger 8000

客户端如下运行
./client -i 1.2.3.4:8000 -t 202.108.9.33 -d www.163.com

然后在本机hosts文件(windows是c:\windows\system32\drivers\etc\hosts linux是/etc/hosts)填加如下一行
1.2.3.4 www.163.com

这时在浏览器里敲www.163.com就可以通过代理服务器访问网易了
当然如果客户是自己申请域名,就可以直接把自己的域名指向1.2.3.4,而不用修改本机hosts文件了

最后再说明一下,因为程序开发周期很短(大概一个星期左右),所以程序并不完善,还有很多问题存在,另外程序还不太稳定(可能需要对一些信号进行处理),发上来算是给大家玩玩吧,不要用作商业用途哦^_^

[ 本帖最后由 bierdaci 于 2008-4-12 15:31 编辑 ]

proxy.tar.gz

15.06 KB, 下载次数: 781


作者: wilbur8415    时间: 2008-04-12 11:52
好人
作者: xi2008wang    时间: 2008-04-12 12:30
下载了,先顶一下
作者: converse    时间: 2008-04-12 12:35
被公司辞退了总不是什么好事,多想想自己的问题吧.
作者: bierdaci    时间: 2008-04-12 12:58
原帖由 converse 于 2008-4-12 12:35 发表
被公司辞退了总不是什么好事,多想想自己的问题吧.


对我来说也不是坏事,版主给加个原创吧:)
作者: xxldc    时间: 2008-04-12 13:22
原帖由 bierdaci 于 2008-4-12 12:58 发表


对我来说也不是坏事,版主给加个原创吧:)


支持,把垃圾公司的代码都开源。
作者: yangsf5    时间: 2008-04-12 13:39
原帖由 xxldc 于 2008-4-12 13:22 发表


支持,把垃圾公司的代码都开源。


:wink:
不好吧。。。。
作者: bierdaci    时间: 2008-04-12 13:46
原帖由 xxldc 于 2008-4-12 13:22 发表


支持,把垃圾公司的代码都开源。


晕,这是我自己写的代码,不是垃圾公司的代码^_^
作者: whurs    时间: 2008-04-12 13:49
原帖由 bierdaci 于 2008-4-12 13:46 发表


晕,这是我自己写的代码,不是垃圾公司的代码^_^





呵呵
作者: 醉卧水云间    时间: 2008-04-12 14:27
这个代码打算给公司用?  唉, 无语.
代理服务器成熟的代码多了去了(虽然对协议支持都不完整,但稳定可用), 任何公司都不可能去造这中轮子, 毫无意义, 公司只需要做核心业务.

无须看代码, 你的代理肯定不支持socks5的认证规范, 包括端口绑定你的代码也不会有, 我猜的没错吧?
作者: 范进    时间: 2008-04-12 14:29
楼上太毒了
作者: flw    时间: 2008-04-12 14:33
端口转发服务器是很简单的东西,看这个,就几十行代码:
http://poe.perl.org/?POE_Cookboo ... ion_With_Components
#!/usr/bin/perl


use warnings;
use strict;
use POE qw(Component::Server::TCP Component::Client::TCP);

# Spawn the forwarder server on port 1110.  When new connections

# arrive, spawn clients to connect them to their destination.


POE::Component::Server::TCP->new(
    Port => 1110,

    ClientConnected => sub {
        my ( $heap, $session ) = @_[ HEAP, SESSION ];
        logevent( 'server got connection', $session );
        spawn_client_side();
    },

    ClientInput => sub {
        my ( $kernel, $session, $heap, $input ) = @_[ KERNEL, SESSION, HEAP, ARG0 ];
        logevent( 'server got input', $session, $input );
        $kernel->post( $heap->{client_id} => send_stuff => $input );
    },

    ClientDisconnected => sub {
        my ( $kernel, $session, $heap ) = @_[ KERNEL, SESSION, HEAP ];
        logevent( 'server got disconnect', $session );
        $kernel->post( $heap->{client_id} => "shutdown" );
    },

    InlineStates => {
        send_stuff => sub {
            my ( $heap, $stuff ) = @_[ HEAP, ARG0 ];
            logevent( "sending to server", $_[SESSION] );
            $heap->{client}->put($stuff);
        },
        _child => sub {
            my ( $heap, $child_op, $child ) = @_[ HEAP, ARG0, ARG1 ];
            if ( $child_op eq "create" ) {
                $heap->{client_id} = $child->ID;
            }
        },
    },
);

sub spawn_client_side {
    POE::Component::Client::TCP->new(
        RemoteAddress => 'localhost',
        RemotePort    => 6667,

        Started => sub {
            $_[HEAP]->{server_id} = $_[SENDER]->ID;
        },

        Connected => sub {
            my ( $heap, $session ) = @_[ HEAP, SESSION ];
            logevent( 'client connected', $session );
        },

        ServerInput => sub {
            my ( $kernel, $heap, $session, $input ) = @_[ KERNEL, HEAP, SESSION, ARG0 ];
            logevent( 'client got input', $session, $input );
            $kernel->post( $heap->{server_id} => send_stuff => $input );
        },

        Disconnected => sub {
            my ( $kernel, $heap, $session ) = @_[ KERNEL, HEAP, SESSION ];
            logevent( 'client disconnected', $session );
            $kernel->post( $heap->{server_id} => 'shutdown' );
        },

        InlineStates => {
            send_stuff => sub {
                my ( $heap, $stuff ) = @_[ HEAP, ARG0 ];
                logevent( "sending to client", $_[SESSION] );
                $heap->{server}->put($stuff);
            },
        },
    );
}

sub logevent {
    my ( $state, $session, $arg ) = @_;
    my $id = $session->ID();

    print "session $id $state ";
    print ": $arg" if ( defined $arg );
    print "\n";
}

warn 'running';
$poe_kernel->run();
exit 0;

作者: bierdaci    时间: 2008-04-12 14:43
原帖由 醉卧水云间 于 2008-4-12 14:27 发表
这个代码打算给公司用?  唉, 无语.
代理服务器成熟的代码多了去了(虽然对协议支持都不完整,但稳定可用), 任何公司都不可能去造这中轮子, 毫无意义, 公司只需要做核心业务.

无须看代码, 你的代理肯定不支持s ...


哈哈,发这儿只是给大家玩玩,喜欢玩就玩玩,何必这么认真呢^_^

[ 本帖最后由 bierdaci 于 2008-4-12 15:44 编辑 ]
作者: bierdaci    时间: 2008-04-12 14:47
原帖由 flw 于 2008-4-12 14:33 发表
端口转发服务器是很简单的东西,看这个,就几十行代码:
http://poe.perl.org/?POE_Cookboo ... ion_With_Components
#!/usr/bin/perl


use warnings;
use strict;
use POE qw(Component ...


老大您厉害啊,哈哈
作者: bierdaci    时间: 2008-04-12 15:17
原帖由 范进 于 2008-4-12 14:29 发表
楼上太毒了

其实也没啥,牛人有牛脾气说牛话很正常:)
作者: system888net    时间: 2008-04-12 17:25
顶一下.

LZ的精神可嘉. 自己写代码去尝试是好的.
各楼的点评各有特点,借鉴一下可以去升级自己的代码.

"长江不择细流,泰山不辞杯土". 对LZ和各位大侠都适用.
作者: system888net    时间: 2008-04-12 23:15
用RAW转发的效率会更高一些.
作者: SCys    时间: 2008-04-13 15:17
楼主心理能力强,能够接受牛人的一些比较深刻的说话:)
作者: W.Z.T    时间: 2008-04-13 19:20
顶lz
作者: xxldc    时间: 2008-04-15 17:04


  1. static int long_connect_cb(int udp_fd, struct sockaddr_in *addr, void *data)
  2. {
  3.         struct sockaddr_in *seraddr = (struct sockaddr_in *)data;

  4.         LOG_MSG(3, 0, "start long connect");
  5.         seraddr->sin_addr = addr->sin_addr;//我就不明白,addr赋值给data,函数参数之间赋值,那为什么还要传两个参数进来,addr和data合并成一个参数不行嘛?
  6.         if (start_transmit(seraddr, &transmit_addr, long_connect_handler) < 0) {//transmit_addr还是个全局变量,怎么不用个锁保护一下呢?你这个是多线程呢
  7.                 LOG_MSG(0, 0, "long connect server failed");
  8.                 return -1;
  9.         }

  10.         return 0;
  11. }

复制代码


代码一句注释都没有,真是读死我了.怪不得你们公司不要你.
作者: bierdaci    时间: 2008-04-16 17:30
原帖由 xxldc 于 2008-4-15 17:04 发表

static int long_connect_cb(int udp_fd, struct sockaddr_in *addr, void *data)
{
        struct sockaddr_in *seraddr = (struct sockaddr_in *)data;

        LOG_MSG(3, 0, "start long connect";
        seraddr->sin_addr = addr->sin_addr;//我就不明白,addr赋值给data,函数参数之间赋值,那为什么还要传两个参数进来,addr和data合并成一个参数不行嘛?
        if (start_transmit(seraddr, &transmit_addr, long_connect_handler) < 0) {//transmit_addr还是个全局变量,怎么不用个锁保护一下呢?你这个是多线程呢
                LOG_MSG(0, 0, "long connect server failed";
                return -1;
        }

        return 0;
}

代码一句注释都没有,真是读死我了.怪不得你们公司不要你


实在佩服啊兄弟,少有人能静下心来看别人的代码,赞一个先,另外你的批评偶接受,以后再发上来的代码一定记着加注释

一、至于为啥没有合并一个参数,因为两个参数方便嘛,要不然我就得在外面把服务器传过来的数据和addr合一块儿了,你说麻烦吧
二、这个嘛其实是不用加锁的,因为这是客户端,transmit_addr只有一个,而且是不变的,另外呢还有一点,其实线程还没开始呢^_^

另外这个程序实在是没有精心雕琢,基本上是写完了调试着差不多能运行了就发上来了,真要的用的话肯定还有很多问题,不过怎么说也算是自己的一个作品吧,发上来给大家瞅瞅玩玩,有问题大家多指正,小弟一定虚心学习^_^

[ 本帖最后由 bierdaci 于 2008-4-16 17:49 编辑 ]
作者: net_robber    时间: 2008-04-16 17:38
其实,我觉得,做一个客户端,似乎比做一个服务器端需要准备的知识要多

比如,Windows下如何截获当前某个特定程序或者进程与某个特定服务器(或端口,反正符合某一特征)的通信内容,进行重新打包等工作,我至今没有想明白该怎么做

当然,我对系统了解不多,由很大关系


PS:Linux下我也没做到
作者: bierdaci    时间: 2008-04-16 17:47
原帖由 net_robber 于 2008-4-16 17:38 发表
其实,我觉得,做一个客户端,似乎比做一个服务器端需要准备的知识要多

比如,Windows下如何截获当前某个特定程序或者进程与某个特定服务器(或端口,反正符合某一特征)的通信内容,进行重新打包等工作,我 ...


没大明白你的问题,你的意思是不是如何在一个进程里截获另一个进程的网络数据?如果这个问题的话,可以在链路层截获,然后分析协议,但这样的话每个系统的链路层都不一样,而且比较麻烦,另外我记得原始套接口不能截获TCP或UDP协议数据的,如果原始套接口可以截获就方便多了

不知道我回答的是不是你要问的问题,其实我网络比较菜了,找大牛帮你解释一下吧
作者: system888net    时间: 2008-04-17 09:53
原帖由 bierdaci 于 2008-4-16 17:47 发表


没大明白你的问题,你的意思是不是如何在一个进程里截获另一个进程的网络数据?如果这个问题的话,可以在链路层截获,然后分析协议,但这样的话每个系统的链路层都不一样,而且比较麻烦,另外我记得原始套接 ...


Linux and windows2000:
socket( PF_INET, SOCK_RAW, IPPROTO_TCP )
作者: dxbh    时间: 2010-02-28 00:40
haha
作者: peidright    时间: 2010-02-28 12:06
回复 22# net_robber

写浏览器的 和写web server的,不是一个级别的。。

你的意思,是截获,还只是获取。截获的意思是,你获取了,上层应用就获取不到了,由你负责先处理。
如果是截获的话,必须涉及net_filter吧,如果仅仅死获取,则用pcap,也比较方便。




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2