在 nginx 中阻止 URL 的最佳方法是什么?

在 nginx 中阻止 URL 的最佳方法是什么?

我们的一些 URL 的流量异常大,例如:

http://www.example.com/search.php?type=0&mode=search&searchterm=Little

http://www.example.com/product.php?productid=12345678

在 nginx 中阻止这些 URL 的最佳方法是什么?

还有其他建议可以限制特定页面每秒/分钟的连接数量吗?

答案1

如果传入流量确实不寻常,并且您确信该流量是垃圾邮件,请考虑在防火墙上阻止它。 您可以在堆栈中拒绝流量的位置越低越好。 例如iptables -A INPUT -s 1.1.1.1 -j DROP。 当然,1.1.1.1用有问题的 IP 地址替换。

一个更广泛的工具来保护你的服务器免受可疑的传入连接失败2ban。您还可以制定特定于 Nginx 的规则。Fail2ban 可以保护您免受多种不同的攻击,而不仅仅是解决您的特定问题。

对于特定于 Nginx 的解决方案,它附带一个名为的模块ngx_http_access_module,允许您根据 IP 地址允许或拒绝访问。您将打开nginx.conf并添加include blockips.conf;然后在 Nginx 配置文件所在的位置创建 blockips.conf。可能是/usr/local/nginx/conf/。最后,根据需要添加拒绝配置:

deny 1.1.1.1;
deny 2.2.2.0/24;
deny 3.3.0.0/16;

答案2

使用同样的原则,http://www.sonassi.com/knowledge-base/maintenance-page-with-nginx-with-specific-permitted-access/http://wiki.nginx.org/HttpLimitReqModule

以下代码将允许您禁止特定 IP 访问这些 URL,并对其他尝试访问这些 URL 的任何人进行速率限制。

http {
...
limit_req_zone  $binary_remote_addr  zone=one:10m   rate=1r/s;
...
server {
..
 set $deny_access off;

  if ($remote_addr ~ (bad.ip.add.ress|second.bad.ipadd.ress|third.bad.ipadd.ress)) {
   set $deny_access on;
  }
  if ($uri ~ "^/(search\.php|product\.php)\?(type=[0-9]+&mode=[a-z]+searchterm=(.*)+|productid=[0-9]+)$" ) {
   limit_req   zone=one  burst=5;
   set "${$deny_access}on";
  }
  if ($deny_access = onon) {
   return 503;
  }
  location /deny_access{
  }
  error_page 503 @deny_access;
  location @deny_access {
   rewrite ^(.*)$ /deny.html break;
 }
..
}
..
}

答案3

http://nginx.org/en/docs/http/ngx_http_rewrite_module.html#return: «…此外,非标准代码444 关闭连接而不发送响应头。 …”

— 因此您只需定义那些特定位置并return 444在那里使用。

还有其他建议可以限制特定页面每秒/分钟的连接数量吗?

姆戈文已经指出你已经在了。

答案4

您还可以使用限制请求数模块来限制每个源IP访问某些路径的速率。

相关内容