我们的一些 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访问某些路径的速率。