Apache 2:SetEnvIf“IP 范围”

Apache 2:SetEnvIf“IP 范围”

在我的 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 设置的变量在某些操作中不可见(参见矩阵):

http://www.onlinesmartketer.com/2010/05/27/apache-environment-variables-visibility-with-setenv-setenvif-and-rewriterule-directives/

你的解决方案是

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 范围转换为匹配的正则表达式。对你们中的一些人可能也有用...

如何排除来自某个 IP 地址范围的流量?

[更新]

看起来 Google 已经删除了 IP 地址工具(或者至少他们网站上的链接已损坏),但这里有一个类似的工具: http://www.analyticsmarket.com/freetools/ipregex

相关内容