Nginx 有没有可能为多个IP建立安全链接?

Nginx 有没有可能为多个IP建立安全链接?,nginx,cdn,Nginx,Cdn,我正在运行一个使用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") { r

我正在运行一个使用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中实现这一点的方法,或者安全链接功能是否支持这一点

如果这是不可能的-有没有人对如何保护限制较少但仍然相当安全的链接有任何其他想法?我曾考虑过使用浏览器字符串,但我们的许多用户都有下载管理器或使用第三方桌面客户端,因此这是不可行的


我非常努力地做到这一点,而不必使用任何动态代码来检查远程数据库,因为这是一个非常大的容量,我不希望有这种依赖性

您可以在Nginx中使用多个auth指令,因此可以从安全链接中删除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";
}
#此映射将$remote_addr分解为八位字节
映射$remote\u addr$ipv4\u第一个\u两个\u八位字节{
“(?\d+)\(?\d+)\(?\d+)\(?\d+)”${octet1}.${octet2}”;
默认值为“0.0”;
}
地点/{
#设置安全链接安全链接$arg\u md5,$arg\u过期;
安全链接md5“$secure\u link\u expires$uri$ipv4\u first\u two\u octets secret”;
}

为什么不将
$remote\u addr
替换为另一个只有?IP的前2/3部分?看起来可能有用-你以前做过吗?看起来需要正则表达式来分离IP。如果你已经这样做了,你可以共享配置吗?问题是这需要是动态的-我在全球范围内提供数千次并发下载。哦,对不起,当你说
请求的IP几乎总是在同一范围内时,然后引用了一个IP范围,我假设一个包含该范围的解决方案是可以接受的谢谢,我现在已经让它工作了,我已经在下面发布了工作配置。