SRS 流媒体服务器安全策略完全指南:基于 vhost 的 allow/deny 客户端访问控制
2026/9/10 22:01:51 网站建设 项目流程

SRS 流媒体服务器安全策略完全指南:基于 vhost 的 allow/deny 客户端访问控制

【免费下载链接】srsSRS is a simple, high-performance, AI-driven real-time media server supporting RTMP, WebRTC, HLS, HTTP-FLV, HTTP-TS, SRT, MPEG-DASH, and GB28181, with codec support for H.264, H.265, AV1, VP9, AAC, Opus, and G.711.项目地址: https://gitcode.com/GitHub_Trending/sr/srs

SRS(Simple Realtime Server)通过 vhost 级security配置块,提供一套简单而有效的客户端访问控制策略,支持按播放(play)与推流(publish)两类操作,对指定 IP 或 CIDR 网段执行 allow(放行)或 deny(拒绝)。本文以仓库中的官方文档 security.md 为核心骨架,结合 srs_app_security.cpp 源码与 security.deny.publish.conf 示例配置,完整讲解配置语法、匹配规则、源码判定流程、客户端踢出 API 以及热加载行为,帮助你在生产环境中精确控制哪些客户端可以拉流、哪些可以推流。

一、功能概述与适用场景

SRS 的 vhost 安全策略(security)用于允许或拒绝特定客户端的接入,是一种位于应用层的访问控制机制。它直接作用于连接建立阶段:当客户端尝试推流或拉流时,SRS 会根据其来源 IP 与配置的规则逐条比对,决定是放行还是拒绝。

典型适用场景包括:

  • 只允许内网推流:禁止公网任意 IP 向源站推流,仅放行内网编码器或边缘节点(如10.0.0.0/8);
  • 限制播放来源:仅允许指定 IP 或网段拉流,防止盗链与资源滥用;
  • 默认拒绝策略:开启安全后默认拒绝一切,再以 allow 规则白名单方式放行可信客户端,实现"默认安全"。

该功能由SrsSecurity类实现(srs_app_security.hpp),它在 RTMP、HTTP-FLV、HLS、SRT、RTC、RTSP 等多协议连接中统一被调用,是 SRS 全局连接入口处的通用防线。

二、配置详解:vhost 下的 security 块

安全策略以 vhost 为作用域进行配置。官方文档给出的完整模板如下:

