如何完全断开RTMP模块的publisher推流并阻止其重新连接?
阻止RTMP Publisher重连的解决方案
你之前调用的/control/drop/publisher接口仅能断开当前已建立的推流连接,不会对后续新的推流请求做拦截,只要推流端配置了自动重连逻辑,就会马上重新推流成功。要彻底阻止其接入,可采用以下几种方案:
方法1:业务层动态鉴权封禁(推荐)
在RTMP服务端配置推流鉴权回调,由你的业务服务统一管控推流权限:
- 以常用的
nginx-rtmp-module为例,修改RTMP配置,新增on_publish回调指向你的业务服务接口:rtmp { server { listen 1935; application live { live on; # 所有推流请求先转发到该接口校验 on_publish http://127.0.0.1:你的业务服务端口/rtmp_publish_auth; } } } - 业务服务维护一个推流黑名单列表,支持按流名称、推流端IP、推流鉴权密钥等维度封禁
- 当需要封禁指定流时,将流名
91fde028680ea9a8195d4334e170db7e加入黑名单,后续该推流端发起请求时,业务接口直接返回403状态码,即可拒绝推流 - 该方案灵活度最高,支持细粒度管控,不需要重启或重载流媒体服务配置
方法2:IP层临时封禁
如果仅需要临时封禁,且不需要细粒度管控,可以直接通过防火墙规则拦截推流端IP的访问:
- 封禁命令(以Linux iptables为例,默认RTMP端口为1935):
iptables -I INPUT -s 对应推流端的公网IP -p tcp --dport 1935 -j DROP - 解封命令:
iptables -D INPUT -s 对应推流端的公网IP -p tcp --dport 1935 -j DROP - 注意:如果推流端使用了代理、CDN中转或者和其他合法推流端共用出口IP,该方法会误封其他正常用户,谨慎使用
方法3:流媒体服务自带封禁接口
如果你使用的是SRS等自带流管控能力的流媒体服务,可以直接调用官方提供的禁用流接口,断开连接的同时拦截后续推流请求:http://你的SRS服务地址/api/v1/streams/close?app=live&stream=91fde028680ea9a8195d4334e170db7e
内容的提问来源于stack exchange,提问作者Vuong
相关产品推荐
相关产品推荐

