有没有可能为多个 ip 建立安全链接的方法?

Any posible way to make secure links for multiple ips?

我是 运行 一个使用 Nginx 的 CDN 系统,我需要保护我的链接,这样它们就不会在用户之间共享。

当前配置完美运行..

# Setup Secure Links
secure_link      $arg_md5,$arg_expires;
secure_link_md5  "$secure_link_expires$uri$remote_addr secret";

if ($secure_link = "") { return 403; }
if ($secure_link = "0") { return 410; }

然而,随着互联网变得越来越移动化,现在许多用户来自大学校园等,我看到大量失败的请求,并且最终用户很恼火,因为请求者的 IP 在请求之间发生了变化。

请求的 IP 几乎总是在同一范围内,例如:

Original Request: 192.168.0.25
File Request:     192.168.0.67

我很乐意将这些安全链接锁定在一个范围内,例如

192.168.0.0 - 192.168.0.255

或者更进一步,让它变得更大

192.168.0.0 - 192.168.255.255

但我想不出在 nginx 中执行此操作的方法,或者 secure_link 功能是否支持此操作。

如果这不可能 - 是否有人对如何保护限制较少但仍相当安全的链接有任何其他想法?我看过使用浏览器字符串来代替,但我们的许多用户都有下载管理器或使用第三部分桌面客户端 - 所以这是不可行的。

我非常想在不需要任何动态代码来检查远程数据库的情况下执行此操作,因为这是非常大的容量,我宁愿没有这种依赖性。

您可以在 Nginx 中使用多个 auth 指令,因此您可以从安全 link 中删除 IP 并将其指定为单独的指令。

Nginx 使用 CIDR 范围,因此对于您的示例,它只是

的情况
allow 192.168.0.0/16;
deny all;

您可以使用地图方法

map $remote_addr $auth_addr {
    default         $remote_addr;
    ~*^192\.168\.100     192.168.100;
    ~*^192\.169     192.169;
}

然后再用点东西

secure_link_md5  "$secure_link_expires$uri$auth_addr secret";

我没有使用过这种方法,但我认为它应该有效。如果没有,请告诉我

感谢@Tarun Lalwani 指出地图的想法,我成功地完成了这项工作。

# This map breaks down $remote_addr into octets 
map $remote_addr $ipv4_first_two_octets {
  "~(?<octet1>\d+)\.(?<octet2>\d+)\.(?<octet3>\d+)\.(?<octet4>\d+)" "${octet1}.${octet2}";
  default "0.0";
}


location / {
  # Setup Secure Links secure_link $arg_md5,$arg_expires;
  secure_link_md5 "$secure_link_expires$uri$ipv4_first_two_octets secret";
}