Apache的httpd:我怎么能从所有拒绝,允许从子网,但拒绝从该子网内的IP?

我使用Apache httpd-2.2.3运行CentOS 5.5。

我在位置/服务器状态启用了mod_status 。 我想以下面的方式允许访问这个单一的位置:

  1. 全部否认
  2. 允许从子网192.168.16.0/24
  3. 拒绝来自192.168.16.0/24子网内的IP 192.168.16.100。

1和2很容易。 但是,由于我“允许从192.168.16.0/24”,是否有可能拒绝从192.168.16.100?

我试图添加192.168.16.100拒绝语句,但它不起作用。 这里是相关的configuration:

<Location /server-status> SetHandler server-status Order Allow,Deny Deny from all Deny from 192.168.16.100 # This does not deny access from 192.168.16.100 Allow from 192.168.16.0/24 </Location> 

要么:

 <Location /server-status> SetHandler server-status Order Allow,Deny Deny from all Deny from 192.168.16.100 # This does not deny access from 192.168.16.100 Allow from 192.168.16.0/24 </Location> 

但是,这不会阻止访问此特定页面,如Access日志中所示:

 www.example.org 192.168.16.100 - - [11/Mar/2011:16:01:14 -0800] "GET /server-status HTTP/1.1" 200 9966 "-" " 

根据mod_authz_host的手册:

允许否认

首先,评估所有Allow指令; 至less一个必须匹配,否则请求被拒绝。 接下来,所有Deny指令都被评估。 如果有任何匹配,请求被拒绝

IP地址与Deny指令相匹配,所以请求不应该被拒绝?

根据mod_authz_host页面上的表格,该IP地址应该“匹配允许和拒绝”,因此应该应用“最终匹配控制:拒绝”规则。

    匹配允许,拒绝结果拒绝,允许结果
    匹配仅允许允许请求请求
    只匹配拒绝请求拒绝请求被拒绝
    不匹配默认第二个指令:拒绝默认第二个指令:允许
    匹配允许和拒绝最终匹配控件:拒绝最终匹配控件:允许

我还没有testing过,但是我觉得你已经快到了。

 <Location /server-status> SetHandler server-status Order Allow,Deny Deny from 192.168.16.100 Allow from 192.168.16.0/24 </Location> 

Deny from all是不需要的。 事实上,它会搞砸了,因为一切都会匹配all东西,从而被拒绝(我认为阿帕奇正在努力变得聪明,做一些愚蠢的事情)。 我总是发现Apache的OrderAllowDeny指令令人困惑,所以总是把事情想象成表格(从文档中获取 ):

匹配| 允许,拒绝结果| 拒绝,允许结果
 -------------------------------------------------- -----
只允许| 允许| 允许
只拒绝| 被拒绝| 被拒绝
不匹配| 默认:拒绝| 默认值:允许
匹配| | 最终匹配:拒绝| 最终匹配:允许

通过以上设置:

  • 来自192.168.16.100的请求得到“匹配两者”并因此被拒绝。
  • 来自192.168.16.12的请求获得“仅允许”,因此被允许。
  • 来自123.123.123.123的请求得到“不匹配”,因此被拒绝。

我可能会考虑添加IPTables规则来拒绝80端口上的单个主机,拒绝所有主机,并允许子网。

在允许子网之后,从特定地址设置拒绝规则应该没有问题。 只要按照这个顺序

你可以使用PHP? 如果是这样,添加一个PHP语句退出/redirect该特定的IP地址

例:

$ deny = array(“111.111.111”,“222.222.222”,“333.333.333”);

if(in_array($ _SERVER ['REMOTE_ADDR'],$ deny))

{header(“location: http : //www.google.com/ ”);

出口();

参考: http : //perishablepress.com/press/2007/07/03/how-to-block-ip-addresses-with-php/