![如何阻止服务器上所有网站的用户代理?](https://linux22.com/image/800798/%E5%A6%82%E4%BD%95%E9%98%BB%E6%AD%A2%E6%9C%8D%E5%8A%A1%E5%99%A8%E4%B8%8A%E6%89%80%E6%9C%89%E7%BD%91%E7%AB%99%E7%9A%84%E7%94%A8%E6%88%B7%E4%BB%A3%E7%90%86%EF%BC%9F.png)
我最初发布于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
此处的使用。无需将其包装在location
或directory
块中(这意味着我必须为每个站点添加一个新块),有什么方法可以拒绝对整个服务器的访问吗?
更新:我收到的错误
- 重新启动 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 上测试过,效果很好。