1.1 检查系统版本与网络:登录新加坡服务器(例如Ubuntu 22.04),执行 sudo lsb_release -a 与 ip addr,确认公网IP与内部网口。
1.2 更新系统包:执行 sudo apt update && sudo apt upgrade -y,重启(如内核更新)sudo reboot。
1.3 备份当前配置:将 /etc、/var/www、/etc/nginx 等目录打包备份:sudo tar czf /root/config-backup-$(date +%F).tgz /etc /var/www。
2.1 创建普通管理用户并设置 sudo:sudo adduser deploy && sudo usermod -aG sudo deploy。
2.2 配置 SSH 密钥登录(推荐 ed25519):在本地生成 ssh-keygen -t ed25519,然后将公钥复制到服务器:ssh-copy-id -i ~/.ssh/id_ed25519.pub deploy@your_ip。
2.3 修改 /etc/ssh/sshd_config:将 PermitRootLogin no、PasswordAuthentication no、ChallengeResponseAuthentication no、UseDNS no,建议更换端口 Port 22022。保存后 sudo systemctl restart sshd。
3.1 安装并配置 UFW(简易): sudo apt install ufw -y sudo ufw default deny incoming sudo ufw default allow outgoing sudo ufw allow 22022/tcp (若修改SSH端口) sudo ufw allow 80,443/tcp sudo ufw enable
3.2 安装 fail2ban 并启用常见规则: sudo apt install fail2ban -y 在 /etc/fail2ban/jail.d/ 创建自定义 jail.local,启用 sshd、nginx-http-auth 等,并设置 bantime、maxretry。
3.3 针对管理面板或API添加 geo-block 或白名单 IP(在 UFW 或云防火墙层面)以限制只允许信任 IP 访问。
4.1 配置 HTTP 安全头:在 server 块添加 add_header X-Frame-Options "DENY"; add_header X-Content-Type-Options "nosniff"; add_header Referrer-Policy "no-referrer-when-downgrade";
4.2 限制请求体和超时:client_max_body_size 50M; client_body_timeout 20s; keepalive_timeout 10s; 以防大流量攻击。
4.3 日志与轮转:确认 /var/log/nginx/access.log 与 error.log 存在,配置 logrotate(/etc/logrotate.d/nginx)每日轮转并压缩保留策略。
5.1 最简单的 Referer 黑名单/白名单: 在 nginx 配置 server{} 或 location 中加入: location ~* \.(mp4|m3u8|jpg|png|webm)$ { valid_referers none blocked example.com *.example.com; if ($invalid_referer) { return 403; } try_files $uri =404; }
5.2 注意:Referer 可伪造,仅作为第一道防线。结合下述签名 URL 更可靠。
6.1 思路:对原始资源 URL 加入时间戳与签名 token,Nginx/应用服务器校验签名与过期时间后允许访问。
6.2 后端生成签名(示例 PHP): $path = "/media/video.mp4"; $expires = time() + 300; // 5分钟有效 $secret = "YOUR_SECRET"; $token = hash_hmac('sha256', $path . $expires, $secret); $signed_url = "https://cdn.example.com{$path}?e={$expires}&t={$token}";
6.3 Nginx 校验(示例,需编译 ngx_http_secure_link_module 或用 ngx_http_lua_module): # 使用 secure_link/secure_link_md5 secure_link $arg_t,$arg_e; secure_link_md5 "$request_uri$arg_eYOUR_SECRET"; if ($secure_link = "") { return 403; } if ($secure_link = "0") { return 403; }
6.4 若无法使用模块,可在后端(应用层)校验 token,然后通过 X-Accel-Redirect 将请求内部转发给 Nginx 的受保护路径(见下一节)。
7.1 将媒体文件放在 Nginx 外部目录(如 /var/protected_media),通过 Nginx 的内部 location 提供: location /protected_media/ { internal; alias /var/protected_media/; }
7.2 后端在校验签名/权限后,返回响应头: X-Accel-Redirect: /protected_media/video.mp4 Nginx 会内部读取文件并返回,用户无法直接绕过后端直接访问文件。
7.3 结合 Nginx 缓存和静态分发:对高并发媒体使用 X-Accel-Redirect + sendfile + sendfile_max_chunk 设置,提升效率。
8.1 使用 CDN(如 Cloudflare、Akamai 或国内第三方)将签名 URL 在边缘校验,减少源站压力。配置 CDN 的 Signed URL 或 Token 功能。
8.2 在 CDN 或 Nginx 层面配置速率限制: limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s; 在 location 中:limit_req zone=one burst=10 nodelay;
8.3 地理限制:若需阻断特定国家/地区,通过 CDN 控制台或 Nginx GeoIP2 模块拒绝访问或返回验证码验证。
9.1 HLS AES-128 或 SAMPLE-AES:将密钥服务器放在受保护后端,仅授权用户能取到密钥,密钥 URL 同样使用签名与短时有效策略。
9.2 商业 DRM(Widevine/PlayReady/FairPlay):对于高价值内容建议使用 DRM 服务,用播放器与浏览器/设备的 CDM 集成,避免简单防盗链被绕过。
9.3 水印与追踪:对视频动态打点水印(用户ID或订单号),一旦被盗可追溯源头。
10.1 部署监控(Prometheus + Grafana)与告警(邮件/钉钉/Slack),监测 4xx/5xx、带宽突增、异常 Referer。
10.2 日志审计:定期分析 access.log,筛选大量短时间内带相同 Referer/无 Referer 的请求并加入防火墙黑名单。
10.3 恶意事件响应:准备回滚备份,临时更换签名密钥(使所有旧签名失效),并在 CDN 层面立即封禁异常 IP 段。
问:对于刚部署的极客云播新加坡服务器,第一步应从哪开始配置防盗链?
答:第一步先做好基础安全(SSH 密钥登录、关闭 root、配置防火墙和 fail2ban),然后在 Nginx 层启用 Referer 白名单作为快速防护,同时尽快实现签名 URL 或 X-Accel-Redirect 方案把媒体文件移到受保护目录并通过后端校验后内网转发。
问:签名 URL 如果被用户分享给他人,怎样防止滥用?
答:通过短有效期(如 1~10 分钟)、绑定用户标识(URL 中包含用户ID并用于签名)、IP 绑定(可选)以及在媒体流中添加水印和 DRM 可以显著降低分享滥用的风险。若发现滥用,立即更换签名密钥,使之前签名失效。
问:使用 CDN 后,防盗链策略该如何在 CDN 与源站之间分配?
答:将高性能校验(Referer、速率限制)放在 CDN 边缘,签名与密钥管理仍在源站或受信任的密钥服务端执行。边缘可先过滤大部分无效请求,源站负责最终的签名校验和密钥分发;同时在 CDN 配置回源校验(如将特定头部或 Token 传递到源站)可避免直接绕过。