使用 nginx 阻止 HTTP 1.0

使用 nginx 阻止 HTTP 1.0

我的服务器遭受了严重攻击。大多数请求都来自以下方式:

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

相关内容