项目设计

设想

初步想法时先做出核心功能,即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地址,从而实现匿名性和隐私保护。在网络安全中主要有以下用途

  1. 网络爬虫:使用SOCKS5代理IP可以隐藏爬虫的真实身份,避免被目标网站封禁。
  2. 网络安全测试:SOCKS5代理IP可用于模拟不同地区和设备的访问,测试网站的安全性和稳定性。
  3. 匿名上网:通过SOCKS5代理IP,用户可以匿名访问网站,保护个人隐私和信息安全。
  4. 内网渗透:部署在跳板机上,以跳板机的身份访问内网的主机。

原理图

待更。。。

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 帮助信息

项目地址

**github: recyvan/proxy-forward: 内网流量代理的转发工具 (github.com)

更新日志

** 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流量转发测试**