我的要求是:
- 在 apache 级别阻止可疑的 ip 地址,我有一个包含数百万个带有 cidr 的 ip 地址的列表。
- 如果被阻止的 IP 访问了网站,那么他们应该会收到一些消息,表明他们被阻止了(我可以使用 ErrorDocument)
- 记录所有被阻止的用户(403 错误文档将重定向到另一个页面并检查该页面的点击次数)
Apache 服务器位于 amazon EC2 上的 elb 后面,所以我必须检查 X-Forwarded-For,在下面的配置中“SetEnvIf CLIENTIP“192.168.1.0/24”block”不起作用,看起来它需要 ip 地址而不是 cidr,有什么方法可以阻止我拥有的数百万个 cidr 范围的命中?
SetEnvIf REMOTE_ADDR "(.+)" CLIENTIP=$1
SetEnvIf X-Forwarded-For "^([0-9.]+)" CLIENTIP=$1
SetEnvIf CLIENTIP "192.168.1.0/24" block # this doesnt work
SetEnvIf CLIENTIP "192.168.1.5" block # this works
Order allow,deny
Allow from all
Deny from env=block
答案1
这不起作用,因为Deny from env
只要指定的变量存在就会拒绝,无论其内容如何,而 SetEnvIf 只会对您提供的文本进行完全匹配。
由于您位于 ELB 后面,因此您需要使用类似方法mod_rpaf
来提取实际 IP 地址,以便 Apache 可以直接使用它。然后,您只需在Deny
指令中使用 CIDR 范围即可。