在我的 Apache 配置中,如果我发现访问者来自特定 IP 范围,我想设置一个环境变量。目前我这样做:
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 地址转换为字符串然后执行正则表达式完全是浪费资源。
我可以做一个
Deny From 194.8.74.0/23
...但是我没有得到可以在 403 错误页面中检查的变量 - 以查找访问被拒绝的原因。
有什么建议我可能会错过吗?是否有可以根据“IP 地址范围”设置环境变量的 Apache2 MOD?
答案1
您得到的 (SetEnvIfNoCase Remote_Addr "^abc" env_key=env_value) 是您能轻松做到的最好的。我见过这种配置样式在负载很重的机器集群上实现,没有任何明显的性能下降。我同意,当 CIDR 范围更合适时使用正则表达式很烦人。您可以编写一个小程序来自动从 CIDR 范围列表中生成配置。
如果您熟悉 Perl,则可以创建一个 modperl 处理程序,它可以按照您选择的方式允许/拒绝请求。modperl 允许您的代码在整个 HTTP 请求的不同点运行 -mod_perl 2.0 HTTP 请求周期阶段。PerlAuthzHandler 将是合适的处理程序。
洛基
答案2
您可以在 Apache 2.4 中使用 CIDR 格式,它允许<If>
:
<If "%{REMOTE_ADDR} -ipmatch 194.8.74.0/23">
SetEnv banned = spammer-ip
</If>
答案3
请注意,通过 SetEnv 设置的变量在某些操作中不可见(参见矩阵):
你的解决方案是
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
答案4
这实际上不是一个解决方案正则表达式到IP 范围,但我在 Google 上找到了一个不错的脚本,可以将 IP 范围转换为匹配的正则表达式。对你们中的一些人可能也有用...
[更新]
看起来 Google 已经删除了 IP 地址工具(或者至少他们网站上的链接已损坏),但这里有一个类似的工具: http://www.analyticsmarket.com/freetools/ipregex