Apache 2:SetEnvIf“IP 范围”

Bla*_*laM 10 ip environment-variables apache-2.2

在我的 Apache 配置中,如果我看到访问者来自特定的 IP 范围,我想设置一个环境变量。目前我这样做:

SetEnvIfNoCase Remote_Addr "^194\.8\.7[45]\." banned=spammer-ip
SetEnvIfNoCase Remote_Addr "^212\.156\.170\." banned=spammer-ip
Run Code Online (Sandbox Code Playgroud)

我更喜欢的是这样的:

SetEnvIfIpRange 194.8.74.0/23 banned=spammer-ip
SetEnvIfIpRange 212.156.170.0/24 banned=spammer-ip
Run Code Online (Sandbox Code Playgroud)

...因为我认为将IP地址转换为字符串然后执行正则表达式完全浪费资源。

我可以做一个

Deny From 194.8.74.0/23
Run Code Online (Sandbox Code Playgroud)

...但后来我没有得到一个可以在我的 403 错误页面中检查的变量 - 找出访问被拒绝的原因。

有什么建议我可能会错过吗?是否有可以根据“IP 地址范围”设置环境变量的 Apache2 MOD?

Gre*_*reg 8

您可以在 Apache 2.4 中使用 CIDR 格式,它允许<If>

<If "%{REMOTE_ADDR} -ipmatch 194.8.74.0/23">
    SetEnv banned = spammer-ip
</If>
Run Code Online (Sandbox Code Playgroud)


小智 8

请注意,通过 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
Run Code Online (Sandbox Code Playgroud)

https://httpd.apache.org/docs/trunk/mod/mod_setenvif.html#SetEnvIfExpr


小智 3

您所拥有的 (SetEnvIfNoCase Remote_Addr "^abc" env_key=env_value) 是您可以轻松做到的最好的。我见过这种配置风格在负载很重的机器集群上实现,没有任何明显的性能下降。我同意使用正则表达式,当 CIDR 范围更合适时会很烦人。您可以编写一个小程序来自动从 CIDR 范围列表生成配置。

如果您熟悉 Perl,则可以创建一个 modperl 处理程序,它将以您选择的任何方式允许/拒绝请求。modperl 允许您的代码在整个 HTTP 请求的不同点运行 - mod_perl 2.0 HTTP 请求周期阶段。PerlAuthzHandler 将是合适的处理程序。

洛克