使用socks5实现简易代理服务器

https://blog.csdn.net/lmory233/article/details/80219581?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.add_param_isCf&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.add_param_isCf

写一个简易的socks5代理服务器,负责转发网络数据包,要能够使用它来上网。

SOCKS5 是一个代理协议,它在使用TCP/IP协议通讯的前端机器和服务器机器之间扮演一个中介角色,使得内部网中的前端机器变得能够访问Internet网中的服务器,或者使通讯更加安全。SOCKS5 服务器通过将前端发来的请求转发给真正的目标服务器, 模拟了一个前端的行为。在这里,前端和SOCKS5之间也是通过TCP/IP协议进行通讯,前端将原本要发送给真正服务器的请求发送给SOCKS5服务器,然后SOCKS5服务器将请求转发给真正的服务器。

socks5协议认证步骤:

1、客户端连接到服务器,向服务器发送一个版本标识/方法选择报文:

±------±-----------------±---------------+

| VER | NMETHODS | METHODS |

±------±-----------------±---------------+

| 1 | 1 | 1~255 |

±------±-----------------±---------------+

VER:客户端的协议版本号(socks5:0x05 socks4:0x04)

NMETHODS:客户端所支持认证方式的长度

METHODS:客户端支持的认证方式

目前定义的METHOD有以下几种:
0x00 无需认证
0x01 通用安全服务应用程序
0x02 用户名/密码
0x03- 0x7F IANA 分配
0x80- 0xFE 私人方法保留
0xFF 无可接受方法

2、服务器从客户端报文中选择一种方式,并发送一个方式选择报文:

+----+----------+
|VER | METHOD |
+----+----------+
| 1  |   1    |
+----+----------+

VER:服务端的协议版本号(socks5:0x05 socks4:0x04)

METHOD:服务端选择的认证方式

3、客户端向服务器发送连接目的服务器的请求报文:

+----+-----+-------+------+------------+----------+
|VER | CMD|   RSV | ATYP | DST.ADDR | DST.PORT |
+----+-----+-------+------+------------+----------+
| 1   |   1  |   1   |   1   | Variable |    2     |
+----+-----+-------+------+------------+----------+

VER:客户端协议版本号(socks5:0x05 socks4:0x04)

CMD:请求类型(CONNECT:0x00 BIND:0x01 UDP:0x02)

RSV:保留位(要求为0x00)

ATYP:IP类型(IPV4:0x01 IPV6:0X04 域名:0x03)

DST.ADDR:目的服务器地址

DST.ADDR:目的服务器端口

4、服务器向客户端回应连接请求

+----+-----+-------+------+-------------+-----------+
|VER | REP |   RSV  | ATYP | BND.ADDR | BND.PORT |
+----+-----+-------+------+-------------+-----------+
| 1  |   1   |   1   |   1   | Variable |    2     |
+----+-----+-------+------+----------+--------------+

VER:服务端协议版本号(socks5:0x05 socks4:0x04)

REP:应答结果
1. 0x00 成功
2. 0x01 一般性失败
3. 0x02 规则不允许转发
4. 0x03 网络不可达
5. 0x04 主机不可达
6. 0x05 连接拒绝
7. 0x06 TTL超时
8. 0x07 不支持请求包中的CMD
9. 0x08 不支持请求包中的ATYP
10. 0x09-0xFF 未定义
RSV:保留位(要求为0x00)
ATYP:指明后面的地址类型
BND.ADDR:客户端请求报文中CMD的回应地址(CMD为0x01时)
BND.PORT:客户端请求报文中CMD的回应端口(CMD为0x01时)

程序主要步骤:

第一步:建立客户端和代理服务器连接,TCP连接

第二步:socks5协议认证

第三步:代理服务器连接目的服务器

第四步:转发数据

#include <unistd.h>
#include <arpa/inet.h> //因特网地址结构体相关
#include <sys/socket.h> //socket相关
#include <time.h>  //时间相关
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <pthread.h>
#include <sys/epoll.h>
 
#define BUFF_SIZE 1024   //设置转发缓冲区
#define TIME_OUT 6000000 //设置复用IO延时
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
 
 
//++++++++++++     sock5协议结构体定义     ++++++++++++++
 
 
/*++++++++++++++++++++++++++++++++++++++++++++++++++++++*/
/*  
一、客户端认证请求
    +----+----------+----------+
    |VER | NMETHODS | METHODS  |
    +----+----------+----------+
    | 1  |    1     |  1~255   |
    +----+----------+----------+
二、服务端回应认证
    +----+--------+
    |VER | METHOD |
    +----+--------+
    | 1  |   1    |
    +----+--------+
三、客户端连接请求(连接目的网络)
    +----+-----+-------+------+----------+----------+
    |VER | CMD |  RSV  | ATYP | DST.ADDR | DST.PORT |
    +----+-----+-------+------+----------+----------+
    | 1  |  1  |   1   |  1   | Variable |    2     |
    +----+-----+-------+------+----------+----------+
四、服务端回应连接
    +----+-----+-------+------+----------+----------+
    |VER | REP |  RSV  | ATYP | BND.ADDR | BND.PORT |
    +----+-----+-------+------+----------+----------+
    | 1  |  1  |   1   |  1   | Variable |    2     |
    +----+-----+-------+------+----------+----------+
*/
 
//以下为协议结构体定义
 
//一、客户端认证请求
typedef struct client_license_request{
   
 
    char ver;       // 客户端的协议版本号  0x05:socks5 0x04:socks4
    char nmethods;    // 客户端所支持认证方式的长度
    char methods[255];  //客户端支持的认证方式(可以有255种)
 
}client_license_request;
 
 
//二、服务端回应认证
typedef struct server_license_response{
   
    char ver;     // 服务端的协议版本号
    char method;  //服务端选择的认证方式
}server_license_response;
 
//三、客户端连接请求
typedef struct client_connect_request{
   
    char ver;    //客户端协议版本号
    char cmd;    //连接方式
    char rsv;    //保留位0x00
    char type;   //类型
    char addr[4]; //目的服务器ip
    char port[2]; //目的服务器端口
 
 
}client_connect_request;
 
 
//四、服务端回应连接
typedef struct server_connect_response{
   
    char ver; //版本
    char rep; //连
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值