拓冰建站拓冰建站
首页 / 资讯中心 / 正文

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

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/srsSRSSimple 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.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若未配置或参数为空返回默认值falseSRS_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 %ssrs_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.cppplay 类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 多协议接入点从源码调用点可以看出该安全机制覆盖的协议面RTMPSrsRtmpConn::service_playing/ 连接初始化处调用security_-check(info_-type_, ip_, req)srs_app_rtmp_conn.cppHTTP-FLVSrsHttpStreamMux中security_-check(SrsFlvPlay, ...)srs_app_http_stream.cppHLSSrsHttpStaticServer中security_-check(SrsHlsPlay, ...)srs_app_http_static.cppWebRTCSrsRtcApi在播放与推流 API 中分别调用srs_app_rtc_api.cpp 与 srs_app_rtc_api.cppSRTSrsSrtConn对推流、播放分别检查srs_app_srt_conn.cppRTSPSrsRtspConnection在播放路径检查并将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}操作步骤获取客户端 idGET /api/v1/clients或从流信息中获取推流端 idGET /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_rulessrs_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),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门