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是一种互联网协议,它通过一个代理服务器在客户端和服务端之间交换网络数据。简单来说,它就是一种代理协议,扮演一个中间人的角色,在客户端和目标主机之间转发数据。

image

工作流程
  1. 浏览器和socks5代理建立TCP连接

    浏览器和服务器之间多了一个中间人,即socks5,因此浏览器需要跟socks5服务器建立一条连接。

  2. socks5协商阶段

    在浏览器正式向socks5服务器发起请求之前,双方需要协商,包括协议版本,支持的认证方式等,双方需要协商成功才能进行下一步。

  3. socks5请求阶段

    协商成功后,浏览器向socks5代理发起一个请求。请求的内容包括,它要访问的服务器域名或ip,端口等信息。

  4. socks5 relay阶段

    scoks5收到浏览器请求后,解析请求内容,然后向目标服务器建立TCP连接。

  5. 数据传输阶段

    经过上面步骤,成功建立了浏览器 –> 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服务

  1. 接收正常Socks5请求,获得一个连接对象。
  2. 通过协商和鉴权阶段后,收到代理请求(上文3.socks5请求阶段),不直接连接目标,而是将目标信息和生成的UUID封装发送给云函数,并将次连接对象保存。

Bridge服务

  1. 接收云函数发送来的请求,获得一个连接对象。
  2. 通过解析请求,通过UUID找到本地相应的Socks5连接,获得一个连接对象。
  3. 将这两个连接对象进行io同步。
Server(云函数)

启动一个HTTP服务

  1. 收到HTTP请求后,鉴权后,尝试获取目标IP和端口以及Bridge服务的IP和端口。
  2. 连接目标,获得一个连接对象。
  3. 连接Bridge服务,发送目标连接的UUID,获得一个连接对象。
  4. 将这两个连接对象进行io同步。

通过以上流程,一条完整的通路便形成了!

优缺点

优点:socks5用处广泛,Golang开发性能高。

缺点明显:

  1. 受限于云函数的超时时间,最多仅能维持 15 分钟长连接(此为腾讯云
  2. 需要可以接收公网TCP请求,也就是有公网IP

项目地址

Github.com/Ymjie/GoSCFProxy