vhost your_vhost { # security for host to allow or deny clients. security { # whether enable the security for vhost. # default: off enabled on; # the security list, each item format as: # allow|deny publish|play all|<ip or cidr> # for example: # allow publish all; # deny publish all; # allow publish 127.0.0.1; # deny publish 127.0.0.1; # allow publish 10.0.0.0/8; # deny publish 10.0.0.0/8; # allow play all; # deny play all; # allow play 127.0.0.1; # deny play 127.0.0.1; # allow play 10.0.0.0/8; # deny play 10.0.0.0/8; # SRS apply the following simple strategies one by one: # 1. allow all if security disabled. # 2. default to deny all when security enabled. # 3. allow if matches allow strategy. # 4. deny if matches deny strategy. allow play all; allow publish all; } }

2.1 关键配置参数

参数取值默认值说明
enabledon/offoff是否启用该 vhost 的安全策略。默认关闭,此时对所有客户端放行
allow/deny动作关键字声明一条放行/拒绝规则
规则第一参数(arg0play/publish规则作用的对象类型:play表示拉流播放,publish表示推流发布
规则第二参数(arg1all/ 单个 IP / CIDR 网段规则的匹配目标,all匹配任意 IP,也支持127.0.0.110.0.0.0/8这类 IPv4 地址或网段

2.2 判定策略(文档明示的四大规则)

SRS 依次应用如下简单策略:

  1. 安全关闭则全部放行enabled off时,不检查任何规则,所有客户端均被允许;
  2. 安全开启默认全拒:一旦enabled on,若没有匹配到任何 allow 规则,则默认拒绝(default deny);
  3. 命中 allow 规则则放行:客户端 IP 与某条 allow 规则匹配,则允许接入;
  4. 命中 deny 规则则拒绝:客户端 IP 与某条 deny 规则匹配,则拒绝接入。

2.3 仓库自带示例:security.deny.publish.conf

官方文档明确指向示例配置文件 security.deny.publish.conf,该文件演示了"允许播放、拒绝推流"的经典配置:

# security config for srs, allow play and deny publish. max_connections 1000; daemon off; srs_log_tank console; # RTMP server configuration rtmp { listen 1935; } vhost __defaultVhost__ { security { enabled on; deny publish all; allow play all; } }

这份配置的含义是:

  • 在默认 vhost__defaultVhost__上启用安全策略;
  • deny publish all:拒绝所有 IP 推流(禁止发布);
  • allow play all:放行所有 IP 播放(拉流不受限)。

实际效果即"任何人可看、不可推",非常适合公网只读直播场景。运行方式:./objs/srs -c conf/security.deny.publish.conf

三、源码级原理:规则如何被解析与执行

3.1 配置读取

配置加载时,srs_app_config.cpp 提供两个访问接口:

  • get_security_enabled(vhost):读取 vhost 下security.enabled,若未配置或参数为空,返回默认值falseSRS_CONF_PREFER_FALSE语义);
  • get_security_rules(vhost):返回 vhost 下的security指令块,即全部 allow/deny 规则集合。

这印证了文档中"默认 off"的约定:配置解析层直接以false作为缺省值。

3.2 核心检查流程

SrsSecurity::check()是统一入口(srs_app_security.cpp),完整判定逻辑如下:

  1. get_security_enabled(req->vhost_)为假,直接返回成功(放行),对应策略 1;
  2. 否则取出规则集合,交给do_check()
  3. do_check()中先执行deny_check():遍历所有deny规则,若类型匹配(play/publish)且 IP 命中(all、精确 IP 或 CIDR 网段),立即返回ERROR_SYSTEM_SECURITY_DENY拒绝;
  4. 再执行allow_check():遍历所有allow规则,若命中则放行;若存在 allow 规则但全部未命中,返回ERROR_SYSTEM_SECURITY_ALLOW拒绝。

值得注意的是do_check()的开头:若 vhost 下不存在security规则块,直接返回 "default deny for %s"(srs_app_security.cpp),这就是策略 2 的源码体现——开启 enabled 后若拿不到规则即默认拒绝

3.3 IP 匹配与 CIDR 支持

allow_check()deny_check()均通过srs_net_get_cidr_ipv4/srs_net_get_cidr_mask解析规则中的 IP 参数,再调用srs_net_ipv4_within_mask判断客户端 IP 是否落在网段内(srs_app_security.cpp)。支持三种匹配形式:

  • all:匹配任意来源 IP;
  • 精确 IP:如127.0.0.1,要求与客户端 IP 完全相等;
  • CIDR 网段:如10.0.0.0/8,按掩码计算是否在网段内。

3.4 连接类型映射

源码中的SrsRtmpConnType枚举将各协议的推拉流统一归类(srs_app_security.cpp):

  • play 类SrsRtmpConnPlaySrsHlsPlaySrsFlvPlaySrsRtcConnPlaySrsSrtConnPlay,对应 RTMP、HLS、HTTP-FLV、WebRTC、SRT 的播放;
  • publish 类SrsRtmpConnFMLEPublishSrsRtmpConnFlashPublishSrsRtmpConnHaivisionPublishSrsRtcConnPublishSrsSrtConnPublish,对应 FMLE、Flash、Haivision 等 RTMP 推流以及 RTC、SRT 推流。

因此一条play/publish规则会同时作用于多个协议,配置一次即可统一管控。

3.5 多协议接入点

从源码调用点可以看出该安全机制覆盖的协议面:

  • RTMP:SrsRtmpConn::service_playing/ 连接初始化处调用security_->check(info_->type_, ip_, req)(srs_app_rtmp_conn.cpp);
  • HTTP-FLV:SrsHttpStreamMuxsecurity_->check(SrsFlvPlay, ...)(srs_app_http_stream.cpp);
  • HLS:SrsHttpStaticServersecurity_->check(SrsHlsPlay, ...)(srs_app_http_static.cpp);
  • WebRTC:SrsRtcApi在播放与推流 API 中分别调用(srs_app_rtc_api.cpp 与 srs_app_rtc_api.cpp);
  • SRT:SrsSrtConn对推流、播放分别检查(srs_app_srt_conn.cpp);
  • RTSP:SrsRtspConnection在播放路径检查,并将ERROR_SYSTEM_SECURITY_DENY映射为 HTTP 403 Forbidden 响应(srs_app_rtsp_conn.cpp)。

四、错误码与故障排查

被安全策略拒绝时,SRS 内部使用统一错误码标识(srs_kernel_error.hpp):

错误码名称含义
ERROR_SYSTEM_SECURITY1052SecurityCheck安全检查失败(如开启后无规则可用的默认拒绝)
ERROR_SYSTEM_SECURITY_DENY1053SecurityDeny命中 deny 规则被拒绝
ERROR_SYSTEM_SECURITY_ALLOW1054SecurityAllow存在 allow 规则但未命中而被拒绝

排查思路:开启安全后客户端被拒,优先检查 vhost 名称是否匹配、enabled on是否生效、allow/deny 规则的 play/publish 类型是否与客户端行为一致、IP 是否精确落入配置的网段。

五、配合 HTTP API 踢出客户端

除了被动拦截,SRS 还提供主动管理手段——通过 HTTP API 将已连接的客户端踢下线。官方文档 http-api.md 给出了完整流程:

DELETE /api/v1/clients/{id}

操作步骤:

  1. 获取客户端 id:GET /api/v1/clients
  2. 或从流信息中获取推流端 id:GET /api/v1/streams/GET /api/v1/streams/6745,其中stream.publish.cid即为推流客户端的 cid;
  3. 对指定 id 发起DELETE /api/v1/clients/{id}即可踢出该客户端。

安全策略负责"入口拦截",kickoff API 负责"事后清场",两者配合可实现完整的客户端生命周期管控。

六、热加载行为与注意事项

文档明确指出:reload 安全配置后,只对新接入的客户端生效(Security config reload only effects the new clients)。这意味着:

  • 已建立的播放/推流连接不受 reload 影响,不会被中途断开;
  • 修改allow/deny规则或enabled后,需等待新连接建立才体现新策略;
  • 若需要立即对所有客户端生效,应配合第五节的 kickoff API 将存量客户端踢出,再让其按新规则重连。

该行为与SrsSecurity每次在连接建立时读取配置的设计一致:check()在连接处理路径中实时调用get_security_enabled/get_security_rules(srs_app_security.cpp),无需重启进程,配置变更即时影响后续连接。

七、综合配置示例

将上述知识组合,给出一个"内网可推、白名单可拉、其余拒绝"的生产级 vhost 安全配置:

vhost live { security { enabled on; # 默认拒绝:不匹配任何 allow 的连接将被拒绝 # 仅允许内网编码器/边缘节点推流 allow publish 10.0.0.0/8; allow publish 192.168.0.0/16; # 仅允许白名单网段播放 allow play 10.0.0.0/8; allow play 203.0.113.0/24; # 显式拒绝公网推流(与默认拒绝叠加,更明确) deny publish all; } }

要点回顾:

  • enabled on是启用开关,缺省为 off;
  • 规则格式固定为allow|deny play|publish all|<ip>|<cidr>
  • 判定顺序为"先 deny 后 allow",开启安全后默认拒绝;
  • 生效范围为整个 vhost,跨 RTMP/HLS/FLV/RTC/SRT/RTSP 多协议统一执行;
  • reload 只影响新连接,存量连接需用DELETE /api/v1/clients/{id}主动踢出。

【免费下载链接】srsSRS is a simple, high-performance, AI-driven real-time media server supporting RTMP, WebRTC, HLS, HTTP-FLV, HTTP-TS, SRT, MPEG-DASH, and GB28181, with codec support for H.264, H.265, AV1, VP9, AAC, Opus, and G.711.项目地址: https://gitcode.com/GitHub_Trending/sr/srs

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询