项目设计
设想
初步想法时先做出核心功能,即tcp流量代理转发,在进行log日志编写,性能优化(初步设想为IO多路复用),代码结构简化,UDP流量代理转发,函数解耦,单对多服务,多对多服务(实际情况可能用不到)等等,其中夹杂着bug修复。
原理-tcp流量代理转发
这里是通过python的socket和thread库进行实现。
原理图示如下:### 维持socket代理HTTP流量长连接的方法
HTTP 连接是基于 Request-Response 的非持久(短)连接,其连接的生命周期通过 Request 界定,一个 Request 一个 Response,此次 HTTP 连接的生命周期结束。对于这点在 HTTP 1.1 中进行了改进,支持 Keep-alive,允许在一个 HTTP 连接的生命周期中,可以发送多个 Request,接收多个 Response,但由 Request 来界定生命周期的本质没有改变。但是当我们访问HTTP1.0服务(临时搭建搭建的web服务时)使用socket代理又无法使用keep-alive
暂时无法处理heartbeat包对数据的污染问题,尤其是在ssh的流量代理中,高概率无法其ssh连接时的格式规范。
原理 sockets5协议代理
socks5协议是一种网络代理协议,主要用于在客户端和目标主机之间建立安全连接,实现网络访问控制。增强匿名性。SOCKS5提供了更多的安全性和功能。它允许用户在访问网络时隐藏自己的真实IP地址,从而实现匿名性和隐私保护。在网络安全中主要有以下用途
- 网络爬虫:使用SOCKS5代理IP可以隐藏爬虫的真实身份,避免被目标网站封禁。
- 网络安全测试:SOCKS5代理IP可用于模拟不同地区和设备的访问,测试网站的安全性和稳定性。
- 匿名上网:通过SOCKS5代理IP,用户可以匿名访问网站,保护个人隐私和信息安全。
- 内网渗透:部署在跳板机上,以跳板机的身份访问内网的主机。
原理图
待更。。。
sockets5认证过程及头部信息
[!NOTE] 表格
表格中的数字单位均为字符,例如VER=1字符
协商
VER | NMETHODS | METHODS |
---|---|---|
1 | 1 | 1!255 |
客服端向服务端发送自己的版本号(ver: 0x05),自己支持的认证方式(methods: 方法数量,methods: 方法列表)
同时服务端返回所选择的方法和版本号。
常见methods方法:
- 0x00:无认证要求
- 0x02: 使用账户密码登录
- 0xFF: 方法未被选中
认证
客户端和服务端根据选定的认证方式进行验证,之后客户端就可以发送请求信息。
服务端:
VER | STATUS |
---|---|
1 | 1 |
- STATUS: X00表示认证成功,其他为失败
客服端:
VER | ULEN | UNAME | PLEN | PASSWD |
---|---|---|---|---|
1 | 1 | 1~255 | 1 | 1~255 |
- ULEN:表示UNAME字段的长度
- UNAME:用户名
- PLEN : 表示PASSWD字段的长度
- PASSWD: 密码
请求
客服端:
认证完成客户端发起请求
VER | CMD | RSV | ATYP | DSTADDR | DSTPORT |
---|---|---|---|---|---|
1 | 1 | 0x00 | 1 | variable | 2 |
- CMD : CONNECT:0x01;BIND:0x02
- RSV:保留字段,无含义
- ATYP:IPV4:0x01;IPV6:0x03;域名:0x03
- DSTADDR:目的端地址
- DSTPROT:目的端口
服务端:
服务端接收后发送如下请求
VER | REP | RSV | ATYP | DSTADDR | DSTPROT |
---|---|---|---|---|---|
1 | 1 | 0x00 | 1 | varlable | 2 |
- REP :状态码:其中0x00表示连接成功
数据转发
对于tcp进行代码层面直接转发即可。使用select库进行数据接收和转发。
使用说明
v0.4.1版本参数说明
服务端:
-p 端口号: 指定服务端监听的端口号,默认为8080。
-v 版本信息
-h 帮助信息
客户端
-sh –server-host 服务器地址: 指定服务端的地址,默认为localhost。 (必选)
-sp –server-port 服务器端口: 指定服务端的端口号,默认为8080。 (必选)
-ah –app_host 应用地址: 指定应用的地址,默认为localhost。
-ap –app_port 应用端口: 指定应用的端口号,默认为80。 (必选)
-t –type 转发类型:tcp,socks5,指定转发类型,默认为tcp。
-socks-host –sockrts-host socks5服务器地址: 指定socks5服务器地址,默认为localhost。
-socks-port –sockets-port socks5服务器端口: 指定socks5服务器端口号,默认为1080。
-username –socket-username socks5用户名: 指定socks5用户名,默认为””。
-password –socket-password socks5密码: 指定socks5密码,默认为””
-v 版本信息
-h 帮助信息
项目地址
更新日志
** 2024-8-21: 发布v0.4.1版本
优化代码结构,增加功能:增加了对socks5协议的支持。支持代理socks5下tcp/udp的数据转发,初步适配proxychains工具
修复了tcp端对端数据转发中http的中断造成的服务端无法再次接收数据的bug。
更新了参数使用说明。**
** 2024-8-15:发布v0.2版本
优化代码结构,增加功能:增加了多个客户端连接服务端的功能。
优化代码结构,增加功能:增加了日志功能,可记录转发过程中的日志。
改为命令行模式,增加了命令行参数功能。**
** 2024-8-14:发布初始版本 v0.1
tcp端对端流量转发初想设计成功,已通过ssh流量转发测试**