GoSCFproxy
介绍
一个使用Go开发,利用云函数实现socks5代理池的工具。
可以作为代理池使用,实现隐匿真实IP,防止溯源。
Golang开发性能高,使用socks5协议泛用性广。
前置知识
Socks5代理工作流程
概述
SOCKS is an Internet protocol that exchanges network packets between a client and server through a proxy server
socks是一种互联网协议,它通过一个代理服务器在客户端和服务端之间交换网络数据。简单来说,它就是一种代理协议,扮演一个中间人的角色,在客户端和目标主机之间转发数据。
工作流程
浏览器和socks5代理建立TCP连接
浏览器和服务器之间多了一个中间人,即socks5,因此浏览器需要跟socks5服务器建立一条连接。
socks5协商阶段
在浏览器正式向socks5服务器发起请求之前,双方需要协商,包括协议版本,支持的认证方式等,双方需要协商成功才能进行下一步。
socks5请求阶段
协商成功后,浏览器向socks5代理发起一个请求。请求的内容包括,它要访问的服务器域名或ip,端口等信息。
socks5 relay阶段
scoks5收到浏览器请求后,解析请求内容,然后向目标服务器建立TCP连接。
数据传输阶段
经过上面步骤,成功建立了浏览器 –> socks5,socks5–>目标服务器之间的连接。这个阶段浏览器开始把数据传输给scoks5代理,socks5代理把数据转发到目标服务器。
云函数
工作原理
https://cloud.tencent.com/document/product/583/9694
API 网关在接受到 API 请求后,如果 API 在网关上的后端配置了对接云函数,该函数将会被触发运行。
GoSCFProxy工作原理
云函数一般只能接收http和ws协议请求,不能直接接收socks5流量,但是云函数能对外发包,自然意味着可对外发起socket 连接。(类似SSRF
为了让云函数发起连接,需要Client主动通过API网关发送请求,并将目标ip和端口附加在POST数据包中。
因此我们完全可以将云函数当作一座桥梁,一侧对 VPS 发起连接,另一侧对目标服务器发起连接,然后同步两个io,实现流量代理。
基本流程
Client
启动如下两个服务
Socks5服务
- 接收正常Socks5请求,获得一个连接对象。
- 通过协商和鉴权阶段后,收到代理请求(上文3.socks5请求阶段),不直接连接目标,而是将目标信息和生成的UUID封装发送给云函数,并将次连接对象保存。
Bridge服务
- 接收云函数发送来的请求,获得一个连接对象。
- 通过解析请求,通过UUID找到本地相应的Socks5连接,获得一个连接对象。
- 将这两个连接对象进行io同步。
Server(云函数)
启动一个HTTP服务
- 收到HTTP请求后,鉴权后,尝试获取目标IP和端口以及Bridge服务的IP和端口。
- 连接目标,获得一个连接对象。
- 连接Bridge服务,发送目标连接的UUID,获得一个连接对象。
- 将这两个连接对象进行io同步。
通过以上流程,一条完整的通路便形成了!
优缺点
优点:socks5用处广泛,Golang开发性能高。
缺点明显:
- 受限于云函数的超时时间,最多仅能维持 15 分钟长连接(此为腾讯云
- 需要可以接收公网TCP请求,也就是有公网IP
项目地址
Github.com/Ymjie/GoSCFProxy