ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;text-align: left;">写在前面
接上次 ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;">论如何防溯源ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 15px;">连接WebShell 中提到的思路,我们来看看怎么借用云函数实现一个HTTP动态代理池。
提前说明一下:实现代理池的方式有很多,不局限这一种
先看效果
挂上代理之后,每次 HTTP 请求,都会以不同的 IP 发送出去,并且出口IP均为 IDC 机房 IP。随便挑选其中一个 IP 去 TI 上查询,可以看到 IP 很干净,专治各种买了威胁情报服务的目标。
原理
总结下来就是一句话:利用云厂商提供的云函数(函数计算)功能,将客户端的HTTP请求进行转发,由于云函数多出口的特性,让我们也变相拥有了代理池。
云函数
有关云函数的详细介绍可以直接去看各云厂商的产品文档。我们只提几个重点:
1. 云函数不需要服务器,也就是说你不需要去买 VPS。
2. 云函数只是云厂商用自己的服务器帮你运行你上传的代码片段, 执行某个单一的逻辑,可以简单理解为只帮你执行一个函数。
3. 云函数无法长驻,调用的时候创建,执行完之后立即就销毁,所以无法直接保存状态。也正是这一点,让我们无法代理像 SSH 这种需要长连接的服务,只能代理 HTTP(s) 这种无状态的协议。
以腾讯云云函数服务为例,工作原理里面提到了复用原始连接的情况,为代理 TCP 连接提供了可能,但是目前鉴于时间原因没有深入尝试。
设计
云函数不能直接调用,同时还需要创建一个 「触发器」来触发云函数,为了方便我们选择使用 「API 网关触发器」,好处是一个 HTTP 请求就可以触发,也不需要什么别的操作。
我们整个代理池的架构如下:
SCF-Main
这个是我们云函数,我们需要布署到云上。负责解析结构化的数据,组装 HTTP 请求,发送之后把响应再组装好返回给 API 网关。
SCF-Client
这是客户端程序,主要做 3 件事:
开发——云函数侧
云函数侧要做的事情很简单,只需要接到网关传过来的数据,解开之后自己拼出来一个 HTTP 请求,发送出去,然后把Response 信息再拼好,返回给 API 网关即可。
我们定义两个结构,分别是HTTP请求和响应:
利用 http.ReadRequest 直接从原始报文创建 request 对象
接下来就是 dump 出 response 报文,组装成 API 网关返回的格式返回
至此云函数端就已经完成了
开发——SCF-Client 侧
首先按照一个正常的 http 代理服务去开发,处理浏览器和本地代理端口的数据包,这个没啥说的,大篇的文章可以找到,100行就能搞定。
常规的 HTTP 代理是把浏览器发过来的包直接就转发出去了,我们需要把这一块的逻辑重写一下。
把浏览器侧发过来的 HTTP 数据包,组装成 SCF-Main 请求格式,发送给 API 网关
拿到API网关响应包解析并处理后,转换成本地 HTTP 请求正确的响应包,返回给浏览器
部署&使用步骤
云函数部分
1. 打开 「函数服务」(https://www.ihonker.org/data/attachment/forum/202103/17/6d7beaef81326a52e6af1ccb9f1e24a4.jpeg" data-type="jpeg" data-w="757" style="" />
2. 按照图中步骤填写,不要手欠直接点完成
基础配置
高级配置
触发器配置
3. 点击完成后,自动上传 zip 包并布署,同时会创建 API 网关,直接点「立即访问」
4. 获取云函数的 API 访问路径
Client 侧
scf-client 的参数如下: