引言
传统IoT→AIoT的转变:视频流成为新的数据入口。
完整链路:设备推流 → 云端录制 → AI分析 → 业务回调。
本文基于SRS,为中小企业提供一个可快速落地的云录制收流网关设计方案。
需要防止什么
收流网关是视频链路的入口,必须在第一道防线挡住两类问题:
1. 非法接入
设备没有经过平台授权,直接用伪造的推流地址或盗用的凭证发起推流。这类攻击的目的是绕过鉴权,占用推流通道或消耗平台资源。
2. 合法接入,但异常推流
设备本身是合法的,凭证也是有效的,但推流行为不符合预期。这类攻击更难防范,因为攻击者可以通过合法途径采购设备、逆向App和设备的交互逻辑,用脚本模拟设备行为。
完整攻防可参考这个专栏:7年打磨全球宠物IoT平台
常见异常模式包括:
-
推流码率远超正常设备(消耗AI token或存储资源)
-
推流时长异常(远超正常录制窗口)
-
非正常触发推流(设备无任何抓取内容)
-
同一设备短时间内频繁推流
这类问题的本质是:设备是合法的,但行为不是平台期望的。
3. 正常推流被挤下线
设备本身是合法的,推流行为也是正常的,但正在进行的推流会话被另一台设备(或脚本)用同一设备编号挤占。
网关设计
第一步:入口控制
设备需要推流时,先向平台申请推流地址和短效凭证。
平台收到请求后,利用 Redis 记录该设备的申请记录,并做窗口期缓存——同一设备在短时间内重复申请,直接拒绝或限流。这一步不是为了挡攻击,是为了防止设备端异常重试,也起到一定的限流作用。
Redis窗口期缓存的实现逻辑:
用设备编号作为 Key,记录上次申请时间。如果当前时间与上次申请时间的间隔小于设定的阈值(比如 30 秒),直接返回“请求过于频繁”。
对于正常设备,推流结束后,该缓存记录早已失效,允许下一次正常申请。
第二步:凭证生成与下发
平台校验通过后,生成一个短效凭证,包含以下信息(推荐用HS256签名或加密Payload):
-
设备编号
-
推流会话ID(唯一标识本次推流)
-
有效期(例如30秒)
-
推流地址中的StreamKey
-
推流时长
凭证有效期覆盖“申请 → 推流开始”的时间窗口,不覆盖整个推流过程——设备拿到凭证后需要在30秒内发起推流,超时失效。凭证仅在推流建立阶段校验。推流建立后,会话状态由SRS维护,不再依赖凭证有效期。这样做可以防止凭证被截获后长时间有效。
平台将推流地址(含StreamKey)和凭证一起返回给设备。
第三步:推流发起与校验
设备拿到推流地址和凭证后,发起推流。推流地址示例:
rtmp://srs-gateway.yourdomain.com:1935/live/{stream_key}?token={凭证}
SRS 收到推流请求时,触发 on_publish 回调,将 token 等信息传给本机部署的 FastAPI 中间人。 FastAPI 根据内置密钥验签,并执行以下校验:
| 校验项 | 说明 |
|---|---|
| Payload 中的 StreamKey 与推流地址中的 StreamKey 是否一致 | 防止凭证被复制到其他推流地址使用 |
| 推流码率是否正常 | 异步校验,见下文 |
| 推流时长是否正常 | 异步校验,见下文 |
| 推流是否重放、重入 | 校验方式,见下文 |
具体实现:基于 Redis 的校验机制
所有校验依赖 Redis 缓存配合逻辑判断,具体实现如下:
-
窗口期频率限制(防高频请求)
使用 Redis 的 ZSET 进行轻量级窗口频率限制,限制对象包含凭证、IP和设备编号:
# 清理窗口外的旧记录 ZREMRANGEBYSCORE key 0 (now - window_time) # 统计窗口内请求数 ZCARD key # 若未超限,记录当前请求 ZADD key now -
凭证与 IP 绑定(防重放) 设备推流时,缓存凭证与 IP 的对应关系。查询缓存时检查 token 是否已被其他 IP 使用,若已被使用则拒绝当前推流请求——防止同一凭证被截获后在不同网络环境中重放。
-
设备编号与推流会话绑定(防重入和挤占)
缓存设备编号与 SRS 内部
stream_id的对应关系。设备推流时,检查缓存中是否已存在stream_id,若存在则调用 SRS API 查询该流是否仍在正常推流:-
若仍在推流,拒绝新推流请求(防止同一设备重复推流)
-
若已断开,允许新推流请求并更新缓存
-
-
推流码率异常检测(防资源滥用)
将 SRS 内部
stream_id插入 Redis 队列,异步程序定期拉取并调用 SRS API 检查推流码率:码率超过正常阈值 → 主动中断推流,记录一次警告(KEY是IP+ 设备编号)
同一设备半小时内累计触发 3 次告警 → 拉黑设备编号 24 小时
注意:拉黑操作针对设备编号,不拉黑 IP,避免误伤同一小区或 NAT 网络下的其他正常设备。
-
推流时长异常检测
缓存
stream_id与推流开始时间的关系,异步检查推流时长是否超过正常录制窗口。异常处理方式与码率异常一致——中断推流、记录警告、累计触发拉黑。
校验全部通过,允许推流;任意一项失败,则拒绝推流,或调用 SRS API 主动断开连接,设备推流失败。
第四步:推流结束清理
设备主动断开推流时,SRS 触发 on_unpublish 回调,通知 FastAPI 中间人推流已结束。平台清理本次推流的会话缓存,释放资源。
如果设备异常断开(网络超时、断电等),SRS 也会在一定超时后触发 on_unpublish,平台同样需要清理状态,防止推流会话残留。
清理内容包括:
-
设备编号与
stream_id的绑定关系 -
凭证与 IP 的绑定关系
-
推流会话相关的临时缓存
第五步:业务回调
-
视频录制完成后,SRS 触发
on_dvr回调,通知 FastAPI 中间人:两种处理路径:
-
直传 OSS:FastAPI 中间人直接上传视频文件到 OSS
-
异步处理:FastAPI 中间人将录制信息推到 MQ,消费者异步下载视频并上传 OSS
上传完成后,OSS 发送事件通知,云函数或平台触发 AI 分析任务。
注意:object_key 内需要包含推流会话 ID,方便平台将分析结果与对应的推流会话关联
-
-
平台侧校验(防盗刷AI):
平台收到 AI 分析结果后,需要校验分析内容与设备申请推流时上报的推流类型是否相关(如移动侦测、计划推流等)。
如果分析结果与推流类型不相关,处理方式与第四步的异常检测一致:
-
记录一次警告(KEY是IP+ 设备编号)
-
1天内累计触发2次后拉黑设备编号
-
24 小时内不允许该设备申请推流
-
总结
一套组合拳打下来,可以在网关层有效防止 AI 服务被非法调用或滥用,降低盗刷风险。
这是 AIoT 时代,中小企业脱离云厂商闭源服务的其中一把钥匙。