如何阻止服务器上所有网站的用户代理?

如何阻止服务器上所有网站的用户代理?

我最初发布于webmasters.stackexchange.com,但有人告诉我,在这里我会得到更好的接待。


在过去的几天里,我遭受了似乎是(可能是无意的)DDOS 攻击。我收到了来自标识为“Mozilla/4.0(兼容;ICS)”的代理的大量请求,以至于 Apache 耗尽了所有可用内存。

因此,我想阻止所有伴随此用户代理的请求,所以我尝试在 httpd.conf 中执行此操作:

SetEnvIfNoCase User-Agent "Mozilla/4.0 (compatible; ICS)" bad_user
Deny from env=bad_user

但是当我重新启动 Apache 时,它​​会抱怨deny此处的使用。无需将其包装在locationdirectory块中(这意味着我必须为每个站点添加一个新块),有什么方法可以拒绝对整个服务器的访问吗?


更新:我收到的错误

  • 重新启动 Web 服务器 apache2
    /etc/apache2/httpd.conf 第 4 行语法错误:此处不允许拒绝 [失败]

答案1

现在看起来像是一个老问题,但我想做同样的事情,并从上面的神经中找到了答案。它并不完全正确 - 在我看来应该是<Location "/">,并且SetEnvIf需要一个正则表达式,因此括号需要用引号引起来。

这对我来说可以在所有虚拟主机上应用访问控制:

SetEnvIfNoCase User-Agent "^Mozilla/4.0 \(compatible; Synapse\)" bad_ua
<Location "/">
    Deny from env=bad_ua
</Location>

只需将其包含在 vhost 定义之前即可。

答案2

mod_rewrite 可以根据文档在服务器级别进行配置:

RewriteCond %{HTTP_USER_AGENT} "Mozilla/4\.0 \(compatible; ICS\)" [nocase]
RewriteRule ^.*$ - [forbidden,last]

不要忘记在RewriteCond

答案3

如果 SetEnv 行上的语法正确,您应该能够像这样将其放入配置文件中:

<Location *>
SetEnvIfNoCase User-Agent "Mozilla/4.0 (compatible; ICS)" bad_user
Deny from env=bad_user
</Location>

应该允许在所有虚拟主机上运行 - 刚刚在 2.2.24 上测试过,效果很好。

相关内容