在我的Apacheconfiguration中,如果我看到访问者来自特定的IP范围,我想设置一个环境variables。 目前我这样做:
SetEnvIfNoCase Remote_Addr "^194\.8\.7[45]\." banned=spammer-ip SetEnvIfNoCase Remote_Addr "^212\.156\.170\." banned=spammer-ip
我更喜欢的是这样的:
SetEnvIfIpRange 194.8.74.0/23 banned=spammer-ip SetEnvIfIpRange 212.156.170.0/24 banned=spammer-ip
…因为我认为把一个IP地址转换成一个string,然后做一个正则expression式是完全浪费资源。
我可以做一个
Deny From 194.8.74.0/23
…但后来我没有得到一个variables,我可以检查我的403错误页面 – find访问被拒绝的原因。
任何build议,我可能会错过? 有没有可以根据“IP地址范围”设置环境variables的Apache2 MOD?
(SetEnvIfNoCase Remote_Addr“^ abc”env_key = env_value)是你最容易做到的。 我已经看到这个configuration样式在一个重负载的机器集群上实现,没有任何明显的性能下降。 我同意使用正则expression式,当CIDR范围更合适时是烦人的。 您可以编写一个小程序,从CIDR范围列表中自动生成configuration。
如果您熟悉Perl,则可以创build一个modperl处理程序,以任何方式允许/拒绝请求。 modperl允许你的代码在HTTP请求中的不同点运行–mod_perl 2.0 HTTP请求循环阶段 。 PerlAuthzHandler将是适当的处理程序使用。
Lockie
您可以使用Apache 2.4的CIDR格式,它允许<If> :
<If "%{REMOTE_ADDR} -ipmatch 194.8.74.0/23"> SetEnv banned = spammer-ip </If>
请注意,通过SetEnv设置的variables在某些操作中不可见(请参阅matrix):
你的解决scheme是
SetEnvIfExpr "-R '10.0.0.0/8' || -R '172.16.0.0/12' || -R '192.168.0.0/16'" rfc1918
请参阅https://httpd.apache.org/docs/trunk/mod/mod_setenvif.html#SetEnvIfExpr
这不是真正的从RegExp到IP范围的解决scheme,但是我发现了一个由Google托pipe的很好的脚本,用于将IP范围转换为匹配的正则expression式。 也可以用于你们中的一些人…
如何从一系列IP地址中排除stream量?
[更新]
看起来好像谷歌已经删除了IP地址工具(或者至less他们网站上的链接被破坏了),但是这里有一个类似的工具: http : //www.analyticsmarket.com/freetools/ipregex