我的服务器遭受了严重攻击。大多数请求都来自以下方式:
46.43.84.214 - - [15/May/2012:11:21:45 +0400] "GET / HTTP/1.0" 200 65859 "2r4k68998q24ay.ru" "Mozilla/4.0 (compatible; MSIE 4.01; Vonna.com b o t)"
所有此类请求的 HTTP 协议版本都相同。我能以某种方式在 Web 服务器级别阻止 HTTP 1.0 请求吗?我曾尝试过以下方法来消除攻击(重定向到空文件):
if ($server_protocol ~* "HTTP/1.0") {
rewrite ^/ http://example.com/white.txt;
}
似乎没有多大帮助,我在日志中没有看到任何此类重定向。我使用 nginx 1.0.9 作为 Apache 2.2.3 的反向代理。
任何帮助都将受到赞赏。
答案1
你可以使用类似这样的东西
if ($http_user_agent ~* "Vonna.com" ) {
return 444;
}
444 将关闭连接而不返回任何内容,从而确保影响最小。不过,如果您想通知可能的合法用户,可以使用 400 之类的代码。
此外,也许可以通过引荐来源进行阻止,尽管大多数机器人也会轻易地欺骗这一点。
至于阻止整个 HTTP 1.0,你应该检查这首先。如果您仍想将该块作为临时解决方案来实现,那么类似这样的方法应该可行。
if ($server_protocol ~* "HTTP/1.0") {
return 444;
}
基本上和你所拥有的东西是一样的,只是没有重写 - 如果我读得正确的话,你的使用使它停留在永久循环中。
答案2
这对我来说适用于 Nginx 1.8。
if ($server_protocol = HTTP/1.0) {
return 444;
}
我这么做的理由不同。Qualys 威胁报告在我的服务器上检测到 CVE-2000-0649,“允许远程攻击者通过 HTTP 1.0 请求获取服务器的内部 IP 地址”。我可以自由地这样做,因为我们的网站仅支持有限的浏览器。
答案3
使用正确的变量:$server_protocol
而不是$http_user_agent
。