如何在Nginx上保护直播流,防止其他网站盗用?
解决Nginx上.m3u8直播流被盗用的方案
针对你的.m3u8流被盗用导致的负载过高、带宽耗尽问题,以下是几种逐步增强的防护方案,可根据需求组合使用:
1. 基础防护:通过Referer请求头限制访问
这是最快实现的方法,通过校验请求的Referer字段,仅允许来自自身域名的请求访问.m3u8文件:
server { # 保留你原有的server配置(监听端口、域名、根目录等) location ~* \.m3u8$ { # 替换为你的实际域名,支持泛域名 valid_referers none blocked your-domain.com *.your-domain.com; # 若Referer不在允许列表内,返回403禁止访问 if ($invalid_referer) { return 403; } # 可选:添加缓存控制头,避免客户端重复请求 add_header Cache-Control "no-store, no-cache"; } }
none:允许无Referer的请求(比如你自己的播放器直接发起的请求)blocked:允许Referer被防火墙/代理移除的合法请求- 替换
your-domain.com为你实际的域名,泛域名*.your-domain.com支持子域名访问
2. 进阶防护:Token签名验证(防Referer伪造)
由于Referer字段可以被伪造,更安全的方式是为合法请求生成带签名的Token,Nginx校验Token有效性后才允许访问:
示例配置(基础版)
假设你的后端会为合法请求生成包含时间戳的签名Token,通过URL参数token传递:
server { # 原有server配置 location ~* \.m3u8$ { # 初始化允许标记 set $allowed 0; # 校验Token(替换为你的签名验证逻辑,比如结合时间戳防止过期) # 示例:假设有效Token是通过"密钥+时间戳"生成的哈希值 if ($arg_token = "your-valid-signature") { # 可选:校验时间戳参数$arg_ts,确保请求未过期(比如10分钟内) if ($arg_ts ~ "^[0-9]+$") { set $current_time "%s"; if ($arg_ts > $current_time - 600) { set $allowed 1; } } } # Token验证失败则返回403 if ($allowed = 0) { return 403; } # 同时保留Referer校验作为第二层防护 valid_referers none blocked your-domain.com *.your-domain.com; if ($invalid_referer) { return 403; } } }
更灵活的实现(依赖Nginx模块)
如果你的Nginx安装了ngx_http_lua_module或ngx_http_set_misc_module,可以编写更复杂的签名验证逻辑,比如实时计算哈希值对比,避免硬编码Token。
3. 辅助防护:限制单IP请求频率
即使防盗链生效,大量合法请求也可能压垮服务器,通过限流缓解负载:
# 在http块下定义限流规则 limit_req_zone $binary_remote_addr zone=m3u8_limit:10m rate=3r/s; server { # 原有server配置 location ~* \.m3u8$ { # 应用限流:每秒允许3次请求,突发最多10次(超出直接拒绝) limit_req zone=m3u8_limit burst=10 nodelay; # 结合前面的Referer/Token验证 valid_referers none blocked your-domain.com *.your-domain.com; if ($invalid_referer) { return 403; } } }
4. 额外增强:配合HTTPS与CORS
- 强制使用HTTPS:防止请求被中间人篡改Referer或Token
- 配置CORS规则:仅允许自身域名的前端跨域请求访问流文件
location ~* \.m3u8$ { # 原有防护配置... add_header Access-Control-Allow-Origin "https://your-domain.com"; add_header Access-Control-Allow-Methods "GET, HEAD"; }
注意事项
- 修改配置后,执行
nginx -t校验配置合法性,再执行nginx -s reload生效 - 测试时可使用
curl -H "Referer: https://evil-domain.com" https://your-domain.com/stream.m3u8验证防盗链是否生效 - 若你的直播流包含.ts分片文件,需要将防护规则同时应用到
.ts后缀的文件
内容的提问来源于stack exchange,提问作者alaa alaa
相关产品推荐
相关产品推荐

