Apache httpd:我如何才能拒绝所有内容、允许子网内容但拒绝该子网内的 IP 内容?

Apache httpd:我如何才能拒绝所有内容、允许子网内容但拒绝该子网内的 IP 内容?

我正在运行带有原装 Apache httpd-2.2.3 的 CentOS 5.5。

我已经启用mod_status在位置 /server-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 添加 Deny 语句,但不起作用。以下是相关配置:

<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>

但是,这并不妨碍访问该特定页面,如访问日志中所示:

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 指令;至少有一个必须匹配,否则请求将被拒绝。接下来,评估所有 Deny 指令。如果有任何匹配,则请求将被拒绝

该 IP 地址与 Deny 指令匹配,那么不应该拒绝该请求吗?

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

    匹配 允许、拒绝结果 拒绝、允许结果
    匹配 仅允许 请求允许 请求允许
    匹配 仅拒绝 请求被拒绝 请求被拒绝
    无匹配 默认为第二条指令:拒绝 默认为第二条指令:允许
    匹配允许和拒绝 最终匹配控制:拒绝 最终匹配控制:允许

答案1

我还没有测试过,但我认为你已经快完成了。

<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 正在试图变得聪明,做一些愚蠢的事情)。我一直觉得 Apache 的OrderAllowDeny指令令人困惑,所以总是在表格中可视化事物(取自文档):

匹配 | 允许、拒绝结果 | 拒绝、允许结果
-------------------------------------------------------
仅允许 | 允许 | 允许
仅拒绝 | 已拒绝 | 已拒绝
无匹配 | 默认:拒绝 | 默认:允许
双方匹配 | 最终匹配:拒绝 | 最终匹配:允许

使用上述设置:

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

答案2

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

允许子网后,设置来自特定地址的拒绝规则应该没有问题。只需按顺序进行即可。

答案3

您可以使用 php 吗?如果可以,请添加一个 php 语句以退出/重定向该特定 IP 地址

例子:

$deny = 数组("111.111.111", "222.222.222", "333.333.333");

如果 (in_array ($_SERVER['REMOTE_ADDR'], $deny))

{ 标题(“位置:http://www.google.com/");

出口();

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

相关内容