云函数实现代理绕过IP封锁
字数 1380 2025-08-22 12:22:54
云函数实现代理绕过IP封锁 - 详细教学文档
1. 云函数简介
云函数(Serverless Functions)是一种事件驱动的计算服务,允许开发者编写和部署代码而无需管理底层服务器资源。
核心特点:
- 无服务器管理:无需维护服务器,云平台自动处理执行环境
- 按需计费:基于实际执行的计算资源和时间收费
- 事件驱动:可由HTTP请求、文件上传等事件触发
- 自动扩展:根据请求量自动扩展或缩减资源
- 快速部署:代码上传后立即生效,迭代灵活
2. 应用场景
- API后端服务
- 文件处理(图像、视频等)
- 数据处理(日志、流媒体等)
- 自动化任务
- 物联网(IoT)数据处理
- 代理服务(本文重点)
3. 部署服务端(腾讯云示例)
3.1 创建云函数
- 访问腾讯云函数控制台:https://console.cloud.tencent.com/scf/index
- 选择"新建函数"
- 配置选项:
- 创建方式:从头开始
- 函数类型:事件函数
- 运行环境:Python 3.6
3.2 函数代码配置
# -*- coding: utf8 -*-
import json
import pickle
from base64 import b64decode, b64encode
import requests
SCF_TOKEN = "TOKEN" # 自定义随机值,用于鉴权
def authorization():
return {
"isBase64Encoded": False,
"statusCode": 401,
"headers": {},
"body": "Please provide correct SCF-Token",
}
def main_handler(event: dict, context: dict):
try:
token = event["headers"]["scf-token"]
except KeyError:
return authorization()
if token != SCF_TOKEN:
return authorization()
data = event["body"]
kwargs = json.loads(data)
kwargs['data'] = b64decode(kwargs['data'])
r = requests.request(**kwargs, verify=False, allow_redirects=False)
serialized_resp = pickle.dumps(r)
return {
"isBase64Encoded": False,
"statusCode": 200,
"headers": {},
"body": b64encode(serialized_resp).decode("utf-8"),
}
3.3 创建函数URL
- 在函数配置中找到"触发管理"
- 创建"函数URL"作为触发器
- 获取生成的API地址(后续客户端会用到)
4. 部署客户端
4.1 安装mitmproxy
pip3 install mitmproxy
4.2 HTTPS证书安装
首次运行mitmdump命令后,证书会自动生成在:
- Windows:
C:\Users\xxx\.mitmproxy\ - Linux/macOS:
~/.mitmproxy/
双击证书文件安装到系统信任库。
4.3 客户端代码配置
创建client.py文件:
# -*- coding: utf8 -*-
import json
import pickle
from typing import List
from random import choice
from urllib.parse import urlparse
from base64 import b64encode, b64decode
import mitmproxy
scf_servers: List[str] = [
"https://111111-zzzzz.ap-beijing.tencentscf.com",
"http://111111-zzzzz.ap-beijing.tencentscf.com"
] # 替换为你的函数URL
SCF_TOKEN = "TOKEN" # 与服务端保持一致
def request(flow: mitmproxy.http.HTTPFlow):
scf_server = choice(scf_servers)
r = flow.request
data = {
"method": r.method,
"url": r.pretty_url,
"headers": dict(r.headers),
"cookies": dict(r.cookies),
"params": dict(r.query),
"data": b64encode(r.raw_content).decode("ascii"),
}
flow.request = flow.request.make(
"POST",
url=scf_server,
content=json.dumps(data),
headers={
"Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8",
"Accept-Encoding": "gzip, deflate, compress",
"Accept-Language": "en-us;q=0.8",
"Cache-Control": "max-age=0",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36",
"Connection": "close",
"Host": urlparse(scf_server).netloc,
"SCF-Token": SCF_TOKEN,
},
)
def response(flow: mitmproxy.http.HTTPFlow):
if flow.response.status_code != 200:
mitmproxy.ctx.log.warn("Error")
if flow.response.status_code == 401:
flow.response.headers = Headers(content_type="text/html;charset=utf-8")
return
if flow.response.status_code == 433:
flow.response.headers = Headers(content_type="text/html;charset=utf-8")
flow.response.text = "<html><body>操作超时,可在函数配置中修改执行超时时间</body></html>"
return
if flow.response.status_code == 200:
body = flow.response.content.decode("utf-8")
resp = pickle.loads(b64decode(body))
r = flow.response.make(
status_code=resp.status_code,
headers=dict(resp.headers),
content=resp.content,
)
flow.response = r
5. 使用测试
启动本地代理:
mitmdump -s client.py -p 9999 --no-http2
配置代理
-
配置浏览器或应用使用本地代理:
- 地址:127.0.0.1
- 端口:9999
-
访问网站验证:
- 正常流量状态码应为200
- 每次请求IP都会改变(腾讯云出口IP)
6. 验证IP变化
-
在VPS上启动简单HTTP服务:
python -m http.server 1234 -
通过代理访问VPS服务
-
检查VPS日志,确认每次请求来源IP不同
7. 技术原理
-
请求流程:
- 本地应用 → mitmproxy拦截 → 转发到云函数
- 云函数执行请求 → 返回结果给mitmproxy
- mitmproxy返回给应用
-
IP变化机制:
- 云函数每次执行可能使用不同出口IP
- 模拟了代理池的效果
-
安全机制:
- SCF_TOKEN验证确保只有授权客户端可以使用
- 数据通过base64和pickle序列化传输
8. 注意事项
- 免费额度:新用户可试用三个月云函数服务
- 性能限制:注意云函数的执行时间和内存限制
- 合规使用:遵守云服务商和网站的使用条款
- HTTPS支持:必须安装mitmproxy证书才能代理HTTPS流量
- 错误处理:注意处理超时和认证失败的情况
9. 替代方案比较
| 方法 | 优点 | 缺点 |
|---|---|---|
| 云函数代理 | 免费额度可用,IP自动变化 | 需要技术配置 |
| 手机热点 | 简单直接 | 需要手动切换,不稳定 |
| 商业代理池 | 专业稳定 | 需要付费 |
10. 扩展应用
此技术还可用于:
- 爬虫开发避免IP封锁
- 访问地域限制内容
- 安全测试中的源IP隐藏
- 分布式请求测试
通过以上详细配置,您可以成功搭建一个基于云函数的动态IP代理系统,有效绕过IP封锁限制。