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 关键配置参数
| 参数 | 取值 | 默认值 | 说明 |
|---|---|---|---|
enabled | on/off | off | 是否启用该 vhost 的安全策略。默认关闭,此时对所有客户端放行 |
allow/deny | 动作关键字 | 无 | 声明一条放行/拒绝规则 |
规则第一参数(arg0) | play/publish | 无 | 规则作用的对象类型:play表示拉流播放,publish表示推流发布 |
规则第二参数(arg1) | all/ 单个 IP / CIDR 网段 | 无 | 规则的匹配目标,all匹配任意 IP,也支持127.0.0.1、10.0.0.0/8这类 IPv4 地址或网段 |
2.2 判定策略(文档明示的四大规则)
SRS 依次应用如下简单策略:
- 安全关闭则全部放行:
enabled off时,不检查任何规则,所有客户端均被允许; - 安全开启默认全拒:一旦
enabled on,若没有匹配到任何 allow 规则,则默认拒绝(default deny); - 命中 allow 规则则放行:客户端 IP 与某条 allow 规则匹配,则允许接入;
- 命中 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,若未配置或参数为空,返回默认值false(SRS_CONF_PREFER_FALSE语义);get_security_rules(vhost):返回 vhost 下的security指令块,即全部 allow/deny 规则集合。
这印证了文档中"默认 off"的约定:配置解析层直接以false作为缺省值。
3.2 核心检查流程
SrsSecurity::check()是统一入口(srs_app_security.cpp),完整判定逻辑如下:
- 若
get_security_enabled(req->vhost_)为假,直接返回成功(放行),对应策略 1; - 否则取出规则集合,交给
do_check(); do_check()中先执行deny_check():遍历所有deny规则,若类型匹配(play/publish)且 IP 命中(all、精确 IP 或 CIDR 网段),立即返回ERROR_SYSTEM_SECURITY_DENY拒绝;- 再执行
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 类:
SrsRtmpConnPlay、SrsHlsPlay、SrsFlvPlay、SrsRtcConnPlay、SrsSrtConnPlay,对应 RTMP、HLS、HTTP-FLV、WebRTC、SRT 的播放; - publish 类:
SrsRtmpConnFMLEPublish、SrsRtmpConnFlashPublish、SrsRtmpConnHaivisionPublish、SrsRtcConnPublish、SrsSrtConnPublish,对应 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:
SrsHttpStreamMux中security_->check(SrsFlvPlay, ...)(srs_app_http_stream.cpp); - HLS:
SrsHttpStaticServer中security_->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_SECURITY | 1052 | SecurityCheck | 安全检查失败(如开启后无规则可用的默认拒绝) |
ERROR_SYSTEM_SECURITY_DENY | 1053 | SecurityDeny | 命中 deny 规则被拒绝 |
ERROR_SYSTEM_SECURITY_ALLOW | 1054 | SecurityAllow | 存在 allow 规则但未命中而被拒绝 |
排查思路:开启安全后客户端被拒,优先检查 vhost 名称是否匹配、enabled on是否生效、allow/deny 规则的 play/publish 类型是否与客户端行为一致、IP 是否精确落入配置的网段。
五、配合 HTTP API 踢出客户端
除了被动拦截,SRS 还提供主动管理手段——通过 HTTP API 将已连接的客户端踢下线。官方文档 http-api.md 给出了完整流程:
DELETE /api/v1/clients/{id}操作步骤:
- 获取客户端 id:
GET /api/v1/clients; - 或从流信息中获取推流端 id:
GET /api/v1/streams/GET /api/v1/streams/6745,其中stream.publish.cid即为推流客户端的 cid; - 对指定 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),仅供参考